Hyperf3.1WebSocket 消息广播,多服务节点消息同步方案

风磊姑娘_2327

风磊姑娘_2327

2026-10-07

439人浏览

原创

hyperf 3.1 跨节点 websocket 广播需 redis 存储连接元数据(ws:connections:{uid} 和 ws:nodes),通过 pub/sub 或消息队列分发广播,nginx 启用 sticky 策略与长连接保活配置协同实现可靠广播。

hyperf3.1websocket 消息广播,多服务节点消息同步方案

Hyperf 3.1 的 WebSocket 广播在单机多 Worker 进程下靠 Sender 组件通过管道通信就能完成;但跨服务节点(即多个 Hyperf 实例部署在不同机器或容器)时,必须引入外部协调机制——因为每个节点的连接状态只存在于本机内存,彼此不可见。

连接归属需全局可查

广播前得知道“用户 A 当前连在哪台服务器上”。不能靠猜测或轮询,必须把连接元数据持久化到共享存储:

  • 用 Redis Hash 存储:ws:connections:{uid} 记录用户 ID 对应的 node_id:fd,同时设置过期时间(如 30 分钟),配合心跳刷新
  • 每个节点启动时注册自身 node_id(如 node-01)到 Redis Set:ws:nodes,便于后续广播时遍历或做健康剔除
  • 连接建立时写入,断开时主动删除;若异常断连,依赖心跳超时自动清理,避免脏数据

消息广播走中间件,不走节点直连

禁止让节点 A 主动调用节点 B 的 HTTP 接口推送消息——易引发雪崩、环路、超时堆积。推荐两种稳定路径:

Hyperframes Creative
Hyperframes Creative

HyperFrames视频非动画创意指导,包括设计规范(frame.md/design.md)处理、配色、字体设计、旁白及节奏规划等。

下载
  • Redis Pub/Sub:业务服务发布消息到频道 ws:broadcast,所有节点都订阅该频道;收到后,查本地连接缓存 + Redis 元数据,只向本节点管理的 fd 推送
  • RabbitMQ/Kafka:更适合高吞吐或需消息持久、重试、顺序保障的场景;各节点作为消费者,消费后按连接归属做本地投递

Nginx 层必须做连接粘性

否则客户端 WebSocket 握手请求被轮询到不同节点,导致同一用户多次重复连接、旧连接残留、广播错乱:

  • 用 ip_hash 最简单,适合公网 IP 相对稳定、移动端不多的场景
  • 用 OpenResty 或 Nginx Plus 的 sticky cookie 更精准:首次响应写入 route=node-01,后续请求带该 cookie 路由固定节点
  • 禁用 least_conn 和纯轮询;WebSocket 不是短连接,负载均衡策略要为长连接服务

保活与生命周期协同

从客户端、Nginx 到后端,每一层都可能静默断连,必须统一应对:

  • Nginx 配置 proxy_read_timeout 3600、proxy_send_timeout 3600、proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade
  • Hyperf 启用 ping/pong 帧(默认已支持),间隔建议 30 秒;收到 pong 后更新 Redis 中该连接的最后活跃时间
  • 断连回调中,不仅清理本地 fd,还要发一条「连接失效」事件到 Redis Pub/Sub,通知其他节点同步剔除该用户缓存

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4329

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3835

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6952

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6622

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1016

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5878

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习