---

title: PostgreSQL 事件触发与异步队列集成(Event Trigger、LISTEN/NOTIFY 与验证)

date: 2025-11-26

keywords:

  • Event Trigger
  • LISTEN
  • NOTIFY
  • 异步队列
  • 审计

description: 使用事件触发与LISTEN/NOTIFY集成异步处理与审计,捕获DDL/DML事件并投递到队列或工作进程,提供实现与验证方法。

tags:

  • Event Trigger
  • LISTEN
  • NOTIFY
  • PostgreSQL
  • 审计
  • 异步队列
  • 数据与存储
  • 数据库

categories:

  • 文章资讯
  • 编程技术

---

概述

Event Trigger用于捕获DDL事件,LISTEN/NOTIFY用于应用层异步通知。结合工作进程或队列可实现审计与衍生处理,降低耦合并提升可扩展性。

关键实践与参数

  • 触发范围: ddl_command_end 捕获DDL结束事件
  • 通知频道: NOTIFY channel, payload
  • 监听进程: 应用连接 LISTEN channel
  • 可靠性: 对重要事件使用队列与重试机制

示例/配置/实现

CREATE OR REPLACE FUNCTION fn_ddl_notify() RETURNS event_trigger AS $$
BEGIN
  PERFORM pg_notify('ddl_events', json_build_object('tag', TG_TAG, 'time', now())::text);
END; $$ LANGUAGE plpgsql;
CREATE EVENT TRIGGER trg_ddl_notify ON ddl_command_end EXECUTE FUNCTION fn_ddl_notify();
CREATE OR REPLACE FUNCTION fn_order_notify() RETURNS trigger AS $$
BEGIN
  PERFORM pg_notify('order_events', json_build_object('id', NEW.id, 'op', TG_OP, 'time', now())::text);
  RETURN NEW;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER trg_order_notify AFTER INSERT OR UPDATE ON orders FOR EACH ROW EXECUTE FUNCTION fn_order_notify();
// Node.js 监听
import { Client } from 'pg'
const c = new Client({ connectionString: process.env.DATABASE_URL })
await c.connect()
await c.query('LISTEN ddl_events')
await c.query('LISTEN order_events')
c.on('notification', (m) => { console.log('event', m.channel, m.payload) })

验证

  • 事件捕获: 执行DDL与DML产生对应通知
  • 应用监听: 监听进程收到事件并记录
  • 队列集成: 对重要事件写入队列并重试处理
  • 审计: 保留事件日志与处理结果

注意事项

  • LISTEN/NOTIFY为最佳努力传递,关键事件需持久化队列
  • 事件频率高时注意连接与资源占用
  • 规范payload结构与版本
  • 安全与权限控制

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部