Answers:
根据有关PostgreSQL的文档NOTIFY
:
NOTIFY命令将通知事件与可选的“有效载荷”字符串一起发送到每个客户端应用程序,该客户端应用程序先前已为当前数据库中的指定通道名称执行了LISTEN通道。通知对所有用户可见。
(强调我的)
这意味着您不能仅仅通过 做自己想做的事情LISTEN/NOTIFY
。但是,您既可以有一个表来存储排队的消息,也LISTEN/NOTIFY
可以通知外部应用程序“消息队列中有新事物”,并可以使用这些外部应用程序中的一些额外逻辑,以便只有一个人可以使用该消息。
PostgreSQL 9.5中的“跳过锁定是什么 ”一文中描述的策略?这可能是在PostgreSQL中实现消息队列的最安全/最简单的方法。请特别注意“跳过锁定如何提供帮助”部分。还要仔细阅读他们的警告之一:
在RDBMS中实现的队列永远无法与快速专用排队系统的性能相提并论,即使该队列能够提供与PostgreSQL相同的原子性和持久性保证。使用SKIP LOCKED优于现有的数据库内方法,但是使用专用且高度优化的外部排队引擎仍会更快。
如果队列数量很大,这尤其重要。
我前一段时间做了类似的事情,并获得了成功,我使用了RabbitMQ和这个插件https://github.com/gmr/pgsql-listen-exchange
基本上,RabbitMQ连接到PostgreSQL并侦听notify事件,然后您可以使用RabbitMQ将消息聚合到所需的尽可能多的队列,并有一个使用每个队列的应用程序