Websockets y SSE (Server Sent Events) son capaces de enviar datos a los navegadores, sin embargo, no son tecnologías competidoras.
Las conexiones de Websockets pueden enviar datos al navegador y recibir datos del navegador. Un buen ejemplo de una aplicación que podría usar websockets es una aplicación de chat.
Las conexiones SSE solo pueden enviar datos al navegador. Las cotizaciones de acciones en línea o los twitters que actualizan la línea de tiempo o el feed son buenos ejemplos de una aplicación que podría beneficiarse de SSE.
En la práctica, dado que todo lo que se puede hacer con SSE también se puede hacer con Websockets, Websockets está recibiendo mucha más atención y amor, y muchos más navegadores admiten Websockets que SSE.
Sin embargo, puede ser excesivo para algunos tipos de aplicaciones, y el backend podría ser más fácil de implementar con un protocolo como SSE.
Además, SSE se puede rellenar en navegadores más antiguos que no lo admiten de forma nativa utilizando solo JavaScript. Algunas implementaciones de polyfills SSE se pueden encontrar en la página de github Modernizr .
Gotchas:
- SSE adolece de una limitación en el número máximo de conexiones abiertas, lo que puede ser especialmente doloroso al abrir varias pestañas, ya que el límite es por navegador y se establece en un número muy bajo (6). El problema se ha marcado como "No se solucionará" en Chrome y Firefox . Este límite es por navegador + dominio, lo que significa que puede abrir 6 conexiones SSE en todas las pestañas
www.example1.com
y otras 6 conexiones SSE www.example2.com
(gracias Phate).
- Solo WS puede transmitir datos binarios y UTF-8, SSE está limitado a UTF-8. (Gracias a Chado Nihi).
- Algunos firewalls empresariales con inspección de paquetes tienen problemas para manejar WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
HTML5Rocks tiene buena información sobre SSE. De esa página:
Eventos enviados por el servidor frente a WebSockets
¿Por qué elegiría Eventos enviados por el servidor en lugar de WebSockets? Buena pregunta.
Una razón por la que los SSE se han mantenido en la sombra es porque las API posteriores, como WebSockets, proporcionan un protocolo más rico para realizar comunicaciones bidireccionales y dúplex completo. Tener un canal bidireccional es más atractivo para cosas como juegos, aplicaciones de mensajería y para casos en los que necesita actualizaciones casi en tiempo real en ambas direcciones. Sin embargo, en algunos escenarios los datos no necesitan ser enviados desde el cliente. Simplemente necesita actualizaciones de alguna acción del servidor. Algunos ejemplos serían actualizaciones de estado de amigos, cotizaciones de bolsa, fuentes de noticias u otros mecanismos automáticos de envío de datos (por ejemplo, actualizar una base de datos Web SQL del lado del cliente o un almacén de objetos IndexedDB). Si necesita enviar datos a un servidor, XMLHttpRequest siempre es un amigo.
Los SSE se envían a través de HTTP tradicional. Eso significa que no requieren un protocolo especial o implementación de servidor para funcionar. WebSockets, por otro lado, requiere conexiones full-duplex y nuevos servidores Web Socket para manejar el protocolo. Además, los eventos enviados por el servidor tienen una variedad de características de las que carece WebSockets por diseño, como la reconexión automática, los identificadores de eventos y la capacidad de enviar eventos arbitrarios.
Resumen de TLDR:
Ventajas de SSE sobre Websockets:
- Transportado a través de HTTP simple en lugar de un protocolo personalizado
- Se puede rellenar con javascript para "respaldar" SSE a los navegadores que aún no lo admiten.
- Soporte integrado para reconexión e id. De evento
- Protocolo más simple
- No hay problemas con los firewalls corporativos que realizan la inspección de paquetes
Ventajas de Websockets sobre SSE:
- Tiempo real, comunicación bidireccional.
- Soporte nativo en más navegadores.
Casos de uso ideales de SSE:
- Transmisión de ticker de stock
- actualización de feed de twitter
- Notificaciones al navegador
SSE gotchas:
- Sin soporte binario
- Límite máximo de conexiones abiertas