2. MQTT Broker 选型:主流 Broker 对比与轻量级部署

选 Broker,说白了就是选你整个 MQTT 系统的「心脏」。我见过不少团队,一开始随便挑一个用,等设备量上来才发现性能扛不住,或者安全功能缺胳膊少腿,最后被迫迁移——那叫一个痛苦。所以这一节,咱们把主流的三款 Broker 掰开揉碎聊清楚。

2.1 三款主流 Broker 速览

目前社区里最活跃、生产环境用得最多的,就是 Mosquitto、EMQX 和 VerneMQ。我按自己的使用经验,给你画个像:

特性 Mosquitto EMQX VerneMQ
开发语言 C Erlang/OTP Erlang/OTP
定位 轻量、嵌入式 高可用、大规模 高并发、多租户
单机吞吐 ~10万 msg/s ~500万 msg/s ~200万 msg/s
集群能力 弱(需第三方) 原生强 原生强
安全特性 TLS + ACL 文件 TLS + Auth + RBAC TLS + Auth + 插件
资源占用 极低(~2MB) 中等(~50MB) 中等(~40MB)
学习曲线 低 中 中高
我的建议: 如果你只是做原型验证、家庭自动化或者设备量在几百台以内,Mosquitto 完全够用。但一旦涉及生产环境、上万设备、或者需要细粒度权限控制,直接上 EMQX 或 VerneMQ 更省心。

2.2 选型考量因素

选 Broker 不是看谁功能多就选谁。我总结了一套「四维评估法」,你照着这个框架走,基本不会踩坑。

2.2.1 性能与规模

先问自己三个问题:

  • 设备量级: 是几百台,还是几十万台?
  • 消息频率: 每秒多少条?每条多大?
  • QoS 等级: 是否大量使用 QoS 1/2?

我在一个智慧农业项目里,初期用 Mosquitto 跑了 500 台设备,一切正常。后来扩展到 5000 台,QoS 1 消息一多,CPU 直接飙到 90%。换到 EMQX 后,同样硬件,CPU 只用了 15%。

2.2.2 安全能力

安全不是「有就行」,而是「够用且好用」。重点关注:

  • TLS 支持: 是否支持双向认证?
  • 认证机制: 用户名密码、JWT、X.509 证书?
  • 授权粒度: 能否按 Topic 通配符做 ACL?
  • 审计日志: 能否记录谁在什么时候发布了什么?
避坑: 我曾经见过一个项目,用 Mosquitto 的 ACL 文件管理 2000 个设备的权限。每次新增设备都要手动编辑文件、重启服务。后来改成 EMQX 的数据库动态 ACL,才彻底解脱。所以,如果你的设备会频繁变动,别用文件式 ACL。

2.2.3 运维与可观测性

Broker 跑起来之后,你怎么知道它健不健康?

  • 监控指标: 连接数、消息吞吐、订阅数、丢包率。
  • 日志管理: 是否支持结构化日志?能否接入 ELK?
  • 热更新: 修改配置是否需要重启?

EMQX 在这方面做得最好,自带 Dashboard,Prometheus 指标直接暴露。Mosquitto 就比较原始了,得自己写脚本解析日志。

2.2.4 社区与生态

选一个活跃的社区,等于给自己买了份「保险」。遇到问题搜不到答案,那才叫绝望。

  • Mosquitto: Eclipse 基金会,文档全,但更新慢。
  • EMQX: 国内团队主导,中文文档好,社区响应快。
  • VerneMQ: 欧洲团队,技术深度高,但中文资料少。

2.3 轻量级部署方案

很多初学者一上来就想搭集群,其实没必要。我建议你从「最小可行部署」开始,跑通了再加东西。

2.3.1 方案一:单机 Mosquitto(适合开发/测试)

这是最轻量的方案,一个二进制文件搞定。

# 安装(Ubuntu)
sudo apt-get install mosquitto mosquitto-clients

# 启动
mosquitto -c /etc/mosquitto/mosquitto.conf -d

# 测试
mosquitto_sub -h localhost -t "test/topic" -v
mosquitto_pub -h localhost -t "test/topic" -m "Hello MQTT"

嗯,这里要注意:默认配置是匿名访问、无加密。千万别直接用到生产环境。

2.3.2 方案二:Docker 部署 EMQX(适合生产单机)

EMQX 官方 Docker 镜像非常成熟,我习惯用这个做快速验证。

# 拉取并启动
docker run -d --name emqx \
  -p 1883:1883 \
  -p 8083:8083 \
  -p 8084:8084 \
  -p 8883:8883 \
  -p 18083:18083 \
  emqx/emqx:latest

# 访问 Dashboard
# http://localhost:18083  (默认 admin/public)

端口说明:

  • 1883: MQTT 明文端口
  • 8883: MQTT over TLS
  • 8083: WebSocket 端口
  • 8084: WebSocket over TLS
  • 18083: Dashboard 管理界面

2.3.3 方案三:树莓派 + Mosquitto(边缘部署)

如果你需要在边缘网关跑 Broker,树莓派 Zero 2W 就能带起来。

# 树莓派上安装
sudo apt-get install mosquitto

# 限制内存占用(编辑配置文件)
echo "memory_limit 64" | sudo tee -a /etc/mosquitto/mosquitto.conf

# 启动
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
经验之谈: 边缘部署时,记得开启持久化(persistence true),防止断电丢消息。我踩过这个坑,设备重启后离线消息全没了,排查了半天才发现是持久化没开。

2.4 选型决策流程图

下面这张图,是我自己总结的选型决策路径。你跟着走一遍,基本能锁定目标。

MQTT Broker 选型决策流程图 开始选型 设备量 < 1000 台? 且消息频率 < 1万/秒 是 否 Mosquitto 单机部署,资源占用低 EMQX / VerneMQ 集群部署,高可用 需要 TLS + ACL? 是 否 Mosquitto + TLS 适合小型生产环境 Mosquitto(无加密) 仅限内网开发测试 需要多租户隔离? 是 否 VerneMQ 多租户、高隔离性 EMQX 通用高可用方案 选型建议 • 个人/原型:Mosquitto(最快上手) • 生产单机:EMQX(功能最全) • 多租户场景:VerneMQ(隔离性最好)

2.5 我的最终建议

如果你还在犹豫,我直接给你一个「无脑选」方案:

  • 学习阶段: 装 Mosquitto,5 分钟跑起来,先理解 MQTT 协议本身。
  • 生产环境: 直接上 EMQX,Docker 一行命令部署,安全功能开箱即用。
  • 边缘/嵌入式: Mosquitto 编译到 ARM 平台,内存占用不到 5MB。

记住一句话: Broker 选型没有银弹。最贵的方案不一定最好,最适合你当前场景的,才是对的。而且,选型不是一锤子买卖——随着业务增长,随时可以迁移升级。