
MQTT 是一个开放的工业标准,是一个轻量级的基于发布订阅模型的消息协议,特别适合用于一些非可靠网络环境下的小型和嵌入式设备使用,物联网行业兴盛下可选的MQTT Broker有许多,除了经典的Mosquitto和AWS、Azure,百度云、阿里云、IBM等几个提供物联网MQTT接入服务的产品外,可用于商业生产的MQTT Broker还有多款,本文将重点介绍一些EMQ与VerneMq。
介绍
EMQ X (简称 EMQ), 是一款完全开源,高度可伸缩,高可用的分布式 MQTT 消息服务器,同时也支持 CoAP/LwM2M 一站式 IoT 协议接入。EMQ 是 5G 时代万物互联的消息引擎,适用于 IoT、M2M 和移动应用程序,可处理千万级别的并发客户端,EMQ是国人出产的一个开源Broker,已经用于许多企业生产了,文档和资料也超级齐全,除开源版本也有企业版。EMQ 作为物联网应用开发和物联网平台搭建必须用到的基础设施软件,主要在边缘和云端实现物联网设备互联与设备上云,提供物联网设备接入、协议处理、消息路由、数据存储、流数据处理等核心能力。

特性
EMQ 特性:
EMQ 功能:
企业级EMQ 一站式解决方案如下图所示

架构
技术架构
异步架构:EMQ X 是基于 Erlang/OTP 平台的全异步的架构,异步 TCP 连接处理、异步主题 (Topic) 订阅、异步消息发布。只有在资源负载限制部分采用同步设计,列如 TCP 连接创建和 Mnesia 数据库事务执行。EMQ X 3.0 版本中,一条 MQTT 消息从发布者 (Publisher) 到订阅者 (Subscriber),在 EMQ X Broker 内部异步流过一系列 Erlang 进程 Mailbox:

概念模型:EMQ X 概念上更像一台网络路由器 (Router) 或交换机 (Switch),而不是传统的企业级消息队列 (MQ)。相比网络路由器按 IP 地址或 MPLS 标签路由报文,EMQ X 按主题树 (Topic Trie) 发布订阅模式在集群节点间路由 MQTT 消息:

部署架构
EMQ X 集群可作为物联网接入服务(IoT Hub)部署,目前 EMQ 在青云、阿里云、AWS 等云服务提供商上均提供开箱即用的免费软件镜像,对于特殊硬件平台和系统版本如树莓派、Linux ARM,可使用源码编译安装,LB (负载均衡器) 负责分发设备的 MQTT 连接与消息到 EMQ X 集群,LB 提高 EMQ X 集群可用性、实现负载平衡以及动态扩容,开源 LB有Nginx、Haproxy。
典型部署架构:

介绍
VerneMQ 基于 Erlang/OTP 平台开发,是高性能的分布式 MQTT 消息代理。它可以在硬件上水平和垂直扩展,以支持大量并发客户端,同时保持较低的延迟和容错能力,它实现了 OASIS 行业标准MQTT 协议。但 VerneMQ 还旨在通过提供一组与可扩展性、可靠性和高性能以及操作简单性相关的独特功能,将消息传递和物联网应用程序提升到一个新的水平。

特性
VerneMQ 特性:
VerneMQ 功能:

