---
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结构与版本
- 安全与权限控制

发表评论 取消回复