任何使用LISTEN&NOTIFY(或NodeJS)实时监控Postgresql查询更改的方法?

所以我有一个自定义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之类的节点库,但是我更愿意使用与现有的Postgres LISTEN / NOTIFY一起工作的pg-pubsub,以避免不必要的开销。 不过,据我所知,PostgreSQL TRIGGERs只能在UPDATE / INSERT / DELETE操作上工作,而不是在任何特定的查询上。 有什么办法来完成我在做什么?

asynchronous&LISTEN / NOTIFY是正确的方法!

您可以在UPDATE / INSERT上添加触发器,并在触发器主体中执行查询,在简单表格中保存行数,如果值更改,则调用NOTIFY。 如果你在查询中需要多个参数组合,你可以在你的程序中创build/销毁触发器。

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

很难告诉你如何在触发器中实现你的NOTIFY逻辑,因为它取决于以下几点:

  • 该消息有多less客户端?
  • 被评估的查询有多大/多大?
  • 触发器是否可以知道查询的逻辑来评估它?

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

  • 当结果无法评估时执行查询/查看,并caching结果
  • 提供智能通知,如果查询的结果可以评估
  • 使用payload将更新详细信息传递给侦听器
  • 计划查询/查看重新执行,如果它很重
  • 做整个通知作为一个单独的工作

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

再次,根据手头任务的具体要求,可能会有很多变化。 在你的情况下,你没有提供足够的细节来提供任何具体的path,但上面的一般准则应该可以帮助你。