Cuando tus Server-Sent Events no funcionan: El culpable que nunca sospechas
Hace unos días estaba implementando Server-Sent Events para una funcionalidad de streaming de productos hipotecarios en tiempo real. Todo funcionaba perfecto en desarrollo, las conexiones se establecían correctamente, los datos llegaban instantáneamente... hasta que subí a producción.
De repente, los productos llegaban con retrasos enormes, a veces en lotes gigantes después de varios minutos, y en ocasiones simplemente no llegaban. Mi primera reacción fue la típica: "¿Qué habré roto ahora?"
El debugging que no llevaba a ningún lado
Empecé por lo obvio. Revisé los logs del servidor, la configuración de headers, las conexiones de base de datos... todo parecía estar en orden. El servidor estaba enviando los eventos correctamente, pero algo los estaba interceptando en el camino.
Probé diferentes navegadores, diferentes dispositivos, incluso diferentes redes. El comportamiento era consistentemente extraño: los eventos se acumulaban y llegaban todos juntos después de largos períodos de silencio.
El momento "ajá"
Después de varias horas de frustración, se me ocurrió algo que debería haber sido obvio desde el principio: ¿qué diferencia hay entre mi entorno de desarrollo y producción? En desarrollo, todo va directo a localhost:3000. En producción, todo pasa a través de nginx y Cloudflare.
Y ahí estaba el problema.
Cloudflare: El asesino silencioso de SSE
Resulta que Cloudflare, por diseño, está optimizado para contenido estático y respuestas HTTP tradicionales. Cuando ve un stream de Server-Sent Events, sus mecanismos de optimización entran en pánico:
Buffering automático: En lugar de enviar cada evento conforme llega, Cloudflare los acumula hasta llenar cierto buffer, destruyendo completamente la naturaleza en tiempo real de SSE.
Caching inteligente: Incluso puede intentar cachear los eventos, lo que no tiene ningún sentido para datos que cambian constantemente.
Timeouts agresivos: Si la conexión permanece "inactiva" (aunque esté esperando eventos), Cloudflare puede cortarla prematuramente.
Un usuario en los foros lo describía perfectamente:
No se reciben eventos SSE en el cliente porque parecen quedar almacenados en buffer por Cloudflare. Pude probarlo haciendo que mi servidor enviara el mismo evento muchas veces en intervalos de 100ms. Eventualmente, se recibía un lote enorme de mensajes en el cliente.
La solución que me salvó la vida
El fix resultó ser sorprendentemente simple una vez que entendí el problema: Page Rules de Cloudflare.
Configuré una regla específica para mi endpoint de SSE que:
Desactiva completamente el caching
Permite que los datos fluyan sin buffering
Mantiene las conexiones abiertas
La lección aprendida
Este descubrimiento casual me hizo reflexionar sobre algo importante: a veces los problemas más frustrantes no están en tu código, sino en las capas que no controlas directamente.
La próxima vez que implementes SSE y uses Cloudflare (o cualquier proxy/CDN), recuerda esta historia. Puede ahorrarte horas de debugging sin sentido.
¿Has pasado por algo similar? ¿Alguna vez un servicio de terceros te ha saboteado silenciosamente una funcionalidad?