Websocket e SSE (Server Sent Events) sono entrambi in grado di inviare dati ai browser, tuttavia non sono tecnologie concorrenti.
Le connessioni WebSocket possono sia inviare dati al browser sia ricevere dati dal browser. Un buon esempio di un'applicazione che potrebbe utilizzare websocket è un'applicazione di chat.
Le connessioni SSE possono solo inviare dati al browser. Le quotazioni di borsa online o la cronologia dei feed o i feed di Twitter sono buoni esempi di un'applicazione che potrebbe beneficiare di SSE.
In pratica poiché tutto ciò che può essere fatto con SSE può essere fatto anche con Websocket, Websocket sta ricevendo molta più attenzione e amore e molti più browser supportano Websocket rispetto a SSE.
Tuttavia, può essere eccessivo per alcuni tipi di applicazione e il back-end potrebbe essere più semplice da implementare con un protocollo come SSE.
Inoltre SSE può essere riempito con il polyfill nei browser più vecchi che non lo supportano in modo nativo usando solo JavaScript. Alcune implementazioni dei polyfill SSE sono disponibili nella pagina github di Modernizr .
Trabocchetti:
- SSE soffre di una limitazione al numero massimo di connessioni aperte, che può essere particolarmente doloroso quando si aprono varie schede poiché il limite è per browser e impostato su un numero molto basso (6). Il problema è stato contrassegnato come "Non risolto" in Chrome e Firefox . Questo limite è per browser + dominio, quindi ciò significa che puoi aprire 6 connessioni SSE su tutte le schede
www.example1.com
e altre 6 connessioni SSE www.example2.com
(grazie a Phate).
- Solo WS può trasmettere sia dati binari che UTF-8, SSE è limitato a UTF-8. (Grazie a Chado Nihi).
- Alcuni firewall aziendali con ispezione dei pacchetti hanno difficoltà a gestire WebSocket (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
HTML5Rocks ha alcune buone informazioni su SSE. Da quella pagina:
Eventi inviati dal server vs. WebSocket
Perché dovresti scegliere Server-Sent Events over WebSocket? Buona domanda.
Uno dei motivi per cui gli SSE sono stati tenuti all'ombra è perché le API successive come WebSocket forniscono un protocollo più ricco per eseguire comunicazioni bidirezionali e full duplex. Avere un canale a due vie è più attraente per cose come giochi, app di messaggistica e per i casi in cui hai bisogno di aggiornamenti quasi in tempo reale in entrambe le direzioni. Tuttavia, in alcuni scenari i dati non devono essere inviati dal client. Hai semplicemente bisogno di aggiornamenti da alcune azioni del server. Alcuni esempi potrebbero essere gli aggiornamenti dello stato degli amici, i ticker delle azioni, i feed di notizie o altri meccanismi automatici di push dei dati (ad esempio l'aggiornamento di un database SQL Web sul lato client o un archivio oggetti IndexedDB). Se devi inviare dati a un server, XMLHttpRequest è sempre un amico.
Gli SSE vengono inviati tramite HTTP tradizionale. Ciò significa che non richiedono un protocollo speciale o un'implementazione del server per funzionare. D'altra parte, i WebSocket richiedono connessioni full duplex e nuovi server Web Socket per gestire il protocollo. Inoltre, gli Eventi Server-Sent hanno una varietà di funzionalità che WebSocket manca in base alla progettazione, come la riconnessione automatica, gli ID evento e la possibilità di inviare eventi arbitrari.
Riepilogo TLDR:
Vantaggi di SSE rispetto ai websocket:
- Trasportato su HTTP semplice anziché su un protocollo personalizzato
- Può essere poli-riempito con javascript per "backport" SSE su browser che non lo supportano ancora.
- Supporto integrato per ricollegamento e ID evento
- Protocollo più semplice
- Nessun problema con i firewall aziendali che effettuano l'ispezione dei pacchetti
Vantaggi di Websocket su SSE:
- Tempo reale, comunicazione bidirezionale.
- Supporto nativo in più browser
Casi d'uso ideali di SSE:
- Streaming ticker stock
- aggiornamento feed Twitter
- Notifiche al browser
Gotcha SSE:
- Nessun supporto binario
- Limite massimo di connessioni aperte