Server-Sent Events (SSE) es una API web que permite a un cliente recibir actualizaciones automáticas de un servidor a través de una conexión HTTP. A diferencia de WebSockets, SSE es unidireccional, lo que significa que el servidor puede enviar datos al cliente, pero el cliente no puede enviar datos de vuelta al servidor a través de la misma conexión SSE. Utiliza el tipo de contenido `text/event-stream` y mantiene una conexión HTTP de larga duración, donde el servidor envía eventos como una serie de mensajes de texto formateados. La conexión se reestablece automáticamente si se interrumpe, lo que simplifica la gestión de la reconexión en el cliente. Cada evento puede incluir un `id`, `event` (tipo de evento), y `data` (el payload del mensaje).
En el mundo real, SSE se utiliza en escenarios donde las actualizaciones en tiempo real del servidor al cliente son cruciales y la comunicación bidireccional completa de WebSockets es innecesaria o excesiva. Ejemplos concretos incluyen la transmisión de feeds de noticias en vivo, actualizaciones de precios de acciones, notificaciones de sistemas, progreso de tareas de larga duración (ej. codificación de video, procesamiento de datos), o paneles de monitoreo que muestran métricas en tiempo real. Herramientas y frameworks como Nginx (con módulos de streaming), Express.js o Spring WebFlux pueden configurarse para servir SSE. Plataformas como Grafana o sistemas de monitoreo a menudo usan SSE para actualizar dashboards en tiempo real con métricas de infraestructura o aplicación.
Para un Arquitecto de Sistemas, SSE es una herramienta valiosa para implementar flujos de datos en tiempo real con menor complejidad que WebSockets cuando la unidireccionalidad es suficiente. Su principal ventaja es la simplicidad del protocolo (basado en HTTP, fácil de proxy y cachear) y la gestión automática de reconexiones por parte del navegador, reduciendo la carga de desarrollo en el cliente. Sin embargo, los trade-offs incluyen la limitación de conexiones concurrentes por dominio en algunos navegadores (aunque esto es menos problemático hoy en día) y la falta de comunicación bidireccional, lo que significa que si se requiere que el cliente envíe datos en tiempo real al servidor, se necesitará una conexión HTTP separada o considerar WebSockets. La elección entre SSE y WebSockets debe basarse en los requisitos específicos de comunicación: SSE para 'publicar' datos del servidor al cliente, WebSockets para 'chatear' bidireccionalmente.