单机 Broker 能撑到什么时候
如果你维护过物联网平台,大概率会经历过这样一个阶段:设备数量过了一个临界点后,原本稳定的 MQTT Broker 开始出现各种问题——连接被反复断开、CPU 使用量无征兆地飙到 90%、消息延迟从几十毫秒跳到好几秒,而且再往上加资源,效果也依旧有限。

这不是单台机器性能不够,而是单 Broker 架构本身把扩展性锁死了。MQTT Broker 的责任并不只是转发消息,它要为每个连接维护会话状态、遗嘱和 QoS 队列,还要在内存中保存主题树和订阅关系。设备接入量上来之后,CPU 主要消耗在解析 MQTT 报头和扫描主题匹配上,内存则被会话队列占满。更关键的是,MQTT 是长连接协议,连接数对资源的占用是持续的,即使设备 30 秒才发一条消息,连接对象、协议缓冲和网络栈资源也不会释放。
以车联网场景为例,车辆上报位置、电量、诊断信息,单条消息不大,但十万辆车同时在线,连接数就是几十万。单机 Broker 最先扛不住的不是业务逻辑,而是文件描述符和内核的连接表。你可能会把 fd 上限调到 10 万,但连接风暴来临时,SYN 队列积压、TCP 重传、心跳超时又会引发大规模断连重连,最后系统在雪崩中彻底失去响应。
因此,“大规模”在这个语境下不是一个模糊的形容词,而是一个可量化的临界点:当你发现单机上的所有资源都在为连接状态服务,而不是为业务消息服务时,单 Broker 架构就已经走到头了。接下来自然要考虑如何把压力分散到多台机器上。
集群模式是标准答案吗
Broker 集群是很多团队第一反应会选择的方案。以 EMQX、HiveMQ 为代表的集群,本质上都是把多个 Broker 节点组织成一个逻辑节点。客户端连接到任何一个节点,集群内部通过哈希或共享订阅转发消息。相比单机,集群确实解决了高可用的问题——一个节点挂了,其他节点可以接管连接和会话,而且通过横向加节点,整体吞吐和连接数也都能往上走。
但集群不是免费的。集群内部需要同步订阅树、路由表和会话元数据,节点之间靠分布式协调服务或共享存储来维持一致性。节点越多,内部协调的消息量就越大,对网络延时的要求也越苛刻。为了保持同一个客户端的 session 不丢失,节点之间还得做会话同步,这在跨机房场景下几乎无法做到低延迟。
举个例子,一个覆盖全国的物联网平台,如果只用一个集群,设备在上海接入,中央分析系统在北京,消息就要从上海节点的内存路由到北京节点,再跨机房传输。如果两个机房之间 RTT 是 30 毫秒,一个消息要走两次 RTT,延迟立刻多出 60 毫秒。更麻烦的是,集群节点之间需要保持心跳和同步,网络抖动会引发节点脑裂,导致大量 session 重建。
所以,集群模式适合单地域、中等规模、业务对一致性和顺序性要求较高的场景。一旦问题变成“跨地域”、“多租户”、“超大连接数”,集群就会显得力不从心,消息网格的价值也随之清晰。
下面这张表总结了三种架构形态的基本特征,方便你做初步判断:
| 架构形态 | 连接规模 | 消息路由 | 运维复杂度 | 典型适用场景 |
|---|---|---|---|---|
| 单机 MQTT Broker | 万级~十万级 | 本地主题树 | 低 | 原型验证、小规模设备 |
| Broker 集群 | 十万~百万级 | 集群内部节点转发 | 中 | 单地域、中等规模平台 |
| 消息网格 | 百万级以上 | 跨集群桥接与动态路由 | 高 | 跨地域、多租户、海量设备 |
消息网格到底改变了什么
消息网格并不是一个具体的软件产品,而是一套架构范式。它的核心是把“一个 broker 集群”拆成多个自治的集群,再通过消息路由层把它们连成一张逻辑上的网。每个集群只负责本区域的设备和计算任务,只有确实需要跨域的消息才会被转发到其他集群。这很像微服务架构:单个服务可以独立伸缩,服务之间的通信通过网关或服务网格治理。
网格内部有几个关键组件:连接层、路由层和治理层。连接层由多个集群各自承担,负责设备接入;路由层负责主题匹配和消息转发,决定一条消息应该留在本地还是发给远端集群;治理层则是网格的“大脑”,统一管理主题映射、路由规则和策略。这类比于服务网格中的控制平面和数据平面。
桥接(Bridge)是路由层最常见的实现方式。虽然桥接不是 MQTT 协议标准内容,但几乎所有主流 broker 都会提供类似能力。下面是一个典型的跨集群桥接配置:
bridge:
cluster: 'cluster-east'
remote:
- name: 'cluster-west'
uris: ['tcp://10.20.1.5:1883']
topic: 'device/+/telemetry'
qos: 1
forward: true
back: true
这段配置表达的意思是:本集群中所有满足 device/+/telemetry 主题的消息,都会以 QoS 1 发送给远端集群 cluster-west。同时允许远端集群把相同主题的消息送回来。这样,两个区域的设备虽然连接在不同的 broker 集群上,但它们的消息可以在一个主题空间内互相可见。
但是,消息网格的价值并不止于桥接。更成熟的网格会在桥接之上增加统一路由控制面,支持动态路由、主题映射和策略下发。例如当某个租户的流量突增时,你可以通过控制台把该租户的主题路由切换到另一个空闲集群,整个过程不影响设备在线状态。这是静态桥接做不到的。
网格带来的核心收益有三点:区域自治、租户隔离和故障隔离。区域自治意味着各集群本地处理本区域的连接和消息,不需要跨地域同步全量状态;租户隔离让不同业务的流量在路由层面分开,避免互相影响;故障隔离则保证单个集群出现故障时,消息可以通过备用路由通道绕过,不至于全网瘫痪。
当然,网格的代价也很明确:跨集群消息转发多一次网络跳数,延迟自然高于集群内转发;QoS 1 甚至 QoS 2 的消息在桥接时会产生确认开销,吞吐量会有所下降;而且多集群的监控、升级和排障复杂度,会远远超过单集群。喜欢干净架构的人,往往会在运维阶段被网格折磨到怀疑人生。
三个最容易踩的设计误区
消息网格概念听起来很诱人,但落地时很容易掉进几个坑里。
- 误区一:把消息网格等同于 Broker 集群。集群强调的是单个系统内多节点高可用,网格强调的是集群之间的连接治理。一个是“横向扩容”,一个是“网状拓扑”。如果只是想要一台备份机或负载均衡,直接搭集群就行,不必引入网格。
- 误区二:用消息队列的思路设计 MQTT 网格。很多人习惯把 Kafka、Pulsar 的模式套到 MQTT 上,用中心日志存储所有消息,再让下游去消费。但 MQTT 有 QoS、遗嘱、保留消息和会话连续性,这些语义在网格中需要保留。把 MQTT 消息倒入 Kafka 后,设备侧的实时性管理和主题分发逻辑反而会变得支离破碎。
- 误区三:忽略跨集群的延迟与一致性代价。桥接本质上是远程转发,必然引入网络延迟。在两个集群之间做消息同步时,一旦发生网络分区,消息顺序和状态无法保证。如果业务要求全链路严格有序,那么网格基本给不了这个承诺,还不如把消息集中在一个集群里处理。
什么样的团队才需要消息网格
并不是所有 IoT 平台都需要消息网格。如果你的设备集中在一个园区或一栋楼,单集群或几台 broker 已经足够。盲从网格会让架构复杂度失控,运维成本高出一截。但当下面几个信号出现时,网格就值得认真考虑了。
- 设备分布在多个地理区域,每个区域都需要独立的控制面或故障域,比如边缘机房和中心云独立运行。
- 多个业务线需要共享一套消息基础设施,但配置、权限和流量必须隔离。
- 单集群的节点规模已经达到几十台,内部协调延迟开始影响业务稳定性。
- 某个区域的网络故障或 broker 升级,绝不能波及其他区域的设备通信。
如果你只是想要更高的消息吞吐,那通常还不是网格的问题。先把单集群调优到极致——比如用共享订阅把消息压力分散给多个 consumer,用压缩降低网络带宽——往往比直接上网格有效得多。
落地:从单机到网格的四步走
如果你决定走向消息网格,建议不要一上来就搭大网。按下面四步平滑演进,每一步都给自己留出验证空间。
- 第一步:规划主题空间。主题命名必须带上区域和业务信息,例如
region/tenant/device-type/event。为什么?因为路由规则的编写到这个层级才有意义。如果主题里没有租户信息,你就不可能按租户隔离流量。主题空间规划不做好,后续每一个路由规则都是补丁。 - 第二步:先修炼单集群。在单集群内解决连接管理、消息吞吐和持久化问题。确保所有设备在同一个集群下能够稳定运行,再考虑跨集群。你可以用共享订阅解决同一消息被多个后端消费的问题,用保留消息和延迟消息减少不必要的网络流量。单集群的稳定性是网格的基石,地基没打好就上网格,只会放大故障。
- 第三步:引入集群桥接。在两个集群之间配置桥接,先从少数几个主题开始,验证消息质量、顺序和网络延迟。建议先用 QoS 0 或 1 做灰度,观察数据完整性后再放开。同时要在两端配置认证和权限,避免桥接通道成为安全盲区。
- 第四步:建立统一路由控制面。当桥接规则越来越多,手工配置无法维护时,再引入配置中心和路由引擎。通过控制面下发主题映射、路由规则和策略,实现动态调整。这一步做得好,网格才真正具备生产落地的能力,而不是一个手工拼装的桥接网络。
演进不是目的,问题才是
消息网格是 IoT 消息架构演进到一定阶段后的自然形态,但它不是终点,也不是必须跨越的阶段。关键还是回到业务诉求:你的设备分布在什么地域,你的团队正在承受什么瓶颈,你的业务对隔离和连续性有多高的要求。如果集群能解决问题,就不要先扩大复杂度;如果跨地域和租户隔离成为紧约束,再果断走向网格。架构演进的每一步,都应该由真实压力和明确边界推着走,而不是跟着概念走。
原创文章,作者:fudengji,如若转载,请注明出处:https://fudengji.cn/article/840/