Postgres 侦听/通知为消息队列

moe*_*sef 20 postgresql event-notification queue

有什么方法可以使用 Postgres 的监听/通知功能将消息传递到频道,并且只有一个监听器使用该消息?

这样做的目的是我有多个“工人”应用程序都在收听同一个 Postgres 频道。但我只希望通过通知渠道收到的每条消息完成一次工作。

如果侦听/通知不是 Postgres 中的正确功能,我应该使用单独的功能吗?

理想情况下,我希望在不使用任何其他扩展的情况下执行此操作。

joa*_*olo 29

根据PostgreSQL 文档关于NOTIFY

NOTIFY 命令将通知事件和可选的“有效负载”字符串一起发送到每个客户端应用程序,该应用程序先前已为当前数据库中的指定频道名称执行了 LISTEN 频道。通知对所有用户可见

(强调我的)

这意味着你不能只用 LISTEN/NOTIFY. 但是,您可以使用一个表来存储排队的消息,LISTEN/NOTIFY通知外部应用程序“消息队列中有新事物”,并使用来自这些外部应用程序的一些额外逻辑,以便只有一个人使用消息。

文章中描述的策略是什么是 PostgreSQL 9.5 中的 SKIP LOCKED?可能是在 PostgreSQL 中实现消息队列的最安全/最简单的方法。请特别注意“跳过锁定如何帮助”部分。另请仔细阅读他们的警告之一:

在 RDBMS 中实现的队列永远无法与快速专用队列系统的性能相媲美,即使是与 PostgreSQL 相同的原子性和持久性保证。使用 SKIP LOCKED 比现有的数据库内方法更好,但使用专用且高度优化的外部排队引擎仍然会更快。

如果队列量很大,这一点尤其重要。

  • 我希望我能奖励那篇文章的作者。所以非常有帮助。 (3认同)

Phi*_*ord 6

我不久前做了类似的事情,取得了很好的成功,我使用了 RabbitMQ 和这个插件https://github.com/gmr/pgsql-listen-exchange

基本上,RabbitMQ 连接到 PostgreSQL 并侦听通知事件,然后您可以使用 RabbitMQ 将该消息聚合到所需数量的队列,并让一个应用程序使用每个队列