WebSockets frente a eventos enviados por el servidor/EventSource [cerrado]

Resuelto Mads Mobæk asked hace 13 años • 8 respuestas

Tanto WebSockets como Server-Sent Events son capaces de enviar datos a los navegadores. A mí me parecen tecnologías competidoras. ¿Cuál es la diferencia entre ellos? ¿Cuándo elegirías uno sobre el otro?

Mads Mobæk avatar Mar 04 '11 22:03 Mads Mobæk
Aceptado

Websockets y SSE (Server Sent Events) son capaces de enviar datos a los navegadores, sin embargo, no son tecnologías competidoras.

Las conexiones Websockets pueden enviar datos al navegador y recibir datos del navegador. Un buen ejemplo de una aplicación que podría utilizar 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 tweets que actualizan la línea de tiempo o el feed son buenos ejemplos de una aplicación que podría beneficiarse de la ESS.

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 resultar 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 integrar en navegadores más antiguos que no lo admiten de forma nativa utilizando solo JavaScript. Algunas implementaciones de SSE polyfills se pueden encontrar en la página de Modernizr github .

Problemas:

  • SSE sufre una limitación en el número máximo de conexiones abiertas, lo que puede resultar especialmente doloroso al abrir varias pestañas, ya que el límite es por navegador y está establecido 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.comy otras 6 conexiones SSE www.example2.com(gracias Phate).
  • Sólo 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 lidiar con 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ías Server-Sent Events en lugar de WebSockets? Buena pregunta.

Una de las razones por las que los SSE se han mantenido en la sombra es porque las API posteriores, como WebSockets, proporcionan un protocolo más rico para realizar comunicación bidireccional full-duplex. 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 no es necesario enviar datos desde el cliente. Simplemente necesita actualizaciones de alguna acción del servidor. Algunos ejemplos serían las actualizaciones de estado de amigos, cotizaciones bursátiles, fuentes de noticias u otros mecanismos automatizados de envío de datos (por ejemplo, actualización de 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 una implementación de servidor para comenzar a funcionar. Los WebSockets, por otro lado, requieren 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 los WebSockets carecen por diseño, como la reconexión automática, ID 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 "reportar" SSE a navegadores que aún no lo admiten.
  • Soporte integrado para reconexión e identificación de eventos
  • Protocolo más simple
  • No hay problemas con los firewalls corporativos que realizan la inspección de paquetes

Ventajas de Websockets sobre SSE:

  • Comunicación bidireccional en tiempo real.
  • Soporte nativo en más navegadores

Casos de uso ideales de ESS:

  • Transmisión de cotizaciones bursátiles
  • actualización del feed de twitter
  • Notificaciones al navegador

Errores de la ESS:

  • Sin soporte binario
  • Límite máximo de conexiones abiertas
Alex Recarey avatar Mar 16 '2011 13:03 Alex Recarey

Según caniuse.com:

  • El 98,35% de los usuarios globales admiten WebSockets de forma nativa
  • El 98,03% de los usuarios globales admiten de forma nativa eventos enviados por el servidor

Puede utilizar un polyfill exclusivo de cliente para ampliar la compatibilidad con SSE a muchos otros navegadores. Esto es menos probable con WebSockets. Algunos polirellenos de EventSource:

  • EventSource de Remy Sharp sin otras dependencias de biblioteca (IE7+)
  • jQuery.EventSource por Rick Waldron
  • EventSource de Yaffle (reemplaza la implementación nativa y normaliza el comportamiento en todos los navegadores)

Si necesita admitir todos los navegadores, considere usar una biblioteca como web-socket-js , SignalR o socket.io que admita múltiples transportes como WebSockets, SSE, Forever Frame y sondeo largo AJAX. Estos a menudo también requieren modificaciones en el lado del servidor.

Obtenga más información sobre la ESS en:

  • Artículo sobre HTML5 Rocks
  • La especificación W3C ( versión publicada , borrador del editor )

Obtenga más información sobre WebSockets en:

  • Artículo sobre HTML5 Rocks
  • La especificación W3C ( versión publicada , borrador del editor )

Otras diferencias:

  • WebSockets admite datos binarios arbitrarios, SSE solo usa UTF-8
Drew Noakes avatar Jan 23 '2014 11:01 Drew Noakes