Postgres ascolta / notifica come coda messaggi


17

Esiste un modo per utilizzare la funzione di ascolto / notifica di Postgres per recapitare un messaggio a un canale e fare in modo che un solo ascoltatore utilizzi questo messaggio?

Lo scopo è che ho più app "worker" che ascoltano tutte lo stesso canale Postgres. Ma voglio che il lavoro venga svolto una sola volta per messaggio ricevuto attraverso il canale di notifica.

Se Ascolta / Notifica non è la funzione corretta in Postgres, c'è una funzione separata che dovrei usare?

Idealmente, vorrei farlo senza utilizzare estensioni aggiuntive.

Risposte:


23

Secondo la documentazione di PostgreSQL suNOTIFY :

Il comando NOTIFY invia un evento di notifica insieme a una stringa "payload" opzionale a ciascuna applicazione client che ha precedentemente eseguito il canale LISTEN per il nome del canale specificato nel database corrente. Le notifiche sono visibili a tutti gli utenti .

(enfatizzare il mio)

Questo significa che non puoi fare quello che vuoi solo con LISTEN/NOTIFY . Tuttavia, è possibile disporre sia di una tabella per archiviare i messaggi in coda, sia LISTEN/NOTIFYper notificare alle applicazioni esterne che "ci sono novità nella coda dei messaggi" e utilizzare una logica aggiuntiva da queste applicazioni esterne in modo che solo una consumi il messaggio.

La strategia illustrata nell'articolo A cosa serve SKIP LOCKED in PostgreSQL 9.5? è probabilmente il modo più sicuro / più semplice per implementare una coda di messaggi all'interno di PostgreSQL. Prestare particolare attenzione alla parte "Come SKIP LOCKED aiuta". Leggi anche attentamente uno dei loro avvertimenti:

Una coda implementata nell'RDBMS non corrisponderà mai alle prestazioni di un sistema di accodamento veloce dedicato, anche quello che garantisce la stessa atomicità e durata nel tempo di PostgreSQL. L'uso di SKIP LOCKED è migliore degli approcci esistenti nel database, ma continuerai comunque a utilizzare un motore di accodamento esterno dedicato e altamente ottimizzato.

Ciò è particolarmente importante se il volume della coda è alto.


1
Vorrei poter assegnare una taglia all'autore di quell'articolo. Quindi estremamente utile.
Wildcard il

3

Ho fatto qualcosa di simile qualche tempo fa con un buon successo, ho usato RabbitMQ e questo plugin https://github.com/gmr/pgsql-listen-exchange

Fondamentalmente RabbitMQ si collega a PostgreSQL e ascolta l'evento di notifica, quindi è possibile utilizzare RabbitMQ per aggregare quel messaggio a tutte le code necessarie e avere un'app che consuma ogni coda

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.