Índice

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:

CaracteristicaPub/SubCola de mensajes
EntregaTodos los suscriptores reciben cada mensajeCada mensaje va a un solo consumidor
PersistenciaNo — si nadie escucha, los mensajes se pierdenSi — los mensajes esperan hasta ser consumidos
ConfirmacionNo — dispara y olvidaSi — se requiere ACK/NACK
Caso de usoNotificaciones en vivo, chat, eventosTrabajos en segundo plano, procesamiento de tareas

Resumen

← Anterior: APIs web con nyx-serve Siguiente: Colas de mensajes con nyx-queue →