Publicación y Subscripción en PostgreSQL

De aquí a un tiempo he encontrado muchas empresas solicitando integrar el sistema de Pub/Sub de Redis en su arquitectura para conseguir agregar capacidades de chat. ¿Sabías que esto mismo podía hacerse en PostgreSQL?

En el cliente de consola de PostgreSQL se pueden emplear los comandos para escuchar (LISTEN) y enviar mensajes (NOTIFY) a los canales, no obstante es bastante incómodo no recibir los mensajes hasta enviar la siguiente consulta.

Como ejemplo, para ilustrar un poco la explicación podemos emplear el siguiente código:

postgres=# LISTEN escucha;
LISTEN
postgres=# NOTIFY escucha;
NOTIFY
Notificación asíncrona «escucha» recibida del proceso de servidor con PID 8193.
postgres=#

Con el primer comando establecemos la escucha en el canal escucha. Cuando se envíe una notificación a ese canal, ya sea con información o sin ella, nos llegará esa notificación directamente al cliente de postgresql.

Haciendo un poco de búsqueda por Internet encontré un script de Python en Gist. Partido en dos, quien publica y el subscriptor. He hecho una pequeña prueba modificando la conexión de PostgreSQL pero manteniendo el resto del código. En tres terminales abiertas y el resultado ha sido:

# python pub.py escucha lider
PUBLISH to channel #escucha
Hola a todos

En las otras dos terminales en las que está en ejecución el otro script, sub.py, podemos ver exactamente lo mismo:

SUBSCRIBE TO channel #escucha
#escucha - [lider]:Hola a todos

La información que se envía al canal se distribuye a todos los subscriptores del canal que estén activos en el momento de recibir el mensaje. Si un subscriptor se subscribe al canal los mensajes anteriores a su subscripción no le llegarán. Solo recibirá los mensajes que se envíen a partir de ese momento.

Este sistema es ideal para el envío de eventos a través de canales. Estos eventos llegan a los subscriptores, que pueden ser microservicios u otros elementos en la red para monitorización o alarmas. Cada elemento toma los mensajes y los procesa si es necesario. Esto facilita mucho la comunicación entre servidores y sobretodo la configuración de estas conexiones, ya que los canales son provistos por la propia base de datos.

¿Has empleado alguna vez sistemas de pub/sub para mensajería asíncrona entre tus sistemas? ¿Te interesaría saber cómo este tipo de infraestructuras pueden beneficiar a tu sistema? Comenta tu experiencia o pon tus dudas como comentario más abajo.