Postgres Escuchar / Notificar como cola de mensajes

17

¿Hay alguna forma de usar la función de escucha / notificación de Postgres para entregar un mensaje a un canal y que solo un oyente consuma este mensaje?

El propósito de esto es que tengo múltiples aplicaciones 'trabajadoras', todas escuchando el mismo canal de Postgres. Pero solo quiero que el trabajo se realice una vez por mensaje recibido a través del canal de notificación.

Si Listen / Notify no es la función correcta en Postgres, ¿hay una función separada que debería usar?

Idealmente, me gustaría hacer esto sin usar extensiones adicionales.

moesef
fuente

Respuestas:

23

De acuerdo con la documentación de PostgreSQL sobreNOTIFY :

El comando NOTIFY envía un evento de notificación junto con una cadena de "carga útil" opcional a cada aplicación cliente que haya ejecutado previamente el canal LISTEN para el nombre del canal especificado en la base de datos actual. Las notificaciones son visibles para todos los usuarios .

(énfasis mío)

Esto significa que no puedes hacer lo que quieres solo con LISTEN/NOTIFY . Sin embargo, puede tener una tabla para almacenar mensajes en cola, LISTEN/NOTIFYpara notificar a las aplicaciones externas que "hay cosas nuevas en la cola de mensajes", y utilizar alguna lógica adicional de estas aplicaciones externas para que solo una consuma el mensaje.

La estrategia representada en el artículo ¿Para qué está SKIP LOCKED en PostgreSQL 9.5? es probablemente la forma más segura / fácil de implementar una cola de mensajes dentro de PostgreSQL. Preste especial atención a la parte "Cómo ayuda SKIP LOCKED". Lea también cuidadosamente una de sus advertencias:

Una cola implementada en el RDBMS nunca coincidirá con el rendimiento de un sistema de colas dedicado rápido, incluso uno que tenga las mismas garantías de atomicidad y durabilidad que PostgreSQL. Usar SKIP LOCKED es mejor que los enfoques existentes en la base de datos, pero aún así irás más rápido usando un motor de colas externo dedicado y altamente optimizado.

Esto es especialmente importante si el volumen de la cola es alto.

joanolo
fuente
1
Desearía poder otorgar una recompensa al autor de ese artículo. Muy útil
Comodín
3

Hice algo así hace un tiempo con buen éxito, utilicé RabbitMQ y este complemento https://github.com/gmr/pgsql-listen-exchange

Básicamente RabbitMQ se conecta a PostgreSQL y escucha el evento de notificación, luego puede usar RabbitMQ para agregar ese mensaje a tantas colas como sea necesario y tener una aplicación consumiendo cada cola

Phill Pafford
fuente