sql - 有什么方法可以使用 LISTEN 和 NOTIFY(或 NodeJS)实时监控 Postgresql 查询更改?

标签 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;

在我的 Node 服务器中,我希望每次查询中的行数发生变化时都能收到通知。我研究过使用 Node 库,例如 pg-live-query但我更愿意 pg-pubsub 与现有的 Postgres LISTEN/NOTIFY 一起工作,以避免不必要的开销。但是,据我所知,PostgreSQL TRIGGERs 仅适用于 UPDATE/INSERT/DELETE 操作,不适用于任何特定查询本身。有什么方法可以完成我正在做的事情吗?

最佳答案

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

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

  • 该消息面向多少客户?
  • 正在评估的查询有多大?
  • 触发器能否知道查询的逻辑以对其进行评估?

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

  • 无法评估结果时执行查询/ View ,并缓存结果
  • 如果可以评估查询结果,则提供智能通知
  • 使用payload将更新细节传递给监听器
  • 安排查询/ View 重新运行以延迟执行,如果它很重
  • 将整个通知作为一项单独的工作进行

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

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

关于sql - 有什么方法可以使用 LISTEN 和 NOTIFY(或 NodeJS)实时监控 Postgresql 查询更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46898870/

相关文章:

database - 在 Jython 中创建 RDF

php - 如何从n个表中只获取n条记录

mysql - SQL-Query 从 1 列中提取不同的值

node.js - 如何使用 postman 在nodejs中测试快速 session 类型的 session ?

node.js - 实体元数据未找到 : Node. js TypeScript TypeORM

mysql - 在MySQL中实现以下操作的更好方法?

sql-server - 将密码存储在数据库中以备后用

sql - Entity Framework 加入空条件

mysql - 如何改变这个MySql表的所有记录中这个字段的值?

node.js - 在单独的服务器上发布时,react 和 nodejs 发布问题