FreeMQTT Plus 是一个MQTT Broker 集群的实现
- 首创黑白(A/B)节点架构。
- FreeMQTT plus 是用Python语言并基于Tornado框架开发的。
本文阐述这种黑白(A/B)节点架构是如何提升MQTT Broker集群的可靠性、可扩展性。
一、架构基础分工
- 黑节点 A(接入 Broker) :对外承载设备 TCP/WS/TLS 连接,存储本地客户端会话、订阅、离线消息、Retain 消息;对等无主从。
- 白节点 B(路由总线 FreeMQTT BUS) :客户端无感知,只负责跨 A 节点消息路由、会话查询、共享订阅分发;所有 B 组成分布式路由总线,无中心化路由节点。
- 节点间通信仅基于 MQTT5 原生扩展,无 Redis/ZooKeeper/Gossip 等第三方依赖,消除外部中间件单点故障。
二、对系统可靠性的提升逻辑
1. 消除多层单点故障风险
- 无主从架构:所有 A 节点对等、所有 B 节点对等,不存在主节点宕机集群瘫痪问题;任意 A/B 实例下线,剩余节点自动承接流量。
- 剥离外部依赖:传统 MQTT 集群依赖 Redis/etcd 存储会话、协调集群,一旦中间件故障全集群不可用;A/B 架构仅自身 MQTT5 互通,少一层故障面。
- 故障隔离(职责拆分)
- A 节点故障:仅丢失本机在线设备,客户端重连其他 A 节点;通过 B 总线全局查询会话,自动恢复订阅、离线消息、遗嘱,无需粘性会话。
- B 节点故障:其余 B 节点组成完整路由总线,消息转发不受阻断;B 无客户端连接,故障影响范围极小。
2. No Sticky Session 无粘性会话,大幅提升故障容灾
传统集群必须把同一设备固定绑定单一 Broker(粘性会话),该节点宕机后会话丢失、QoS1/2 消息丢失、重连失效。 A/B 架构机制:
- 设备随机重连任意空闲 A 节点;
- 新 A 节点通过 B 总线广播
SESSION_QUERY元指令,查询全集群所有 A 节点; - 持有该 ClientID 会话的原 A 节点返回订阅、未确认消息、Retain 信息;
- 当前 A 节点重建完整会话,业务无感知恢复,断连、节点宕机均不会丢失会话数据。
3. 分布式会话 / 消息存储,无中心存储崩溃风险
会话、订阅、离线消息分散存储在各个 A 节点,不集中存放于共享存储;不存在 “中心存储宕机导致全部设备会话清空” 的致命问题。 Retain 消息、共享订阅由 B 节点跨 A 同步,发布后全集群可见,单一 A 节点下线不丢失保留消息。
4. 分层限流与故障熔断,避免雪崩
连接压力(A 节点)、路由转发压力(B 节点)物理隔离:
- 海量设备并发断线重连只会冲击 A 接入层,不会挤占跨节点路由带宽;
- 消息洪峰仅占用 B 总线资源,不会压垮设备连接服务; 单一模块过载不会连锁拖垮整套集群。
三、对系统可扩展性的提升逻辑
1. 连接层与路由层独立横向扩容,按需拆分资源瓶颈
两类节点负载完全解耦,可独立扩容,精准匹配业务瓶颈:
- 设备连接数不足 → 只加 A 节点 A 专门承载百万级 TCP 长连接,扩容 A 即可提升接入上限;单机可多开 A 节点突破 Python GIL 多核限制,充分利用 CPU 多核资源。
- 跨节点消息吞吐、共享订阅压力大 → 只加 B 节点 B 作为路由总线,新增 B 节点自动加入 BUS 分担转发、查询压力,路由带宽线性提升。 传统一体化 Broker 集群只能整体扩容,连接与路由资源绑定,资源浪费严重。
2. 扩容无停机、无数据迁移、无分片重平衡
- 新增 A/B 节点直接加入集群,自动通过 MQTT5 总线同步集群成员,无需重启集群、无需迁移会话分片;
- 不存在分片迁移带来的消息抖动、会话丢失;
- 支持单机多 A/B、多机器分布式混合部署,从十几台设备到百万终端平滑扩容。
3. 天然适配容器弹性扩缩容
单一 Docker 镜像同时支持 A、B 模式,Docker Swarm/K8s 可分别对 A、B 两组服务设置独立弹性策略:
- 白天设备在线高峰自动扩容 A;
- 夜间上报消息突增自动扩容 B; 扩缩容逻辑互不干扰,资源利用率最大化。
4. 集群能力无上限,跨租户线性扩展
- 多租户隔离内置在 A 节点,新增业务只需新增 A 节点承载独立租户流量,租户间主题、ClientID 完全隔离;
- B 总线全局共享,多租户共用一套路由层,不用为每条业务线单独搭建完整集群,降低扩容成本。
5. 解决 Python GIL 瓶颈,单机垂直扩展能力拉满
Python 单进程受 GIL 限制只能单核跑;A/B 分离架构支持单机部署多组 A、B 进程,每个进程绑定独立 CPU 核心,单机并发连接、消息吞吐可随 CPU 核心数线性提升,单机即可支撑十万级设备,不用过早拆分多服务器集群。
四、总结:A/B 架构核心价值浓缩
- 可靠性提升根源 职责分层隔离故障、无主从无单点、无外部中间件依赖、无粘性会话实现会话自动迁移、分布式存储规避中心数据崩溃,断连 / 节点宕机不丢会话与消息。
- 可扩展性提升根源 接入层 (A)、路由层 (B) 独立弹性扩容,单机突破 Python 多核限制,容器化快速扩缩,扩容无需停机迁移,连接与路由资源按需分配,适配从小规模到百万级终端平滑演进。