任何使用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,但上面的一般准则应该可以帮助你。