4、MQTT Broker选型:Mosquitto、EMQX、VerneMQ、HiveMQ CE对比与部署
好,咱们进入第四讲。这一讲我打算聊聊选型的事。
说实话,在SCADA项目里,Broker选错了,后面全得跟着遭殃。我见过不少项目,一开始图省事随便装个Mosquitto就跑,结果设备一多,消息一密集,直接崩了。嗯,咱们今天就把四个主流选手拉出来遛遛。
4.1 四个Broker的定位差异
先给个总体的感觉:
- Mosquitto:轻量级单兵,适合边缘节点、小规模部署。我习惯把它当“瑞士军刀”用。
- EMQX:工业级分布式,集群能力强。国内很多工厂都在用,生态也成熟。
- VerneMQ:基于Erlang/OTP,高可用设计。我记得它有个“全分布式”的架构理念。
- HiveMQ CE:企业版很贵,但社区版也够用。它的扩展机制做得不错。
你想想看,SCADA系统里Broker要扛什么?
- 成千上万的传感器同时上报
- 毫秒级的控制指令下发
- 断线重连后的消息补发
- 还有,绝对不能丢数据
所以选型不能只看功能列表,得看实际场景。
4.2 核心对比维度
我个人习惯从五个维度去评估:
| 维度 | Mosquitto | EMQX | VerneMQ | HiveMQ CE |
|---|---|---|---|---|
| 单机吞吐 | 约5万/秒 | 约100万/秒 | 约50万/秒 | 约30万/秒 |
| 集群支持 | 需手动搭建 | 原生集群 | 原生集群 | 企业版支持 |
| 持久化 | 内存为主 | 内置数据库 | LevelDB | 文件存储 |
| 规则引擎 | 无 | 内置SQL | 插件机制 | 扩展点 |
| 资源占用 | 极低 | 中等 | 中等 | 较高 |
为什么会这样?说白了,架构设计决定了天花板。
我的建议:
- 边缘网关、小站:用Mosquitto,省资源
- 工厂级SCADA(1000点以内):EMQX单机就够了
- 大型分布式SCADA(上万点):上EMQX集群或VerneMQ
- 有企业级支持需求:考虑HiveMQ
4.3 部署实战:Mosquitto
先看最简单的。我在边缘盒子上经常这么搞:
# 安装
sudo apt-get install mosquitto mosquitto-clients
# 配置 /etc/mosquitto/mosquitto.conf
listener 1883
allow_anonymous true
persistence true
persistence_location /var/lib/mosquitto/
# 启动
sudo systemctl start mosquitto
sudo systemctl enable mosquitto
嗯,这里要注意。生产环境千万别开匿名访问。我曾经有个项目,忘了关匿名,结果被隔壁产线的设备乱发消息,搞了一整天排查。
避坑指南:Mosquitto默认配置性能很保守。如果你要扛几百个设备,记得调大max_connections和set_tcp_nodelay。
4.4 部署实战:EMQX
EMQX是我在SCADA项目里用得最多的。部署起来也不复杂:
# Docker方式(推荐)
docker run -d --name emqx \
-p 1883:1883 \
-p 8083:8083 \
-p 8084:8084 \
-p 18083:18083 \
emqx/emqx:5.0
# 访问 Dashboard
# http://localhost:18083
# 默认账号: admin / public
我个人习惯用Docker部署,升级回滚都方便。不过要注意,生产环境一定要挂载持久化卷:
docker run -d --name emqx \
-v /data/emqx/data:/opt/emqx/data \
-v /data/emqx/log:/opt/emqx/log \
-p 1883:1883 \
emqx/emqx:5.0
我记得有一次,客户现场突然断电,没挂载持久化卷,重启后所有规则引擎配置全丢了。从那以后,我每次部署都会再三确认持久化配置。
4.5 部署实战:VerneMQ
VerneMQ的亮点在于它的“全分布式”设计。每个节点都是对等的,没有主从之分。
# 安装
sudo apt-get install vernemq
# 配置 /etc/vernemq/vernemq.conf
allow_anonymous = on
listener.tcp.default = 0.0.0.0:1883
listener.ws.default = 0.0.0.0:8080
# 集群配置(节点间通信)
distributed_cookie = my_scada_cluster
listener.vmq.clustering = 0.0.0.0:44053
# 启动
sudo systemctl start vernemq
集群搭建也很直接:
# 在节点2上执行
vmq-admin cluster join discovery-node=node1@192.168.1.10
你想想看,这种架构的好处是什么?任何一个节点挂了,其他节点自动接管。对于SCADA这种要求7x24小时运行的场景,太合适了。
小技巧:VerneMQ的LevelDB持久化在大量历史数据回放时表现很好。我做过测试,100万条消息的离线回放,VerneMQ比Mosquitto快3倍以上。
4.6 部署实战:HiveMQ CE
HiveMQ CE是社区版,功能上有些限制,但核心的MQTT能力是完整的。
# 下载解压
wget https://www.hivemq.com/releases/hivemq-ce-latest.zip
unzip hivemq-ce-latest.zip
cd hivemq-ce-*/
# 配置 conf/config.xml
<listeners>
<tcp-listener>
<port>1883</port>
<bind-address>0.0.0.0</bind-address>
</tcp-listener>
</listeners>
# 启动
./bin/run.sh
HiveMQ的扩展机制很有意思。你可以用Java写插件,实现自定义的认证、授权、消息处理。我曾在项目里写过一个插件,把MQTT消息直接转成OPC UA,省掉了一个中间件。
注意:HiveMQ CE不支持集群。如果你需要高可用,要么买企业版,要么用其他方案。我曾经踩过这个坑,一开始用CE跑测试,上线前才发现集群功能被锁了。
4.7 选型决策树
最后,我给大家一个简单的决策思路:
- 设备数 < 100,单机运行 → Mosquitto,够用
- 设备数 100-1000,需要规则处理 → EMQX单机
- 设备数 > 1000,需要高可用 → EMQX集群或VerneMQ
- 有企业级合规要求 → HiveMQ企业版
- 边缘节点、资源受限 → Mosquitto,没得选
嗯,其实没有最好的Broker,只有最适合你场景的。我见过有人用Mosquitto扛了2000个设备,也见过用EMQX只跑50个点。关键是你对系统的理解有多深。
下一讲,咱们聊聊怎么把这些Broker和SCADA系统真正集成起来。到时候我会分享一些我在现场踩过的坑,保证实用。