Entendiendo SSE (Server-Sent Events) y sus beneficios

February 1, 2024

Technology

Introducción

SSE (Server-Sent Events) es un protocolo de comunicación unidireccional entre clientes y servidores basado en el protocolo HTTP. Permite que los servidores envíen datos a los clientes en tiempo real utilizando flujos de eventos sin necesidad de solicitudes explícitas por parte de los clientes. Construido sobre el protocolo HTTP estándar, SSE utiliza conexiones persistentes unidireccionales, lo que permite a los servidores enviar activamente eventos y datos a los clientes.

Server-Sent Events

En esencia, se implementa utilizando un enfoque de transmisión en flujo, donde el cliente inicia una solicitud de conexión al servidor y mantiene la conexión abierta. Luego, el servidor envía mensajes activamente al cliente. Los datos enviados desde el servidor al cliente utilizando Server-Sent Events (SSE) deben estar codificados en UTF-8, y el tipo de contenido devuelto es text/event-stream. Por ejemplo, cuando usas ChatGPT, al hacerle una pregunta, verás que muestra la respuesta palabra por palabra. En realidad, ChatGPT 'empuja' proactivamente los datos precalculados hacia ti, utilizando tecnología SSE para devolver datos mientras realiza cálculos, evitando así largos tiempos de espera en la interfaz que podrían llevar al cierre directo de la página.

Ejemplo de server-sent events

Beneficios de SSE

  1. Comunicación en Tiempo Real: SSE ofrece un mecanismo de comunicación en tiempo real, permitiendo que los servidores envíen datos a los clientes de manera activa. Esta capacidad en tiempo real hace que SSE sea especialmente adecuado para aplicaciones que requieren actualizaciones inmediatas, como chat en tiempo real, herramientas de colaboración en línea, visualización de datos en tiempo real y entrega de notificaciones.

  2. Reducción de la Carga de la Red: En comparación con los métodos tradicionales de sondeo, SSE utiliza conexiones de larga duración. A través de una única conexión HTTP, los servidores pueden enviar múltiples eventos a los clientes, evitando solicitudes HTTP frecuentes y reduciendo la carga de la red.

  3. Ligero: SSE está basado en el protocolo HTTP, es compatible con el software de servidor existente y es más simple de usar en comparación con WebSocket.

  4. Reconexión Automática: SSE puede intentar reconectarse automáticamente después de una interrupción de la conexión sin necesidad de código adicional. Este mecanismo de reconexión automática mejora la estabilidad del sistema, asegurando una comunicación continua incluso en condiciones de red inestables.

Proxy de Servicios SSE utilizando API7 Enterprise

En aplicaciones prácticas, aprovechar una puerta de enlace API para hacer proxy de servicios SSE contribuye a mejorar la estabilidad del servicio, resolver problemas de seguridad y de origen cruzado, y es adecuado para manejar escenarios de aplicaciones complejas. NGINX, como uno de los servidores proxy inversos más populares, tiene una cuota de mercado considerable.

Al hacer proxy de servicios SSE en NGINX, es necesario desactivar proxy_buffering. Sin embargo, esta configuración debe cerrarse al menos a nivel de ubicación, lo que implica que si hay múltiples ubicaciones en el sistema y solo unas pocas necesitan desactivar el almacenamiento en caché para admitir servicios SSE, podría afectar el rendimiento de otras API no SSE. Además, la configuración de proxy_buffering de NGINX carece de flexibilidad, ya que no se puede habilitar o deshabilitar dinámicamente en tiempo de ejecución, requiriendo una recarga de la configuración para que surta efecto, lo que podría llevar a una interrupción del servicio.

API7 Enterprise proporciona el plugin proxy-buffering, permitiéndote hacer proxy de servicios SSE ascendentes de manera más flexible. Al habilitar este plugin en las rutas correspondientes, puedes controlar fácilmente el almacenamiento en caché sin necesidad de recargar toda la configuración. Esta flexibilidad cumple con los requisitos de proxy de servicios SSE mientras aborda las necesidades de rendimiento y configuración dinámica.

Plugin SSE de API7 Enterprise

Las pruebas a continuación confirman el éxito del proxy de servicios SSE.

curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream"

event: server
data: 27d365b177ae
id: 1

event: request
data: GET /.sse HTTP/1.1
data:
data: Host: 127.0.0.1:9080
data: Accept: text/event-stream
data: User-Agent: curl/8.1.2
data: X-Forwarded-For: 192.168.65.1
data: X-Forwarded-Host: 127.0.0.1
data: X-Forwarded-Port: 9080
data: X-Forwarded-Proto: http
data: X-Real-Ip: 192.168.65.1
data:
id: 2

event: time
data: 2024-01-29T04:04:20Z
id: 3

event: time
data: 2024-01-29T04:04:21Z
id: 4
...

Conclusión

En resumen, SSE es adecuado para escenarios que requieren comunicación y actualizaciones en tiempo real, proporcionando un medio simple y efectivo para lograrlo. Sin embargo, es importante tener en cuenta que SSE es un canal unidireccional, permitiendo solo que los servidores envíen mensajes a los clientes. Por lo tanto, SSE puede no ser adecuado para todos los tipos de necesidades de comunicación en tiempo real. Para escenarios de comunicación bidireccional más complejos, WebSocket u otras tecnologías pueden ser más apropiadas.

Tags: