Redis – Publicación y Suscripción de mensajes

Redis permite la creación de un bus básico de mensajes/eventos a través de su mecanismo de Publicación y Suscripción, pudiendo crear canales/topics «efímeros» (no se almacenan en memoria) donde publicar mensajes que puedan recibir uno o varios suscriptores (sólo aquellos que estén conectados cuando el mensaje se envía, al ser un canal efímero, sin persistencia), actuando como un Broker para múltiples clientes que permite desacoplar publicadores de suscriptores, favoreciendo la escalabilidad.

Continuando con nuestra serie sobre Redis, ahora que ya hemos hablado sobre las diferentes estructuras de datos que soporta Redis (Strings, Hashes, Lists, Sets, y Sorted Sets), del problema y posibles soluciones de la búsqueda sobre claves en función de sus Atributos, y de las Transacciones en Redis, llega el momento de hablar sobre el mecanismo de Publicación y Suscripción que proporciona Redis.

Además de las diferentes estructuras de datos que soporta Redis, también proporciona un sencillo mecanismo de Publicación y Suscripción de mensajes, que sin ser una solución muy sofisticada, puede ser apropiada en muchos casos de uso. Sus principales características son las siguientes:

  • Un mensaje puede almacenar texto, números, datos binarios, un JSON (como texto o serializado a binario), etc.
  • Un mensaje publicado en un canal/topic, será entregado a todos los clientes suscritos (patrón Fan Out), por lo que el número de suscriptores actuará como un factor multiplicador del consumo de red debido a su transferencia.
  • La entrega no está garantizada: sólo los clientes suscritos y conectados en el momento de publicación de un mensaje, serán capaces de recibirlo, comportándose como un canal efímero, ya que no se almacenará en memoria, como ocurre con el resto de estructuras de datos de Redis.
  • Si estamos trabajando con un único servidor de Redis, el orden de recepción de los mensajes está garantizado.

Simple Syndication o Basic Subscriptions (PUBLISH, SUBSCRIBE, UNSUBSCRIBE)

Consiste en la Publicación y Suscripción de mensajes sobre canales/topics, especificando su nombre completo (sin wildcards) al realizar la suscripción. Los comandos habituales son los siguientes:

  • El comando PUBLISH envía un nuevo mensaje a un canal/topic, especificando su nombre completo.
  • El comando SUBSCRIBE escucha nuevos mensajes en uno o varios canales/topics, que deberán especificarse por su nombre completo (sin wildcards). Es un comando bloqueante, en el sentido en que una vez ejecutado se queda a la espera de recibir mensajes, y sólo es posible ejecutar un conjunto reducido de comandos como SUBSCRIBE, SSUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, SUNSUBSCRIBE, PUNSUBSCRIBE, PING, RESET, ó QUIT.
  • El comando UNSUBSCRIBE deja de escuchar en uno o varios canales/topics, que deberán especificarse por su nombre completo (sin wildcards).

A continuación se muestra un ejemplo realizado con redis-cli, con un cliente suscrito a dos canales/topics, otro cliente suscrito sólo a uno de los canales/topics, y otro cliente publicando mensajes en ambos canales/topics. Como se puede ver, los mensajes enviados a un canal/topic, llegan a todos los clientes suscritos al mismo.

Patterned Syndication o Pattern Subscriptions (PSUBSCRIBE, PUNSUBSCRIBE)

Consiste en la Publicación y Suscripción de mensajes sobre canales/topics, especificando patrones glob al realizar la suscripción. Los comandos habituales son los siguientes:

  • El comando PUBLISH envía un nuevo mensaje a un canal/topic, especificando su nombre completo.
  • El comando PSUBSCRIBE escucha nuevos mensajes en uno o varios canales/topics, en base a uno o varios patrones glob.
  • El comando PUNSUBSCRIBE deja de escuchar en uno o varios canales/topics, en base a uno o varios patrones glob.

A continuación se muestra un ejemplo realizado con redis-cli, con un cliente suscrito a todo los canales/topics, otro cliente suscrito sólo a un subconjunto de los canales/topics (live*), otro cliente publicando mensajes en dos canales/topics, y un último cliente que muestra el número de suscriptores basadas en patrones glob (Pattern Subscriptions) mediante el comando pubsub. Como se puede ver, los mensajes enviados a un canal/topic, llegan a todos los clientes suscritos al mismo.

Gestión de canales con el comando PUBSUB

El comando PUBSUB ofrece varios sub-comandos que facilitan algunas tareas de gestión del mecanismo de Publicación y Suscripción de Redis, como por ejemplo, descubrir qué canales/topics están disponibles para suscribirse.

  • El comando PUBSUB CHANNELS muestra la lista de canales/topics activos (con suscripciones activas).
  • El comando PUBSUB NUMSUB muestra el número de suscriptores (excluyendo las suscripciones en base a patrones glob).
  • El comando PUBSUB NUMPAT muestra el número de suscriptores basadas en patrones glob (Pattern Subscriptions).

Despedida y Cierre

Hasta aquí llega este Post, donde hemos introducido el mecanismo de Publicación y Suscripción que proporciona Redis, apropiado en casos de uso que necesite aplicar el patrón Fan Out (notificar o enviar un mensaje a un número indeterminado de suscriptores), aunque sin garantía de entrega, y otros casos de uso como la comunicación entre procesos,

Poco más por hoy. Como siempre, confío que la lectura resulte de interés.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

3 × dos =