任何使用LISTEN& amp;和实时监控Postgresql查询变化的方法。 NOTIFY(或NodeJS)?

时间:2017-10-23 21:32:10

标签: sql node.js database postgresql performance

所以我有一个自定义的Postgresql查询,它检索指定经度纬度半径内的所有行,如下所示:

SELECT *, 
earth_distance(ll_to_earth($1,$2), ll_to_earth(lat, lng)) as distance_metres
FROM RoomsWithUsers
WHERE earth_box(ll_to_earth($1,$2), $3) @> ll_to_earth(lat, lng)
ORDER by distance_metres;

在我的节点服务器中,我希望每次此查询中的行数发生更改时都会收到通知。我已经研究过使用像pg-live-query这样的Node库,但我更倾向于使用与现有的Postgres LISTEN / NOTIFY一起工作的pg-pubsub,以避免不必要的开销。但是,据我所知,PostgreSQL TRIGGERs仅适用于UPDATE / INSERT / DELETE操作,而不适用于任何特定查询本身。有没有办法完成我正在做的事情?

2 个答案:

答案 0 :(得分:1)

您需要设置正确的触发器,为在同一频道上使用NOTIFY的所有客户端调用LISTEN

很难确定在触发器中如何准确实现NOTIFY逻辑,因为它取决于以下内容:

  • 邮件的目标客户数量是多少?
  • 正在评估的查询有多重/多?
  • 触发器能否知道查询的逻辑以进行评估?

根据答案,您可能会考虑不同的方法,包括但不限于以下选项及其组合:

  • 在无法评估结果时执行查询/视图,并缓存结果
  • 如果可以评估查询的结果,则提供智能通知
  • 使用payload将更新详细信息传递给侦听器
  • 安排查询/查看重新运行,以便延迟执行(如果它很重)
  • 将整个通知作为单独的工作

某些情况会变得非常复杂。例如,您可能有一个可以进行更改的主客户端,以及需要通知的多个从属服务器。在这种情况下,主服务器执行查询,检查结果是否已更改,然后调用PostgreSQL服务器中的函数以触发所有从服务器上的通知。

因此,根据手头任务的具体要求,可能会有很多变化。在您的情况下,您没有提供足够的详细信息来提供任何特定路径,但上述一般指导原则可以为您提供帮助。

答案 1 :(得分:0)

Async& LISTEN / NOTIFY是正确的方式!

您可以在UPDATE / INSERT上添加触发器,在触发器主体中执行查询,在简单表中保存行数,如果值更改了调用通知。如果在查询中需要多个参数组合,则可以从程序内部创建/销毁触发器。