Postgresがメッセージキューとしてリッスン/通知する


17

PostgresのListen / Notify機能を使用してメッセージをチャネルに配信し、このメッセージを1人のリスナーのみが消費する方法はありますか?

これの目的は、複数の「ワーカー」アプリがすべて同じPostgresチャネルをリッスンしていることです。しかし、通知チャネルを介して受信したメッセージごとに1回だけ作業を行いたいと思います。

Listen / NotifyがPostgresの正しい機能ではない場合、使用すべき別の機能はありますか?

理想的には、追加の拡張機能を使用せずにこれを実行したいと思います。

回答:


23

PostgreSQLのドキュメントにNOTIFYよると:

NOTIFYコマンドは、現在のデータベース内の指定されたチャネル名に対してLISTENチャネルを以前に実行したクライアントアプリケーションに、オプションの「ペイロード」文字列とともに通知イベントを送信します。通知はすべてのユーザーに表示されます

(エンファシス鉱山)

これはあなたが望むことだけを することができないことを意味しますLISTEN/NOTIFY。ただし、キューに入れられたメッセージを格納するテーブルLISTEN/NOTIFY、「メッセージキューに新しいものがある」ことを外部アプリケーションに通知するテーブル、およびこれらの外部アプリケーションからいくつかの追加ロジックを使用してメッセージを消費するテーブルの両方を持つことができます。

記事PostgreSQL 9.5のスキップロックとは何ですか?おそらく、PostgreSQL内でメッセージキューを実装する最も安全で簡単な方法です。「SKIP LOCKEDがどのように役立つか」の部分に特に注意してください。また、注意事項の1つを注意深くお読みください。

RDBMSに実装されたキューは、PostgreSQLと同じ原子性と耐久性を保証するものであっても、高速な専用キューイングシステムのパフォーマンスと決して一致しません。SKIP LOCKEDの使用は、既存のデータベース内アプローチよりも優れていますが、専用の高度に最適化された外部キューエンジンを使用すると、さらに高速になります。

これは、キューのボリュームが大きい場合に特に重要です。


1
その記事の著者に賞金を授与できるといいのですが。とても助かります。
ワイルドカード

3

私はしばらく前にこのようなことを成功させ、RabbitMQとこのプラグインを使用しましたhttps://github.com/gmr/pgsql-listen-exchange

基本的にRabbitMQはPostgreSQLに接続し、通知イベントをリッスンします。その後、RabbitMQを使用して、必要な数のキューにそのメッセージを集約し、各キューを消費するアプリを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.