Server-Sent Events en Go: Aplicaciones web reactivas sin WebSocket

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Server-Sent Events en Go: Cuando WebSocket es demasiado



Imagine: está escribiendo un panel de monitoreo para servidores. Los datos se actualizan cada 5 segundos. El cliente debe recibir notificaciones sobre caídas de carga. ¿Qué elegiría? ¿WebSocket? ¿Long Polling? ¿Y si le digo que existe una tecnología que funciona sobre HTTP normal, no requiere bibliotecas adicionales en el cliente y es perfecta para la transmisión unidireccional de datos?



Conozca — Server-Sent Events (SSE). Es un protocolo integrado en HTML5 que permite al servidor enviar datos al cliente en tiempo real a través de una única conexión HTTP. A diferencia de WebSocket, SSE solo funciona en una dirección — del servidor al cliente. Pero esto es precisamente lo que lo hace ideal para notificaciones, registros, cotizaciones de acciones y cualquier tarea donde el servidor sea la fuente de datos y el cliente un oyente pasivo.



En este artículo, analizaremos cómo implementar Server-Sent Events en Go. Aprenderá cómo crear un streaming simple, cómo transmitir eventos personalizados y cómo manejar desconexiones de clientes. ¡Vamos allá!



¿Por qué Go + SSE es poderoso?



Go es un lenguaje creado para aplicaciones de red. Sus gorutinas y canales encajan perfectamente con el modelo SSE: cada conexión es una gorutina separada, y los canales garantizan una transmisión segura de datos. Además, Go es un lenguaje compilado con un rendimiento excelente. Puede mantener decenas de miles de conexiones SSE abiertas sin un gran consumo de memoria.



La ventaja clave de SSE sobre WebSocket es la simplicidad. En el cliente se utiliza la API EventSource estándar, que funciona en todos los navegadores modernos. Sin bibliotecas adicionales, sin frameworks. La parte del servidor es un manejador HTTP normal con los encabezados correctos.



¿Cuándo usar SSE?

  • Transmisión unidireccional — el servidor envía datos, el cliente solo recibe.
  • Notificaciones y alertas — sistema de monitoreo, notificaciones push.
  • Streaming de datos — registros, cotizaciones, tweets, noticias.
  • Reconexión automática — el navegador restablece la conexión por sí mismo en caso de interrupción.


Fundamentos del protocolo Server-Sent Events



Antes de escribir código, entendamos cómo funciona SSE a nivel HTTP. Cuando el cliente abre una conexión, el servidor envía encabezados especiales:



Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-alive


Después de esto, el servidor envía datos en el formato:



data: Mensaje



Cada mensaje está separado por dos saltos de línea. Se pueden enviar varios campos:



event: userlogindata: {"username": "alice"}



El campo event define el tipo de evento, y data su contenido (generalmente JSON). También existen los campos id (identificador del último evento) y retry (tiempo de reconexión en milisegundos).



Escribiendo un servidor SSE en Go



Empecemos con lo más simple: un servidor que envía la hora actual cada segundo. Cree un archivo main.go:



package main

import ( "fmt" "net/http" "time")

func main() { http.HandleFunc("/events", sseHandler) http.ListenAndServe(":8080", nil)}

func sseHandler(w http.ResponseWriter, r *http.Request) { // Establecemos los encabezados para SSE w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive")

// Creamos un flusher para el envío inmediato de datos flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported", http.StatusInternalServerError) return }

// Bucle infinito de envío de eventos for { select { case <-r.Con

Blogs

Book Recommendations