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

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屏幕阅读器(讲述人)开启与关闭【教程】


2025-11-22
浏览次数:次
返回列表