Websockets e SSE (Server Sent Events) são capazes de enviar dados para navegadores, no entanto, não são tecnologias concorrentes.
As conexões dos Websockets podem enviar dados para o navegador e receber dados do navegador. Um bom exemplo de um aplicativo que poderia usar websockets é um aplicativo de bate-papo.
As conexões SSE podem enviar dados apenas ao navegador. Cotações de ações on-line ou twitters que atualizam a linha do tempo ou o feed são bons exemplos de aplicativos que podem se beneficiar do SSE.
Na prática, já que tudo o que pode ser feito com o SSE também pode ser feito com Websockets, o Websockets está recebendo muito mais atenção e amor, e muitos mais navegadores suportam Websockets que o SSE.
No entanto, pode ser um exagero para alguns tipos de aplicativos, e o back-end pode ser mais fácil de implementar com um protocolo como o SSE.
Além disso, o SSE pode ser polyfilled em navegadores mais antigos que não o suportam nativamente usando apenas JavaScript. Algumas implementações de polyfills SSE podem ser encontradas na página Modernizr github .
Pegadinhas:
- O SSE sofre uma limitação ao número máximo de conexões abertas, o que pode ser especialmente doloroso ao abrir várias guias, pois o limite é por navegador e definido como um número muito baixo (6). O problema foi marcado como "Não será corrigido" no Chrome e Firefox . Esse limite é por navegador + domínio, o que significa que você pode abrir 6 conexões SSE em todas as guias
www.example1.com
e outras 6 conexões SSE www.example2.com
(obrigado Phate).
- Somente o WS pode transmitir dados binários e UTF-8, o SSE é limitado a UTF-8. (Obrigado a Chado Nihi).
- Alguns firewalls corporativos com inspeção de pacotes têm problemas para lidar com WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
O HTML5Rocks tem boas informações sobre SSE. A partir dessa página:
Eventos enviados pelo servidor x WebSockets
Por que você escolheria Eventos enviados pelo servidor em vez de WebSockets? Boa pergunta.
Um motivo pelo qual as SSEs foram mantidas à sombra é que APIs posteriores, como o WebSockets, fornecem um protocolo mais rico para executar a comunicação bidirecional e full-duplex. Ter um canal de mão dupla é mais atraente para coisas como jogos, aplicativos de mensagens e para os casos em que você precisa de atualizações quase em tempo real nas duas direções. No entanto, em alguns cenários, os dados não precisam ser enviados pelo cliente. Você simplesmente precisa de atualizações de alguma ação do servidor. Alguns exemplos seriam atualizações de status de amigos, cotações de ações, feeds de notícias ou outros mecanismos automatizados de envio de dados (por exemplo, atualização de um banco de dados SQL da Web do cliente ou armazenamento de objetos IndexedDB). Se você precisar enviar dados para um servidor, o XMLHttpRequest é sempre um amigo.
SSEs são enviados pelo HTTP tradicional. Isso significa que eles não precisam de um protocolo ou implementação de servidor especial para funcionar. Os WebSockets, por outro lado, exigem conexões full-duplex e novos servidores Web Socket para manipular o protocolo. Além disso, os Eventos enviados pelo servidor têm vários recursos que os WebSockets não possuem por design, como reconexão automática, IDs de eventos e a capacidade de enviar eventos arbitrários.
Resumo do TLDR:
Vantagens do SSE sobre Websockets:
- Transportado por HTTP simples em vez de por um protocolo personalizado
- Pode ser preenchido com javascript para "backport" SSE para navegadores que ainda não o suportam.
- Suporte integrado para re-conexão e identificação de evento
- Protocolo mais simples
- Sem problemas com firewalls corporativos que realizam inspeção de pacotes
Vantagens dos Websockets sobre SSE:
- Em tempo real, duas comunicações direcionais.
- Suporte nativo em mais navegadores
Casos de uso ideais do SSE:
- Transmissão de ações
- atualização do feed do twitter
- Notificações para o navegador
Dicas do SSE:
- Sem suporte binário
- Limite máximo de conexões abertas