2. Broker 选型:Mosquitto、EMQX、NanoMQ、VerneMQ 对比与适用场景
选 Broker 这件事,说实话比选语言框架还让人头疼。我见过不少团队,一上来就奔着“功能最全”的去,结果部署后发现资源吃紧,运维成本还高。也有团队图省事用轻量级的,业务一膨胀就扛不住了。
今天我把市面上最主流的四个 MQTT Broker——Mosquitto、EMQX、NanoMQ、VerneMQ——掰开揉碎讲清楚。你想想看,选对了 Broker,后面做主题授权和策略配置才能事半功倍。
核心观点:没有最好的 Broker,只有最适合你场景的 Broker。选型的关键在于搞清楚你的业务对吞吐量、延迟、集群能力、资源消耗的真实需求。
2.1 四款 Broker 的定位速览
先给个全景图,方便你快速建立认知。
2.2 Mosquitto:轻量级单机首选
Mosquitto 是 Eclipse 基金会下的老牌 Broker,C 语言实现,体积极小。我个人习惯在开发环境或原型验证阶段用它,编译完才几百 KB,跑起来内存占用也就十几 MB。
核心特点:
- 支持 MQTT 3.1.1 和 5.0 协议
- 基于文件的密码认证和 ACL 授权
- 单线程事件驱动模型
- 不支持集群
它的授权配置非常直观,直接改 mosquitto.conf 就行:
# 开启密码认证
password_file /etc/mosquitto/passwd
# 开启 ACL 文件
acl_file /etc/mosquitto/acl
# 禁止匿名访问
allow_anonymous false
ACL 文件写法也很简单:
# 用户 sensor1 可以发布到 sensors/temperature
user sensor1
topic write sensors/temperature
# 用户 admin 可以订阅所有以 admin/ 开头的主题
user admin
topic read admin/#
我的经验:Mosquitto 的 ACL 是热加载的,修改文件后不需要重启 Broker。但要注意,它只支持基于用户名的静态授权,无法做到动态的、基于客户端 ID 或 IP 的细粒度控制。
适用场景:
- 开发测试环境
- 智能家居网关(连接设备数 < 1000)
- 树莓派等嵌入式设备
避坑:我曾经在一个项目中用 Mosquitto 扛 5000 个客户端,结果 CPU 直接飙到 90%。单线程模型在高并发下就是瓶颈。如果你预估连接数会超过 2000,建议直接上 EMQX 或 VerneMQ。
2.3 EMQX:企业级高可用标杆
EMQX 是目前国内用得最多的 MQTT Broker,Erlang/OTP 实现。我参与过的几个车联网项目,无一例外都选了它。为什么?因为它把“高可用”和“可扩展”做到了极致。
核心特点:
- 原生支持集群,水平扩展无上限
- 内置强大的规则引擎和钩子系统
- 支持基于 SQL 的动态主题授权
- 丰富的认证方式:JWT、LDAP、HTTP、MySQL、Redis、MongoDB
- 企业版支持热配置和热升级
它的授权配置非常灵活,可以通过 Dashboard 或 API 动态管理。举个例子,用 HTTP 认证插件实现动态授权:
# emqx.conf 中配置 HTTP 认证
auth.http.auth_req = http://192.168.1.100:8080/auth
auth.http.auth_req.method = post
auth.http.auth_req.params = clientid=%c,username=%u,password=%P
# 授权请求
auth.http.acl_req = http://192.168.1.100:8080/acl
auth.http.acl_req.method = get
auth.http.acl_req.params = clientid=%c,username=%u,topic=%t,action=%a
后端返回 {"result": "allow"} 或 {"result": "deny"} 即可。这种模式的好处是——授权逻辑完全由业务系统控制,可以实现非常复杂的策略。
关键能力:EMQX 的规则引擎可以做到“在消息流转过程中动态修改主题”,比如根据设备类型自动重写主题前缀。这在做多租户隔离时特别有用。
适用场景:
- 物联网平台(百万级设备接入)
- 车联网(TSP 平台)
- 工业互联网(SCADA 数据采集)
- 金融、能源等对可用性要求极高的场景
我的建议:如果你预算允许,直接上 EMQX 企业版。社区版虽然功能也够用,但企业版的热配置、多活集群、审计日志这些功能,在大规模生产环境中能省很多运维精力。
2.4 NanoMQ:边缘计算的轻骑兵
NanoMQ 是 EMQ 公司推出的边缘侧 Broker,C 语言实现,目标是“在资源受限的设备上跑出高性能”。我第一次看到它的 benchmark 时还挺惊讶的——在树莓派上能跑到 10 万 TPS。
核心特点:
- 极致轻量:二进制不到 1MB,内存占用 5MB 起步
- 支持 MQTT 5.0、WebSocket、HTTP
- 内置规则引擎和桥接功能
- 支持与 EMQX 云端无缝对接
- 支持 DDS 协议转换(工业场景)
它的授权配置风格和 Mosquitto 类似,但更灵活:
# nanomq.conf
auth.allow_anonymous = false
auth.password_file = /etc/nanomq/passwd
auth.acl_file = /etc/nanomq/acl.conf
# ACL 规则支持通配符和变量
acl {
permission = allow
action = subscribe
topic = "device/${clientid}/#"
}
注意:NanoMQ 的 ACL 支持 ${clientid} 变量替换,这意味着你可以实现“每个客户端只能订阅自己 ID 相关的主题”。这个特性在边缘场景下非常实用,但要注意变量注入的安全风险。
适用场景:
- 边缘计算网关
- 工业 PLC 数据采集
- 车载 T-Box
- 智能楼宇控制器
2.5 VerneMQ:高并发多租户利器
VerneMQ 也是 Erlang 实现,但它和 EMQX 的定位不太一样。EMQX 强在“平台级”的完整生态,VerneMQ 则更专注于“消息中间件”本身,尤其在高并发和多租户隔离方面做得非常出色。
核心特点:
- LevelDB 作为消息持久化引擎,写入性能极高
- 原生支持多租户隔离(通过 mountpoint 机制)
- 支持在线配置修改(不需要重启)
- 内置分布式会话存储
- 支持 Live Upgrade(热升级)
它的多租户授权配置很有意思:
# vernemq.conf
# 开启多租户模式
allow_multiple_sessions = on
# 每个租户使用独立的 mountpoint
mountpoint = /tenants/${tenant_id}/
# 授权使用 VMQ 的 ACL 链
plugins.vmq_acl = on
plugins.vmq_acl.file = /etc/vernemq/acl
ACL 文件支持层级和变量:
# 租户 A 只能操作自己的主题空间
[tenant_a]
topic read /tenants/tenant_a/#
topic write /tenants/tenant_a/#
# 管理员可以操作所有租户
[admin]
topic read /tenants/#
topic write /tenants/#
核心优势:VerneMQ 的 mountpoint 机制让多租户隔离变得非常干净。每个租户的数据物理上存储在独立的 LevelDB 实例中,一个租户的流量暴涨不会影响其他租户。
适用场景:
- SaaS 物联网平台(多租户)
- 消息中间件(高吞吐量消息分发)
- 金融交易系统(低延迟、高可靠)
- 需要热升级的 7x24 小时服务
2.6 横向对比:一张表说清楚
| 维度 | Mosquitto | EMQX | NanoMQ | VerneMQ |
|---|---|---|---|---|
| 实现语言 | C | Erlang | C | Erlang |
| 二进制大小 | ~500KB | ~50MB | ~1MB | ~40MB |
| 内存占用(1K 连接) | ~20MB | ~100MB | ~10MB | ~80MB |
| 单机吞吐量 | ~50K TPS | ~500K TPS | ~100K TPS | ~300K TPS |
| 集群支持 | ❌ | ✅ 原生 | ✅ 桥接 | ✅ 原生 |
| 动态授权 | ❌ 文件静态 | ✅ HTTP/DB/API | ✅ 文件+变量 | ✅ 文件+API |
| 多租户隔离 | ❌ | ✅ 规则引擎 | ❌ | ✅ mountpoint |
| 运维复杂度 | 低 | 中高 | 低 | 中 |
| 协议支持 | MQTT 3.1.1/5.0 | MQTT+CoAP+HTTP+WebSocket | MQTT+WebSocket+DDS | MQTT+WebSocket |
2.7 我的选型建议
说了这么多,到底怎么选?我根据实际项目经验,给你几个参考路径:
- 个人学习 / 原型验证:Mosquitto,零成本上手,ACL 配置简单直接。
- 边缘设备 / 资源受限:NanoMQ,轻量且功能完整,还能和云端 EMQX 桥接。
- 企业级物联网平台:EMQX,生态最完善,授权策略最灵活,运维工具也最成熟。
- 高并发消息中间件 / 多租户 SaaS:VerneMQ,LevelDB 的写入性能和 mountpoint 隔离机制是杀手锏。
最后说一句:选型不是一锤子买卖。我见过不少项目,初期用 Mosquitto 跑得挺好,业务量上来后平滑迁移到了 EMQX。所以,只要你的授权策略设计得足够抽象(比如把授权逻辑外置到 HTTP 服务),后期换 Broker 的成本其实很低。