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 选型决策树

最后,我给大家一个简单的决策思路:

  1. 设备数 < 100,单机运行 → Mosquitto,够用
  2. 设备数 100-1000,需要规则处理 → EMQX单机
  3. 设备数 > 1000,需要高可用 → EMQX集群或VerneMQ
  4. 有企业级合规要求 → HiveMQ企业版
  5. 边缘节点、资源受限 → Mosquitto,没得选

嗯,其实没有最好的Broker,只有最适合你场景的。我见过有人用Mosquitto扛了2000个设备,也见过用EMQX只跑50个点。关键是你对系统的理解有多深。

下一讲,咱们聊聊怎么把这些Broker和SCADA系统真正集成起来。到时候我会分享一些我在现场踩过的坑,保证实用。