SSE: La clave para sincronizar estado edge
Server-Sent Events (SSE) puede ser un canal de distribución más eficiente que Redis para sincronizar estado entre múltiples servidores edge cuando las mutaciones son raras pero las lecturas frecuentes. En lugar de hacer un round-trip de red para cada consulta (0.5–5ms), cada nodo edge recibe cambios vía SSE, los persiste en SQLite local, y consulta localmente (~0.01–0.1ms). El patrón funciona bien para revocación de JWT, listas de IPs banneadas, y feature flags distribuidos. No reemplaza Redis, pero resuelve un problema específico de forma más veloz.
En 30 segundos
- SSE es un canal de fanout para empujar cambios de estado desde un escritor central a N nodos edge
- Latencia SQLite local: 0.01–0.1ms. Latencia Redis + red: 0.5–5ms. La velocidad viene de consultas locales, no de SSE
- Ideal cuando mutaciones ocurren ~1 vez/minuto pero lecturas son miles/segundo (asymmetric workload)
- Requiere consistencia eventual y manejo de desconexiones; SSE es unidireccional (central → edges)
- Casos reales: revocación de JWT distribuida, listas negras de IPs, feature flags con rollout gradual
Qué es el patrón SSE como fanout channel para edge
Server-Sent Events es una tecnología HTTP estándar que permite a un servidor empujar mensajes a múltiples clientes a través de una conexión persistent. Lo que el patrón propone es usarla para distribuir mutaciones de estado (cambios pequeños) desde un punto central a todos los nodos edge. Cada edge recibe el cambio, lo escribe en una base de datos SQLite local, y luego consulta esa base localmente en lugar de hacer un viaje de red a cada lectura.
El repositorio github.com/as1as/sse-edge-auth (2026) es la implementación de referencia. No es un framework de producción ni un reemplazo de Redis. Es un sketch del patrón: “¿si solo necesitas empujar mutaciones ocasionales a muchos lectores, realmente necesitas Redis?” La respuesta es matizada.
El problema de sincronización en arquitecturas edge
Fijate en una arquitectura típica: cien servidores edge distribuidos globalmente, todos frente a un origen. Todos necesitan estar de acuerdo en cosas críticas: ¿está este JWT revocado? ¿Está esta IP banneada? ¿Se activa este feature flag para este usuario?
La solución estándar: Redis. Cada edge consulta la misma store centralizada. Problema: con miles de requests por segundo llegando a ese cluster de edges, pedir a Redis por cada verificación de JWT genera latencia innecesaria (si es que Redis está disponible; si cae, tenés que degradar).
Lo interesante acá es que fuerza un patrón de lectura constante en una store centralizada, cuando la realidad es que el estado muta raramente. Revocas un token una vez cada minuto. Banneás una IP cada dos horas. El feature flag cambia una vez al día. Lo explicamos a fondo en arquitectura de agentes en tiempo real.
Asimetría de operaciones: por qué Redis no es óptimo para este caso
Según el artículo original (2026), el patrón surge de notar una asimetría fundamental.
Mutaciones: una por minuto. Lecturas: miles por segundo. Si cada lectura paga un round-trip de red a Redis (~0.5–5ms en LAN), estás gastando ancho de banda y latencia en un problema que podría resolverse de otra forma.
¿Alternativa? Cuando ocurre una mutación (revocación de JWT), el escritor central la envía a todos los edges vía SSE. Cada edge la recibe, la escribe en SQLite local, y a partir de ahí todas las consultas son locales: ~0.01–0.1ms. Un viaje de red único y en una dirección (escritor → edges), no en cada lectura.
El número es contundente: si hacés 1000 lecturas/segundo en un edge, Redis cuesta ~500–5000ms totales; SQLite local cuesta ~10–100ms totales. Orden de magnitud diferente.
Comparativa: SSE vs Redis vs WebSockets
| Característica | SSE + SQLite | Redis Pub/Sub | WebSockets |
|---|---|---|---|
| Latencia por cambio | ~0.01–0.1ms (local) | ~0.5–5ms (red) | ~0.5–10ms (red + bidireccional) |
| Complejidad | Baja (HTTP estándar) | Media (protocolo RESP) | Alta (bidireccional, stateful) |
| Dirección | Unidireccional (central → edges) | Bidireccional (pub/sub) | Bidireccional (full-duplex) |
| Casos de uso | Fanout de mutaciones, config distribuida, feature flags | Messaging distribuido, caché compartido, sessions | Chat, notifications realtime, colaboración |
| Resiliencia | Eventual + reconexión automática | Fuerte pero requiere infraestructura | Fuerte pero requiere keepalive |
| Escalabilidad | N edges, 1 escritor | M publishers, N subscribers | M clientes, N servidores |

