socket-mqtt对等集群负载均衡:注册中心与SLB/CLB双方案实战指南
【免费下载链接】socket-mqtt基于Netty+MQTT的高性能推送服务框架。支持普通Socket、MQTT、MQTT web socket协议。非常方便接入上层业务实现推送业务。项目地址: https://gitcode.com/gh_mirrors/so/socket-mqtt
socket-mqtt 是一个基于 Netty4.x + MQTT 的高性能推送服务框架,支持普通 Socket、MQTT、MQTT WebSocket 三种协议。单机可支撑数十万连接,但生产环境离不开对等集群 + 负载均衡。本文带你实战 socket-mqtt 内置的两种负载均衡方案:传统注册中心负载均衡与云厂商 SLB/CLB 负载均衡,并附选型建议与验证方法。
📌 为什么推送服务必须做集群负载均衡
单台推送节点的连接数和吞吐量都有上限,业务增长后你会遇到三个问题:
- 容量瓶颈:单节点连接数到顶,需要多节点分摊;
- 高可用:单点故障会导致所有在线设备失联;
- 连接不均:新连接若不挑节点,容易形成"热节点"拖垮局部性能。
socket-mqtt 在根目录的LOAD_BALANCE.md中给出了两套对等集群方案,分别适配自建机房与云原生两种部署环境。
🏗️ 方案一:注册中心负载均衡(适合自建机房)
工作原理:三步完成最小连接数调度
- tcp-server(Broker 节点)启动后向tcp-center(注册中心)注册,并持续上报自身状态:IP、PORT、当前连接数等;
- tcp-center将各节点状态信息存储到 Redis 中;
- Client连接前先调用 GetTCPIP 接口获取 server 列表(按最小连接数排序),从第一个节点开始尝试建立连接。
状态上报由框架内置的ServerStateReportJob完成(源码见src/main/java/com/yb/socket/service/center/ServerStateReportJob.java):服务端启动后每 5 秒向注册中心发送一条updateConnects消息,携带节点 IP、端口和实时连接数,保证注册中心始终能调度到最空闲的节点。
快速上手:Demo 的三种角色
测试目录已内置完整"带注册中心"示例(src/test/java/com/yb/socket/center下):
- 注册中心:
CenterMock1.java,监听 9000 端口,响应getServerInfo查询并接收状态上报; - Broker 节点:
Server1.java/Server2.java,模拟集群中的多台推送节点; - 业务客户端:
ClientTest.java,自动通过注册中心挑选节点连接。
服务端只需一行配置,声明注册中心地址(可配置多个实现注册中心自身的高可用):
Server server = new Server(); server.setPort(8000); server.setCenterAddr("127.0.0.1:9000,127.0.0.1:9010"); server.bind();客户端配置同样的地址,connect()时会自动查询注册中心、按最小连接数挑选 Broker:
Client client = new Client(); client.setCenterAddr("127.0.0.1:9000,127.0.0.1:9010"); client.connect();💡
setCenterAddr同时支持 Server 与 Client 两端,定义分别位于src/main/java/com/yb/socket/service/server/Server.java和src/main/java/com/yb/socket/service/client/Client.java。
查看各节点负载,确认均衡生效
socket-mqtt 自带状态监控组件(src/main/java/com/yb/socket/status包),开启状态端口后(默认 8001),用telnet ip 8001; get status即可查询任意节点的连接数、消息量、心跳数。集群中逐台比对连接数,就能直观确认负载均衡是否生效:
☁️ 方案二:SLB/CLB 负载均衡(适合云原生)
如果部署在云上,方案更简单:
- 客户端直连云厂商的SLB/CLB实例;
- SLB/CLB 按最小连接数策略选择一个后端 Server 建立连接;
- 无需注册中心,也无需 web-server 代理。
高可用、健康检查、流量分发全部交给云厂商,既节省了 web-server 服务器成本,也降低了客户端复杂度。代码侧只需把客户端连接地址换成 SLB 的域名或 VIP,ClientAPI 完全不变。
⚖️ 两种方案怎么选
| 对比维度 | 注册中心方案 | SLB/CLB 方案 |
|---|---|---|
| 适用场景 | 传统自建机房 | 云原生架构 |
| 额外组件 | tcp-center + Redis | 无(云厂商提供) |
| 客户端复杂度 | 需先查询节点列表再连接 | 低,直连 SLB |
| 调度策略 | 最小连接数排序 | 最小连接数策略 |
| 成本特点 | 需自建注册中心,避开 SLB 技术复杂度 | 按 SLB 计费,省 web-server 成本 |
⚖️ 经验法则:自建机房 → 注册中心方案;云上部署 → SLB/CLB 方案。最终选型需结合实际业务情况决定。
📈 验证集群效果:监控与压测
集群上线后,用两类数据验证负载均衡效果:
- 节点级:周期查看各节点
connects连接数,确认连接分布均匀; - 系统级:用 dstat 等工具观察负载。下图是 socket-mqtt 承载 1 万客户端下行消息推送压测时,CPU 与网络负载的监控快照(网络发送稳定在 120MB/s 以上,CPU 使用率保持健康):
单机推送能力可参考项目根目录README.md中的压测报告:单 Broker(8核16G)下行 TPS 16万+、上行 TPS 17万+,千兆网卡流量基本打满。
🧾 关键配置速查表
| 配置项 | 作用 | 说明 |
|---|---|---|
server.setCenterAddr("ip:port,ip:port") | 服务端注册中心地址 | 支持多注册中心,实现注册中心高可用 |
client.setCenterAddr("ip:port,ip:port") | 客户端注册中心地址 | 连接前自动查询负载最小的节点 |
server.setOpenStatus(true) | 开启状态查询端口 | 默认 8001,telnet 查看节点状态 |
server.setCheckHeartbeat(true) | 心跳检测 | 剔除死连接,保证均衡统计准确 |
server.setSocketType(SocketType.MQTT) | 协议类型 | 支持 NORMAL / MQTT / MQTT_WS |
🎯 总结
socket-mqtt 以极低的业务侵入成本实现了推送服务的对等集群负载均衡:
- 注册中心方案:服务端每 5 秒上报状态,客户端按最小连接数调度接入,适合自建机房;
- SLB/CLB 方案:客户端直连云负载均衡器,高可用交给云厂商,适合云原生部署。
clone 仓库后运行src/test/java/com/yb/socket/center目录下的示例,即可快速跑通完整的集群 Demo:
git clone https://gitcode.com/gh_mirrors/so/socket-mqtt【免费下载链接】socket-mqtt基于Netty+MQTT的高性能推送服务框架。支持普通Socket、MQTT、MQTT web socket协议。非常方便接入上层业务实现推送业务。项目地址: https://gitcode.com/gh_mirrors/so/socket-mqtt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考