it-swarm.com.de

Postgres Listen / Notify As Message Queue

Gibt es eine Möglichkeit, die Postgres Listen/Notify-Funktion zu verwenden, um eine Nachricht an einen Kanal zu übermitteln, und nur einen Listener diese Nachricht verwenden zu lassen?

Der Zweck dafür ist, dass ich mehrere "Arbeiter" -Apps habe, die alle denselben Postgres-Kanal hören. Ich möchte jedoch, dass die Arbeit nur einmal pro Nachricht erledigt wird, die über den Benachrichtigungskanal empfangen wird.

Wenn Listen/Notify nicht die richtige Funktion in Postgres ist, gibt es eine separate Funktion, die ich verwenden sollte?

Idealerweise möchte ich dies ohne zusätzliche Erweiterungen tun.

17
moesef

Laut PostgreSQL-Dokumentation zu NOTIFY :

Der Befehl NOTIFY sendet ein Benachrichtigungsereignis zusammen mit einer optionalen "Payload" -String an die Clientanwendung each, die zuvor den LISTEN-Kanal für den angegebenen Kanalnamen in der aktuellen Datenbank ausgeführt hat. Benachrichtigungen sind für alle Benutzer sichtbar.

(Hervorhebung von mir)

Dies bedeutet, dass Sie nicht tun können, was Sie wollen nur mit ​​LISTEN/NOTIFY. Sie können jedoch sowohl eine Tabelle zum Speichern von Nachrichten in der Warteschlange als auch LISTEN/NOTIFY Haben, um externe Anwendungen zu benachrichtigen, dass "neue Dinge in der Nachrichtenwarteschlange vorhanden sind", und zusätzliche Logik von diesen externen Anwendungen verwenden, sodass nur eine die verwendet Botschaft.

Die im Artikel Wofür ist SKIP LOCKED in PostgreSQL 9.5 ? dargestellte Strategie ist wahrscheinlich der sicherste/einfachste Weg, eine Nachrichtenwarteschlange in PostgreSQL zu implementieren. Achten Sie besonders auf den Teil "Wie SKIP LOCKED hilft". Lesen Sie auch sorgfältig einen ihrer Vorbehalte:

Eine im RDBMS implementierte Warteschlange wird niemals mit der Leistung eines schnellen dedizierten Warteschlangensystems mithalten können, selbst wenn diese die gleiche Atomizität und Haltbarkeit wie PostgreSQL garantiert. Die Verwendung von SKIP LOCKED ist besser als bestehende datenbankinterne Ansätze. Mit einer dedizierten und hochoptimierten externen Warteschlangen-Engine können Sie jedoch schneller arbeiten.

Dies ist besonders wichtig, wenn das Warteschlangenvolumen hoch ist.

26
joanolo

Ich habe so etwas vor einiger Zeit mit gutem Erfolg gemacht, ich habe RabbitMQ und dieses Plugin verwendet https://github.com/gmr/pgsql-listen-exchange

Grundsätzlich stellt RabbitMQ eine Verbindung zu PostgreSQL her und wartet auf das Benachrichtigungsereignis. Anschließend können Sie RabbitMQ verwenden, um diese Nachricht in beliebig vielen Warteschlangen zusammenzufassen und eine App zu haben, die jede Warteschlange belegt

3
Phill Pafford