Ojo: SSE no es “más rápido” que Redis Pub/Sub como fanout channel. Como canales de distribución, están en el mismo piso. La velocidad viene del storage local (SQLite) en cada edge, no de SSE mismo.
Cómo funciona la implementación del patrón
Arquitectura básica, paso a paso:
El servidor central (el escritor único) mantiene una tabla SQLite de cambios: id | tipo | payload | timestamp | version. Cuando algo cambia (JWT revocado, IP banneada), inserta una fila y abre un stream SSE. Sobre eso hablamos en automatización inteligente de procesos.
Cada nodo edge mantiene una conexión HTTP persistente a /subscribe del central (SSE). Recibe cada cambio como un evento JSON, lo deserializa, lo inserta en su propia tabla SQLite local, confirma receipt. El central incrementa un version counter; los edges que se desconectaron pueden pedir “dame todos los cambios desde version X” en su reconexión.
El cliente dentro del edge (la aplicación que maneja requests) ahora consulta SQLite local en lugar de preguntar a Redis: SELECT COUNT(*) FROM revoked_tokens WHERE jti = ?. Sub-milisegundo. Sin latencia de red. Sin dependencia de un servicio centralizado que puede fallar.
Trade-off: consistencia eventual. Hay una ventana (típicamente milisegundos) donde un edge aún no recibió el cambio. Si es crítico, podés usar versionado: cada cambio lleva un timestamp, y el cliente edge valida que su copia local es al menos tan nueva como la que el servidor conoce.
Casos de uso reales donde SSE + SQLite tiene sentido
1. Revocación de JWT en arquitecturas edge globales
Un usuario se loguea en tu app web, recibe un JWT válido por 1 hora. De repente, su cuenta es comprometida; operaciones revoca el token. Con Redis, eso dispara una query centralizada en cada request; con SSE + SQLite, el cambio se propaga a 50 servers edge en ~100–500ms y luego son solo consultas locales.
2. Listas negras dinámicas (IP bans, bot detection)
Detectas un ataque DDoS desde un range de IPs. Escribís el ban en el central, se propaga vía SSE a todos los edges. Cada edge rechaza request desde esas IPs consultando SQLite (~0.05ms) en lugar de round-trip a Redis. Menú de latencia crítica en mitigación de ataques. Ya lo cubrimos antes en seguridad en canales de comunicación.
3. Feature flags con rollout gradual
Querés activar una feature para el 5% de tus usuarios (determinístico, basado en user_id). Central mantiene la lista de user_ids habilitados, la envía via SSE, cada edge la cachea localmente. Decisión de feature flag = hashear user_id y buscar en SQLite (100% local). Cero latencia, cero dependencia remota.
4. Configuración distribuida que muta raras veces
Rate limits, quotas por tenant, timeouts. Cambias un parámetro en el admin panel, se propaga a todos los nodos. Cada nodo lo consulta localmente en cada request. Si usas SQLite como base de datos distribuidora en los edges, tenés ACID local sin costo de red.
Errores comunes al implementar SSE para sync de estado
Error 1: Asumir que SSE es más rápido que Redis sin mediciones
SSE y Redis Pub/Sub tienen latencia similar como canales de distribución (~0.5–5ms en red). La ganancia está en no hacer la llamada de red en cada lectura. Si implementás mal la parte SQLite local (bad indexing, queries lentas), la ventaja desaparece. Siempre medí: benchmarkea tu consulta SQLite vs round-trip a Redis.
Error 2: No manejar desconexiones y recuperación de estado
Un edge pierde conectividad 10 minutos. Cuando reconecta, ¿cuál es su estado? ¿Cuáles cambios perdió? Si no implementás un log de cambios con version numbering o timestamps, un edge puede quedar desynced indefinidamente. Siempre usa versioning: cambio 1 → versión 100, cambio 2 → versión 101. Al reconectar, el edge dice “tengo hasta versión 98, dame el resto”.
Error 3: Intentar sincronizar estado muy grande vía SSE
SSE funciona para mutaciones de estado pequeñas. Si tu payload es un JSON de 10MB (ej: lista completa de 1M usuarios), SSE no es la herramienta. La conexión se estresa, el bandwidth explota. SSE es para deltas, no para snapshots. Si necesitás sincronizar estado grande, usa S3/blob storage + signaling vía SSE: “Se actualizó el snapshot en s3://bucket/config.json; descargalo”.
Consideraciones de escala, consistencia y recuperación
Subís a escala: 500 edges conectados, 10 cambios/segundo en el central. Ahora tenés 5000 eventos SSE/segundo saliendo del central. Pregunta: ¿tu infraestructura puede sostenerlo? SSE requiere conexiones HTTP persistent abiertas, que en algunos load balancers puede ser difícil de escalar. Redis Pub/Sub, en comparación, no mantiene state en el servidor (es stateless). Esto se conecta con lo que analizamos en pruebas en sistemas distribuidos.
Consistencia: ¿qué tan “eventual” es “eventual”? Si un edge está offline 60 segundos, lleva 60 segundos en aplicar cambios nuevos. En muchos casos está bien. Para aplicaciones financieras o sensibles a seguridad, probablemente no. Mitiga con versionado estricto, polls periódicos de check-in, y validación en el lado del cliente (“¿es mi copia lo suficientemente fresca?”).
Recuperación ante fallos: si el servidor central falla, nuevos edges no pueden conectar. Mitiga con replicación: mantén dos centrales (active-active o active-passive), usa un DNS que cambie automáticamente. SSE no soluciona esto; simplemente movés la responsabilidad a tu infraestructura.
Preguntas Frecuentes
¿Es SSE más rápido que Redis para sincronizar estado entre servidores?
No exactamente. SSE y Redis Pub/Sub tienen latencia similar como canales de distribución. Lo que es más rápido es consultar SQLite local (~0.01–0.1ms) versus hacer un round-trip a Redis (~0.5–5ms) en cada lectura. Si implementás mal el storage local, perdés toda la ventaja.
¿Cómo revocar un JWT en múltiples nodos edge simultáneamente con SSE?
El servidor central recibe la solicitud de revocación, inserta la entrada en su tabla de JWTs revocados y emite un evento SSE tipo {"event": "token_revoked", "jti": "abc123"}. Todos los edges conectados reciben el evento de forma casi simultánea (latencia de propagación ~100–500ms) y lo escriben en SQLite local. Luego, en cada validación de JWT, el edge consulta SQLite sin latencia de red.
¿Cuándo debería usar Redis Pub/Sub en lugar de SSE + SQLite?
Usa Redis si necesitás bidireccionalidad real (múltiples publishers, múltiples subscribers), si tus cambios son muy frecuentes y voluminosos, o si necesitás un broker de mensajes maduro con persistencia configurable. SSE es unidireccional y funciona bien solo si tenés un escritor central único que emite cambios ocasionalmente.
¿Qué ocurre si un nodo edge pierde conectividad durante horas?
Sin sistema de recuperación, queda desynced. Implementá versionado: el central asigna a cada cambio un número secuencial; los edges guardan “tengo hasta versión X” en SQLite. Al reconectar, piden todos los cambios desde X+1. Si el central guardó cambios por 24h, el edge puede recuperarse completamente.
¿Cuál es la ventana de inconsistencia con este patrón?
Un edge recibe un cambio vía SSE y lo escribe en SQLite localmente. Latencia típica: 50–500ms según distancia de red y latencia del edge. En esa ventana, si un cliente hace request justo después que el central emitió el cambio pero antes que el edge lo guardó, puede ver estado stale. Mitigá con versionado y round-trip a central si versión es muy vieja.
Conclusión
El patrón SSE + SQLite resuelve un problema específico: distribuir mutaciones raras a muchos lectores frecuentes. No es un reemplazo de Redis (ni lo pretende ser), es un complemento para arquitecturas edge donde la asimetría lectura/escritura es extrema y la consistencia eventual es aceptable.
Si operás cientos de servidores edge globales y necesitás validaciones rápidas (JWT, IP bans, feature flags), vale la pena experimentar con él. La ganancia no es mágica, pero el orden de magnitud en latencia (0.01–0.1ms vs 0.5–5ms) es real. El costo es consistencia eventual y complejidad operacional (versionado, recuperación ante fallos). Pesá el trade-off para tu caso.
Código + arquitectura en github.com/as1as/sse-edge-auth. No es producción-ready, pero es lo suficientemente robusto para inspirar tu propia implementación.
Fuentes
- A Pattern Sketch: Server-Sent Events as a Fanout Channel for Edge State — Dev.to (2026)
- Repositorio sse-edge-auth en GitHub — Implementación de referencia del patrón
- Server-Sent Events (SSE) — MDN Web Docs
- Escalabilidad de Pub/Sub con WebSockets y Redis — Ably (2026)
- SQLite como base de datos distribuida — SQLite.ai



![A video showing how to rank higher in the WordPress plugin directory[FREE][DISCUSSION] - ilustracion](https://donweb.news/wp-content/uploads/2026/04/como-rankear-plugin-wordpress-directorio-hero-768x429.jpg)


