把一套物联网消息服务端塞进树莓派或工业网关,只占百兆内存,端到端延迟压到半毫秒以内,Roger Light 发起的 Eclipse Mosquitto 靠这套本事攒下了 11.4k 星标、2.7k 分叉和 4,890 次代码提交。但在云原生厂商的宣传单上,它常被画成吞吐量见顶、延迟飙升的陪跑靶子。两张面孔背后,其实是单节点资源效率与多核分布式架构的正面冲撞。

先把这套工具的家底交清。Eclipse Mosquitto 是完整支持 MQTT 5.0、3.1.1 和 3.1 协议的开源服务端实现,采用 EPL 与 EDL 许可,并在 2.0.6 版本中将 EDL-1.0 的 SPDX 标识符对齐为文本一致的 BSD-3-Clause。它不止一个服务端,还自带 C 与 C++ 客户端库,配齐了用于发布订阅的 mosquitto_pub、mosquitto_sub、mosquitto_rr,以及负责管理控制的 mosquitto_ctrl、mosquitto_signal 和 mosquitto_passwd,Windows 与跨平台开发者还能直接通过 vcpkg 集成安装。

截至 2026 年 11 月 15 日核查,项目最新维护版本是 2026 年 2 月 9 日发布的 2.1.2 版本。顺着 2.1 系列看下来,它的工程边界正在收紧:

  • 协议与桥接补强,2.1.0 新增了由服务端创建的主题别名,并加入 bridge_receive_maximum 与 bridge_session_expiry_interval 等 MQTT 5 桥接参数。
  • 底层约束收严,2.1.2 明确禁止同时启用 persistence true 与持久化插件,并修复了 OpenBSD 构建、Docker 镜像缺失 libedit 以及 CMake 下 libwebsockets 静态与共享链接冲突。
  • 编译依赖高度模块化,cJSON 是唯一硬性必选依赖,而 sqlite3 持久化、openssl 加密、libmicrohttpd 接口、libedit 交互命令行、c-ares 域名解析、pthreads 客户端线程安全、内置的 uthash 与 utlist 头文件以及生成手册所需的 xsltproc 均可按需裁剪。
  • 安全策略默认收敛,无配置启动仅允许本机匿名访问,跨机通信必须显式配置监听器与认证机制。
Eclipse Mosquitto 2.1 演进与性能核心坐标 4,890 GitHub 累计提交 最新维护版 2.1.2 支持 MQTT 5.0/3.1.1 0.47ms QoS 0 平均延迟 64 字节轻负载实测 领先多核分布式对手 318M 37k/s 触顶时内存 同场对手占 5.02G 单节点轻量级天花板 >1.0s 万级客户端写盘阻塞 Issue #3796 暴露 同步重写全量配置

跑分罗生门背后的内存账本

很多团队在选型时会被两份截然相反的测试报告搞晕。一份说它快如闪电,另一份说它延迟高达几百毫秒。我不太买账的是脱离内存账本和负载水位的单边跑分。把两份测试摆在一起,账目其实一目了然。

测试基准与版本吞吐水位与负载平均端到端延迟内存占用与架构状态
Mosquitto 2.0.7 (2021 同行评审)64 字节轻负载0.47 ms / 0.50 ms / 0.98 ms (QoS 0/1/2)单线程未饱和,延迟全场最低
EMQX 4.2.7 / HiveMQ CE 2020.264 字节轻负载0.59-1.35 ms / 2.07-4.48 ms多核运行时调度开销显露
Mosquitto 2.0.15 (关闭持久化)约 37k/s 收发触顶353.82 ms仅占 318M 内存,单核陷入过载
EMQX 4.4.16 (官方点对点基准)50k/s 收发稳定1.58 ms消耗 5.02G 内存,多核并发换容量

在 2021 年那项基于 64 字节负载的云环境同行评审测试中,Mosquitto 2.0.7 在 QoS 0、1、2 下的延迟只有 0.47 ms、0.50 ms 和 0.98 ms,把同场测试的 EMQX 4.2.7(0.59 ms、1.35 ms、1.22 ms)和 HiveMQ CE 2020.2(2.07 ms、4.48 ms、3.38 ms)全数甩在身后。原因不难理解,C 语言直通车没有 Erlang 虚拟机或 JVM 的跨核调度与垃圾回收税。

到了 EMQX 官方发布的点对点测试里,Mosquitto 2.0.15 在吞吐率爬升到约 37k/s 时触顶,平均延迟拉高到 353.82 ms。但这根本不是同等水位下的延迟比拼,而是把单线程服务端硬推过饱和临界点的容量极限测试。更有意思的数字在角落里,Mosquitto 扛下 37k/s 时的平均内存只有 318M,而维持 50k/s 速率、1.58 ms 延迟的 EMQX 4.4.16 吃掉了 5.02G 内存。另外还要小心跑分里的口径魔术,50k/s 的发布加上 50k/s 的接收,实际只是 5 万条点对点投递,绝不能在算容量时被包装成 10 万级吞吐。

拿五千兆内存的分布式重骑去笑话三百兆的单核轻骑,账算错了。

官方推荐插件在万级规模下的三座暗礁

如果只看官方文档,跨机部署时启用动态安全插件(Dynamic security)加持久化似乎是标准答案。但设备规模一旦从几千台跨进数万台,这套标准答案就会撞上底层架构的硬墙。

