新闻中心

postgresqlpublishsubscribe如何构建_postgresqlpubsub机制

2025-11-22
浏览次数:
返回列表
PostgreSQL通过逻辑复制实现发布/订阅,支持行级数据变更同步。配置需设置wal_level=logical,创建发布者和订阅者,确保表结构一致并配置网络权限。发布者使用CREATE PUBLICATION指定表,订阅者通过CREATE SUBSCRIPTION连接并同步数据。复制依赖主键或REPLICA IDENTITY,不传播DDL,且订阅端默认只读。可通过NOTIFY/LISTEN扩展实现实时事件通知,适用于数据同步与轻量级消息推送。

postgresqlpublishsubscribe如何构建_postgresqlpubsub机制

PostgreSQL 的发布/订阅(Publish/Subscribe)机制是通过其内置的 逻辑复制(Logical Replication) 功能实现的,而不是一个通用的消息队列系统。它允许你将一个数据库中的数据变更(INSERT、UPDATE、DELETE)以行级粒度复制到另一个数据库实例。虽然不像 Redis 或 RabbitMQ 那样支持任意消息广播,但你可以基于它构建轻量级的 pub/sub 风格数据同步系统。

理解 PostgreSQL 逻辑复制如何支持 Pub/Sub

PostgreSQL 的逻辑复制基于“发布者(publisher)”和“订阅者(subscriber)”模型

  • 发布者(Publisher):指定哪些表的数据变更需要对外发布。
  • 订阅者(Subscriber):连接到发布者,并接收指定的数据变更,在本地应用这些更改。

这种机制天然具备“发布-订阅”语义,适合用于多副本数据同步、读写分离、数据分析等场景。

配置发布者(Publisher)节点

在作为发布者的数据库服务器上,需进行以下设置:

1. 修改 postgresql.conf

确保启用逻辑复制:

wal_level = logical

这个参数必须设置为 logical,否则无法使用逻辑复制。

2. 配置 pg_hba.conf 允许订阅者连接

添加一条 host 记录,允许订阅者 IP 连接:

host    all             all             192.168.1.20/32        md5

其中 192.168.1.20 是订阅者的 IP 地址。

3. 创建发布(Publication)

选择要发布的表并创建发布对象:

CREATE PUBLICATION mypub FOR TABLE users, orders;

也可以发布整个数据库中所有表:

CREATE PUBLICATION mypub FOR ALL TABLES;

配置订阅者(Subscriber)节点

订阅者会主动连接发布者并拉取数据变更。

巨蟹星云网上商城 巨蟹星云网上商城

一套自助创建网上商店的软件系统,具有界面变幻多彩、功能强大,使用傻瓜化、运行自动化的特点,任何人基本上不用学习,都能快速创建自己的网上商店,用这套系统做一个购物网站,就象做填空题一样容易。采用「巨蟹星云」可以建立诸如:网上花店、网上化妆品店、网上服装店、网上书店、网上点卡店、网上*店、网上玩具店、网上书店、网上手机店、网上数码产品销售店、网上保健品店、网上玩具店、网上车模店、网上音像制品店等

巨蟹星云网上商城 0 查看详情 巨蟹星云网上商城

1. 确保数据库结构一致

订阅者上的表结构必须与发布者一致(包括 schema、列类型、主键等),否则复制失败。

可以先从发布者导出 schema 并导入订阅者:

pg_dump -s -h publisher_host db_name | psql -d subscriber_db

2. 创建订阅(Subscription)

执行命令连接到发布者并开始复制:

CREATE SUBSCRIPTION mysub 
  CONNECTION 'host=192.168.1.10 port=5432 dbname=mydb user=replicator password=secret'
  PUBLICATION mypub;

PostgreSQL 会自动启动复制槽(replication slot)并开始同步初始数据和后续变更。

监控与维护

查看发布状态:

SELECT * FROM pg_publication;

查看订阅状态:

SELECT * FROM pg_stat_subscription;

查看复制槽情况(防止 WAL 堆积):

SELECT * FROM pg_replication_slots;

如果订阅中断,可尝试重启:

ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;

注意事项与限制

  • 表必须有主键或 REPLICA IDENTITY,否则 UPDATE/DELETE 无法正确复制。
  • DDL 变更(如 ADD COLUMN)不会自动传播,需手动同步 schema。
  • 不支持跨数据库发布,只能在同一个数据库内进行。
  • 订阅者默认为只读,避免在订阅端修改被复制的表。
  • 网络延迟或断连可能导致复制滞后,需监控 pg_stat_subscription

扩展:模拟轻量级事件通知

如果你希望用 PostgreSQL 实现类似“消息推送”的行为,可以在触发器中结合 NOTIFY 命令:

CREATE OR REPLACE FUNCTION notify_user_change()
RETURNS TRIGGER AS $$
BEGIN
  PERFORM pg_notify('user_update', row_to_json(NEW)::text);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
<p>CREATE TRIGGER trig_user_update
AFTER INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION notify_user_change();</p>

客户端使用 LISTEN user_update 监听通道,即可收到 JSON 格式的消息。这种方式更适合实时事件推送,而逻辑复制更适合数据同步。

基本上就这些。PostgreSQL 的 publish-subscribe 机制依赖逻辑复制完成数据流转,配置简单但要求严格。合理规划主键、权限和网络后,可稳定运行于生产环境。

以上就是postgresqlpublishsubscribe如何构建_postgresqlpubsub机制的详细内容,更多请关注其它相关文章!


# redis  # js  # json  # red  # 网上  # 巨蟹  # 主键  # word  # 通化网站优化报价多少  # 网站优化公司盈利模式  # 网站建设年限  # 贵港公司网站建设全包  # 亳州seo公司优选火星  # 汤阴县网站优化工具  # 天门二手车网站推广开户  # 青海定制型网站推广费用  # 大安市农技推广中心网站  # google关闭免费seo  # 如果你  # 是一个  # 自己的  # 如何应对  # 更适合  # 连接到  # 数据同步 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】  12306选座系统怎么选连座_12306选座多人连坐操作方法  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  React Hooks最佳实践:动态组件状态管理的组件化方案  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  b站怎么删除评论_b站评论管理与删除操作  Python类型检查:优化关联可选属性的Mypy推断策略  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  J*aScript数组对象转换:按指定键分组与值收集  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  曝R星经典之作开发图 设计简陋但信息密集!  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  谷歌推RCS信息存档功能:公司可监控员工私密信息!  J*aScript设计模式实践_j*ascript代码优化  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  Go语言中高效处理x-www-form-urlencoded表单数据  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  谷歌google账号怎么注册账号 谷歌账号注册官方流程  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  J*aScript中高效管理与清空动态列表:避免循环陷阱  AO3最新官网入口公告_2025AO3镜像站实时查询方法  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  微信网页版官方入口直达 微信网页版网页版登录使用方法  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  Python多线程中正确使用sigwait处理SIGALRM信号  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  c++项目目录结构应该如何组织_c++工程化项目结构规范  Win11怎么开启高性能模式_Windows 11电源计划优化设置  微信网页版登录教程_微信网页版登录入口在哪  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  C++如何解决segmentation fault_C++段错误调试与原因分析  Win10如何开启蓝牙功能_Windows10找不到蓝牙开关解决方法  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  J*aScript打印功能_j*ascript输出控制  c++ 命名空间怎么用 c++ namespace使用指南  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】 

搜索