0

0

postgresqlpublishsubscribe如何构建_postgresqlpubsub机制

冰川箭仙

冰川箭仙

发布时间:2025-11-22 15:53:51

|

484人浏览过

|

来源于php中文网

原创

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)节点

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

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

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

下载

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;

CREATE TRIGGER trig_user_update AFTER INSERT OR UPDATE ON users FOR EACH ROW EXECUTE FUNCTION notify_user_change();

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

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

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

201

2024.02.23

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

389

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号