架构
VerneMQ采用Erlang实现,Erlang 旨在支持高并发和高可用性(容错)系统,数据副本采用Plumtree协议实现,MQTT 中的保留消息是使用主题作为键存储在代理上的消息,每当客户端订阅该特定主题时,代理都会发送该消息的副本,设计和构建从 Basho 构建和打包 Riak 数据库的方式以及 Plumtree 中借鉴了许多,主题 trie 路由算法完全参考RabbitMQ MQTT 插件,采用LevelDB 作为数据持久化存储。
EMQX 优势在于高并发连接与高吞吐消息的服务能力,以及物联网协议栈支持的完整性;扩展能力较强,无需过多开发,VerneMQ提供基础的并发连接与高吞吐消息的服务能力,物联网协议栈的完整性较弱仅支持 MQTT 协议;扩展能力较差,基础的业务组件支持度不够,商业成熟度不足客户量较少,缺乏开箱即用的功能插件。要求数据持久化避免节点殒机数据丢失可思考VerneMQ以及企业版EMQ X,开源版本EMQ X需要采用扩展方式实现数据持久化,但是EMQ X通过开放标准物联网协议 MQTT、CoAP 和 LwM2M 连接任何设备,基于 TLS/SSL 和 X.509 证书的认证机制确保通信安全。使用 EMQ X 企业版本集群,可以毫不费力地弹性扩展到数千万个并发的 MQTT 连接,且由于是国产化软件支持、关注度以及功能丰富程度高于VerneMQ。
对比项目 | EMQ | VerneMQ |
License | 开源+商业版 | 开源+商业定制 |
公司/社区 | EMQ | VerenMQ |
开源协议 | Apache License 2.0 | Apache License 2.0 |
开发团队 | 杭州映云科技有限公司 | Octavo Labs AG,瑞士 |
开发语言 | Erlang | Erlang |
集群架构 | 支持 | 支持 |
支持协议 | MQTT、CoAP、MQTT-SN、WebSocket、TCP、UDP、LwM2M | MQTT WebSocket |
系统性能 | 集群支持千万级并发,单机开源十万企业版百万并发 | 集群支持百万级并发 |
MQTT | v3.1,v3.1.1,v5.0 | v3.1,v3.1.1,v5.0 |
边缘计算 | EMQ X Edge 支持树莓派,ARM 等架构,支持数据同步到云服务 Azure IoT Hub AWS | 不支持 |
安全与认证 | TLS/DTLS、X.509证书、JWT、OAuth2.0、应用协议(ID/用户名/密码)、数据库与接口形式的认证与 ACL 功能(LDAP、DB、HTTP) | TLS/DTLS、X.509证书、配置文件形式的认证与 ACL 功能、数据库形式的认证与 ACL 功能,但支持数据库较少 |
数据持久化 | 企业版支持将消息数据持久化至外部数据库如 Redis、MySQL、PostgreSQL、MongoDB、Cassandra、Dynamo 等,开源版在内存中宕机则丢失 | 支持持久化至 Google LevelDB |
扩展方式 | Webhook、Trigger、Plugin 等,支持 Erlang 与 Lua、Java、Python 扩展开发 | Webhook、Trigger、Plugin 等,支持 Erlang 与 Lua 扩展开发 |
数据存储 | 仅企业版 适配数据库:Redis、Mysql、PostgreSQL、MongoDB、Cassandra、OpenTSDB、TimescaleDB、InfluxDB 适配消息队列:Kakfa、RabbitMQ、Pulsar 桥接模式:支持桥接至标准 MQTT 协议消息服务 开源版支持 HTTP 将数据同步、存储 | 适配数据库:无,提供 Erlang 和 Lua 扩展开发 适配消息队列:无 桥接模式:支持桥接至标准 MQTT 协议消息服务 |
管理监控 | 支持可视化的 Dashboard,实现集群与节点的统一聚焦管理 支持第三方监控工具 Prometheus ,提供可视化 Grafana 界面模板 | 内置简单状态管理可视化界面 支持第三方监控工具 Prometheus ,可提供可视化 Grafana 界面 |
规则引擎 | 支持规则引擎,基于 SQL 的规则引擎给予 Broker 超越一般消息中间件的能力。除了在接受转发消息之外,规则引擎还可以解析消息的格式(企业版)。 规则引擎由消息的订阅,发布,确认的事件触发,根据消息的负载来执行相应的动作,降低应用开发的复杂度。 | 不支持 |
MQTT vs. AMQP 协议对比
Apache Storm vs. Spark Streaming
Apache hive vs. impala 大数据生态系统中的SQL分析引擎之争
HTTP vs. MQTT 物联网通信协议对比