【问题标题】:How can a postgres 9.4 server know if a client is listening on a notify channel?postgres 9.4 服务器如何知道客户端是否正在侦听通知通道?
【发布时间】:2015-07-26 13:28:55
【问题描述】:

我有一种情况,如果用户已添加到我的 postgreSQL 数据库中的特定表中,我想向他们发送通知。

我正在使用 pg_notify 将 json 有效负载发送到已实现 pg 客户端以侦听通知通道的 NODE.js 服务器。这很好用。

我无法决定如何最好地通知 postgres 服务器有人正在收听并且通知已收到并正在处理中。理想情况下,我希望客户端使用相同的通道来通知服务器。但是,据我了解,postgres 服务器将仅充当通道的集线器,只需接收来自客户端的通知并将其推送回所有其他订阅的侦听器。

真的是这样吗?我可以在 postgres 服务器上构建一个由通道上的传入通知触发的函数吗?

我想到的唯一其他解决方案是在表中有一个列来记录已收到通知,并让 Node.js 服务器在收到通知时更新表,但这需要额外的连接我想避免的。

对此的任何想法或经验将不胜感激。

【问题讨论】:

    标签: postgresql notifications


    【解决方案1】:

    解决方案取决于不错过通知的重要性。

    不,Postgres 没有侦听来自客户端的通知的功能,但如果您连接到 Postgres 服务器,您可以直接做您需要做的事情。

    Postgres 不是消息队列。它让您聆听/通知您可以构建更复杂的东西,但除非您真的知道自己在做什么,否则我不会建议您这样做。

    如果您需要有保证的消息传递、消息路由,您最好使用像 RabbitMQ 这样的真实消息队列。

    例如,您可以让一个简单的应用程序监听来自 Postgres 的通知并将它们放入消息队列中,该队列会保留消息直到有人阅读并确认它。

    如果该应用程序失败,您将丢失消息,因此如果您需要更好的保证,您可以在 Postgresql 中使用触发器,将消息作为备份放在表中。

    【讨论】:

    • 谢谢,比约恩。这实际上正是我最终使用 Rabbit 构建它的方式。我什至将消息存储在数据库中,以防我需要重新发送它们。然后,我将使用 pgAgent 定期检查消息表,以查找在设定时间后尚未从该临时存储中确认(删除)的任何消息。所以我很高兴看到你也想到了这个解决方案,这意味着我没有做任何其他人不会做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多