La Esquina del Código
Un blog de Carlos Reyes Web
Volver al inicioCuando tus Server-Sent Events no funcionan: El culpable que nunca sospechas

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:

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:

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?

Compartir en Twitter