Tiempo real con Pub/Sub
Que es Pub/Sub?
En una interaccion cliente-servidor normal, el cliente pregunta y el servidor responde. Pero, que pasa si el servidor necesita enviar datos a los clientes sin que se lo pidan? Este es el patron publish/subscribe (publicar/suscribir).
Los publicadores envian mensajes a un canal con nombre. Los suscriptores registran interes en canales y reciben mensajes a medida que llegan. El publicador no necesita saber quien esta escuchando — el sistema se encarga de la entrega.
Publisher ──► PUBLISH "news" "breaking: ..." ──► nyx-kv
│
┌───────────────┼───────────────┐
▼ ▼ ▼
Subscriber A Subscriber B Subscriber C
Esto se llama entrega fan-out: un mensaje, muchos receptores.
Suscribirse a un canal
nyx-kv implementa Pub/Sub usando los comandos estandar de Redis. Conectate con cualquier cliente Redis y suscribete:
$ redis-cli -p 6380 127.0.0.1:6380> SUBSCRIBE alerts Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "alerts" 3) (integer) 1
La respuesta confirma la suscripcion. El cliente ahora esta en modo suscriptor — se bloquea y espera mensajes. Solo tres comandos se aceptan en este modo: SUBSCRIBE, UNSUBSCRIBE y PING.
Publicar un mensaje
Desde otra terminal, publica un mensaje en el canal:
$ redis-cli -p 6380 127.0.0.1:6380> PUBLISH alerts "disk usage at 90%" (integer) 1
El valor de retorno es la cantidad de suscriptores que recibieron el mensaje. El suscriptor ve:
1) "message" 2) "alerts" 3) "disk usage at 90%"
Los mensajes se entregan como un array RESP de tres elementos: la cadena "message", el nombre del canal y el contenido.
Multiples canales
Un solo cliente puede suscribirse a multiples canales:
127.0.0.1:6380> SUBSCRIBE alerts notifications system
Los mensajes de cualquiera de estos canales se entregaran a este suscriptor.
Cancelar suscripcion
Para dejar de recibir mensajes de un canal:
127.0.0.1:6380> UNSUBSCRIBE alerts
Ejemplo: notificaciones en vivo
Aqui hay un patron practico. Una aplicacion web publica eventos cuando los usuarios realizan acciones:
# Publicador en Python (usando redis-py) import redis r = redis.Redis(port=6380) # Cuando un usuario se registra: r.publish("events", "signup:alice@example.com") # Cuando se realiza un pedido: r.publish("events", "order:12345:$49.99")
Un servicio de monitoreo se suscribe y procesa eventos en tiempo real:
# Suscriptor en Python
import redis
r = redis.Redis(port=6380)
p = r.pubsub()
p.subscribe("events")
for msg in p.listen():
if msg["type"] == "message":
print(f"Event: {msg['data'].decode()}")
Pub/Sub vs colas de mensajes
Pub/Sub y las colas de mensajes entregan mensajes, pero funcionan de manera diferente:
| Caracteristica | Pub/Sub | Cola de mensajes |
|---|---|---|
| Entrega | Todos los suscriptores reciben cada mensaje | Cada mensaje va a un solo consumidor |
| Persistencia | No — si nadie escucha, los mensajes se pierden | Si — los mensajes esperan hasta ser consumidos |
| Confirmacion | No — dispara y olvida | Si — se requiere ACK/NACK |
| Caso de uso | Notificaciones en vivo, chat, eventos | Trabajos en segundo plano, procesamiento de tareas |
Resumen
SUBSCRIBE channelentra en modo suscriptor y espera mensajes.PUBLISH channel messageenvia un mensaje a todos los suscriptores.UNSUBSCRIBE channeldeja de recibir mensajes.- Fan-out: cada suscriptor recibe cada mensaje.
- Sin persistencia — si nadie esta escuchando, el mensaje se pierde.
- Usa Pub/Sub para notificaciones en tiempo real, eventos y actualizaciones en vivo.