第一道墙是动态安全插件的同步写盘。GitHub 上的 Issue #3796 撕开了这个痛点,当实例挂载数万个客户端时,每次通过动态安全插件修改权限,服务端都会同步重写整份安全配置文件,直接导致主进程冻结阻塞 一秒甚至更久。与之伴生的还有 Issue #3769 暴露的算力卡点,插件默认执行的 PBKDF2 密码哈希计算在高并发注册时开销沉重,社区不得不请求支持配置迭代次数,或允许通过 $CONTROL 主题直接传入预哈希密码。

规模跃迁时的三条性能断层线 第一层:动态安全插件同步写盘阻塞 (Issue #3796 / #3769) 数万客户端下全量重写安全配置冻结主线程超 1 秒,叠加 PBKDF2 哈希算力开销 第二层:持久化快照膨胀与重启恢复隐患 (Issue #2733 / #769) 飞行消息激增推高快照写入成本,2.1.2 严禁内置持久化与插件混用 第三层:单线程扇出衰减与桥接隔离 (Issue #216) 消费者与订阅数增长时吞吐量非线性下滑,桥接无法提供共享状态高可用

第二道墙在持久化与状态恢复。早在 2023 年 4 月 8 日关闭的 Issue #2733 中,社区就反复争论过随着飞行消息(in-flight messages)堆积,全量快照写入磁盘的成本失控问题,这也是项目引入 SQLite 增量持久化插件的动因。历史上的 Issue #769(已于 2020 年 8 月修复)更曾给运维人员上过一课,当时服务端重启后因未能正确恢复客户端用户名,导致离线客户端积压的消息在重连时被 ACL 规则无情拒收。再到 Issue #216 反映的消费者与订阅数增加时吞吐量不成比例下滑,本质上都是单线程事件循环在扇出(fan-out)乘数放大后的必然代价。

  • 结论.千级连接、低频变更的工业网关与边缘节点,Mosquitto 依然是资源效率最高的首选;一旦跨入万级连接且需要高频动态鉴权,必须剥离同步文件重写或转向分布式架构。

桥接代不了集群,看安全别只盯旧网页

《孙子兵法》讲“夫未战而庙算胜者,得算多也”,技术选型里的庙算,最怕把两个概念混为一谈。很多团队试图用 Mosquitto 的桥接(Bridging)加上外部主备切换,拼凑出一套廉价的高可用集群。虽然 2.1.0 补齐了 bridge_receive_maximum 等桥接流控参数,但桥接本质上只是节点间的消息转发管道,绝不等于 EMQX 或 HiveMQ 企业版那种共享全局会话状态、支持无缝故障接管的原生分布式集群。

这就好比早年修铁路,地方窄轨小火车在矿区拉煤灵活省钱,非要拿两条窄轨焊在一起跑跨省干线重载联运,迟早要在道岔口翻车。不过今天的消息中间件与当年铁轨标准之争不完全一样,MQTT 协议本身在应用层是互通的,最合理的架构往往是边缘端用 Mosquitto 守住百兆内存底线,通过桥接把汇聚后的数据送往云端的多核集群。

架构边界对照:边缘桥接与共享状态集群 Mosquitto 边缘单节点 + 桥接 内存开销:百兆级(318M 扛 37k/s) 状态管理:节点独立,桥接仅转发消息 扩展瓶颈:单线程路由与同步配置写盘 适用场景:树莓派、工业网关、边缘汇聚 EMQX / HiveMQ 原生分布式集群 内存开销:吉字节级(5.02G 跑 50k/s) 状态管理:跨节点共享会话与订阅路由 扩展能力:多核并发,原生高可用容灾 适用场景:云端核心枢纽、十万级并发

更要命的一处工程盲区在安全审计。我更在意的是官方信息同步的断层,如果你今天打开 Mosquitto 官网的安全公告页,最新一条漏洞记录居然还停留在 2023 年 8 月。合规团队要是只看这个页面,很容易以为过去两年多风平浪静。

实际上,关键的安全修补全藏在版本的发布日志里:

  • 2024 年 10 月 2 日发布的 2.0.19 版本,修复了普通与共享订阅不匹配、桥接主题重映射下特定数据包引发的服务端崩溃,以及客户端库缺失 SUBACK 原因码的问题。
  • 2025 年 3 月 6 日发布的 2.0.21 版本,堵上了已认证客户端发送恶意 SUBSCRIBE 数据包触发的内存泄漏,并进一步修补了 CVE-2023-28366 的遗留隐患。
  • 风险.切勿以停留在 2023 年 8 月的官方安全页作为合规依据,生产环境应直接核对版本更新日志,尽快升级至 2.0.21 或 2.1.2。

回到开头那张 318M 内存对阵 5.02G 内存的成绩单,技术圈从来没有包打天下的银弹。想不被厂商的跑分牵着鼻子走,企业自己搭基准测试时只需死磕三件事:算清一对多扇出乘数后的真实吞吐、盯紧 p99 尾延迟而不是平均延迟、在开启持久会话与动态鉴权的真实负载下测试故障恢复。守住单节点的轻量边界,让边缘归边缘,让云端归云端,这笔架构账才算得明白。