4. MQTT Broker选型:Mosquitto、EMQX、VerneMQ对比与部署

选Broker这事儿,说实话挺头疼的。我见过不少项目,一开始随便挑一个用,结果数据量一上来就崩了。储能监控这个场景有点特殊——数据量大、实时性要求高、还得考虑断网重连。今天我就把这三款主流Broker掰开揉碎讲清楚。

4.1 三款Broker的核心定位

先给个总览,心里有个底:

特性 Mosquitto EMQX VerneMQ
开发语言 C Erlang Erlang
单机吞吐 ~10万/秒 ~100万/秒 ~50万/秒
集群支持 弱(需第三方) 原生强 原生强
插件生态 丰富 中等
运维复杂度 中高
典型场景 小规模、边缘 大规模、云端 高可用、多租户

4.2 Mosquitto:轻量级首选

Mosquitto是我最早接触的Broker。它轻啊,编译完才几百KB。我记得第一次在树莓派上跑,内存占用不到10MB,简直离谱。

适合什么场景?

  • 边缘网关、嵌入式设备
  • 节点数少于1000的小型储能站
  • 原型验证、快速测试

部署示例:

# 安装
sudo apt-get install mosquitto mosquitto-clients

# 启动(带配置文件)
mosquitto -c /etc/mosquitto/mosquitto.conf

# 配置文件核心内容
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl
注意:Mosquitto默认不开启持久化。储能数据丢了可不行,记得加上 persistence true

4.3 EMQX:企业级扛把子

EMQX是我目前在储能项目里用得最多的。为什么?因为它扛得住。我有个项目接了5万个储能柜,每秒消息量冲到80万,EMQX稳如老狗。

核心优势:

  • 原生集群,节点挂了自动切换
  • 内置规则引擎,可以直接写SQL处理数据
  • 支持MQTT over WebSocket,前端直接订阅
  • 热升级,不用重启服务

部署示例:

# Docker部署(推荐)
docker run -d --name emqx \
  -p 1883:1883 \
  -p 8083:8083 \
  -p 8084:8084 \
  -p 18083:18083 \
  emqx/emqx:5.0

# 集群配置(三节点)
node {
  name = "emqx1@192.168.1.10"
  cookie = "mysecret"
}

cluster {
  discovery_strategy = static
  static {
    seeds = ["emqx2@192.168.1.11", "emqx3@192.168.1.12"]
  }
}
我的经验:EMQX的Dashboard在18083端口,默认账号admin/public。生产环境一定要改密码,我曾经见过有人直接用默认配置上线,结果被扫了。

4.4 VerneMQ:高可用之选

VerneMQ名气没EMQX大,但它的集群机制很有意思。它用了LevelDB做持久化,每个节点独立存储,数据通过分布式协议同步。说白了,就是每个节点都是完整的。

适合什么场景?

  • 对数据一致性要求极高的场景
  • 多数据中心部署
  • 需要细粒度权限控制

部署示例:

# 下载解压
wget https://github.com/vernemq/vernemq/releases/download/1.12.0/vernemq-1.12.0.ubuntu-xenial_amd64.deb
dpkg -i vernemq-*.deb

# 配置集群
vmq_telegraph {
  tcp {
    port = 44053
    nr_of_acceptors = 10
  }
}

# 启动
service vernemq start
坑:VerneMQ的配置项特别多,而且有些参数调了要重启。我建议先用默认配置跑起来,再根据监控数据慢慢调。

4.5 选型决策树

别纠结,我画了个决策流程,照着走就行:

开始选型 节点数 < 1000? Mosquitto 边缘/小规模 需要集群/高可用? (断网续传、负载均衡) Mosquitto 单机大容量 需要规则引擎/插件? (数据清洗、转发) EMQX 企业级首选 VerneMQ 高可用/多租户

4.6 我的最终建议

说了这么多,给个实在的结论:

  • 小项目、边缘端:无脑Mosquitto。省资源,好维护。
  • 中型储能站(1000-10000节点):EMQX单机就够了。我有个项目用4核8G的机器,跑了5000个设备,CPU才30%。
  • 大型储能集群(10000+节点):上EMQX集群。别省那点钱,数据丢了损失更大。
  • 特殊场景(多数据中心、金融级一致性):考虑VerneMQ。但要做好运维准备,它比EMQX难伺候。

一句话总结:Mosquitto是自行车,EMQX是轿车,VerneMQ是越野车。别开着越野车去买菜,也别骑着自行车去越野。

部署的时候记得先压测。我习惯用 mqtt-benchmark 这个工具,模拟1000个客户端同时发消息,看看Broker扛不扛得住。压测不过关,上线就是事故。