本页试图记录各种MQTT服务器(代理)支持的特性。这是针对它们对MQTT的支持;其中很多服务器具有比MQTT更广泛的功能。
一.选型列表
参考官网:mqtt官方整理的开源Broker简要列表
参考官网:mqtt官方整理的开源Broker详细介绍
参考官网:mqtt官方整理的开源Broker特性和性能对比
备注
QoS 0:服务质量 0,最多传输一次。
QoS 1:服务质量1,至少传输一次。
QoS 2:服务质量2,仅仅传输一次。
auth:验证,身份验证授权。
bridge:桥接,服务器代理之间连接
$SYS:主题过滤器通配符,订阅后能够接收到所有以此通配符开头的主题的消息。
dynamic topics:动态主题
cluster:集群
说明:✔表示支持,✘表示不支持,?表示未知,§表示支持但有限制,rm表示(roadmap)路线图规划中也就是计划支持。
选型
一、EMQ(Erlang)(emqttd)
EMQ是一个基于Erlang语言的开源mqtt服务器,目前来看是开源的最好的mqtt服务器,也是国内开源的mqtt服务器,优点是功能全面,文档齐全,社区活跃,有很好的支持,缺点是因为erlang语言,对于其他语言的开发者自己扩展有一定难度。官方文档是:EMQ(开源)
【官方文档宣称的特性】
MQTT 3.1 / 3.1.1 / 5.0(EMQ3.0)
完整QoS支持
单节点100万连接
分布式集群或桥接(还支持mosquitto桥接、rsmb桥接)、脑裂自动愈合
LDAP, MySQL, PostgreSQL, Redis, MongoDB等验证插件
完整连接方式支持
API、Web监控界面
本地共享订阅(EMQ2.0)、集群共享订阅(EMQ3.0)
$SYS统计信息主题
自定义插件开发
【坏处】
几乎是完美的,只有一点限制,那就是开源版本不支持消息持久化:
EMQ 1.0 版本不支持服务器内部消息持久化,这是一个架构设计选择。首先,EMQ 解决的核心问题是连接与路由;其次,我们认为内置持久化是个错误设计。
传统内置消息持久化的 MQ 服务器,比如广泛使用的 JMS 服务器 ActiveMQ,几乎每个大版本都在重新设计持久化部分。内置消息持久化在设计上有两个问题:
1)如何平衡内存与磁盘使用?消息路由基于内存,消息存储是基于磁盘。
2)多服务器分布集群架构下,如何放置 Queue 如何复制 Queue 的消息?
Kafka 在上述问题上,做出了正确的设计:一个完全基于磁盘分布式 Commit Log 的消息服务器。
EMQ 2.0 版本将发布 EMQ X 平台产品,支持消息持久化到 Redis、Kafka、Cassandra、PostgreSQL 等数据库。
设计上分离消息路由与消息存储职责后,数据复制容灾备份甚至应用集成,可以在数据层面灵活实现。
二、mosquitto(C++)
mosquitto是基于c++的开源mqtt服务器,开源社区较活跃,功能较齐全,缺点也是因为采用c++实现,对于其他语言的开发者很难扩展。(开源)
【官方文档宣称的特性】
协议:支持mqtt 3.1 / mqtt 3.1.1
【总结】
无论如何,总结一句话,mosquitto是为了嵌入式设备而生,正如官方的介绍,mosquitto足够轻量,可以运行在任何低功率单片机上,
包括嵌入式传感器、手机设备、嵌入式微处理器,mosquitto用C语言编写、集群做的如此简单就是证明,它不适合用来做云服务的MQTT Broker。
三、moquette(Java)
moquette是基于java开发的mqtt服务器。开源社区较活跃,采用java实现,功能较齐全,也是我在实际工作中参考最多的一个mqtt开源broker。Moquette:https://github.com/andsel/moquette(开源)
1.没有集群实现,无高可用,高可靠,基本决定了无法投入生产~
2.消息的持久化实现不好,在消息持久化时,连接数,消息的tps这些性能重要指标都很差
3.没有运维功能。
四、JMQTT
Java语言实现的MQTT协议的Broker,主要基于Netty实现。代码风格主要参考了阿里的RocketMQ,主要是想实现一个基于Java语言的高性能,高可用,有一定可靠性,高扩展,插件化的MQTT Broker。(开源)
【官方文档宣称的特性】
1.实现mqtt协议所有功能
2.数据可持久化,实现高可靠
3.集群化,可根据需求横向扩展,实现高可用
4.插件化开发,可以很方便的对接其它消息存储插件及集群插件等
5.可运维,提供http方式的管理接口等
6.多协议,不限于mqtt支持的websocket,ssl/tls,还包括与coap协议互通,http协议互通等
7.数据上云,可通过RocketMQ,Kafka等传输到数据分析平台中
五、HiveMQ(不开源)
【官方文档宣称的特性】
MQTT 3.1 / 3.1.1 / 5.0
完整QoS支持
分布式集群支持
持久化支持
流量控制支持
完整连接方式支持
IPv6支持
集群共享订阅
$SYS统计信息主题
JMX性能监控
日志打印
Docker部署
……
【坏处】
功能上齐全得让人想哭,唯一的限制就是收费,没有任何源码可以参考。它的集群是基于Jgroups的,持久化的数据都是本地+Jgroups同步,
自己编写了一套一致性Hash和VectorClock解决冲突……订阅树也是完整的订阅树,优秀的缓存和并发访问控制,集群进行数据同步。
多线程和并发等用的google的guava进行防御性编程,实在是太厉害了。
六、MqttWk
一个阿里大佬编写的基于 nutzboot + netty + redis + kafka 实现的MQTT服务开源broker*,代码非常简洁干净,一看就懂。nutzboot是国人编写的类似于springboot的开源架构,它有一系列的产品,功能和代码外观都和spring全家桶很像,但比spring全家桶轻量。
【官方文档宣称的特性】
MQTT 3.1.1
完整的QoS服务
完整的连接方式
Kafka消息转发
集群功能
分发重试
【坏处】
1)MessageQueue没有排序:是直接插入Redis的key-value,并不是一个队列
2)消息分发重试很差:对于未确认的QoS1消息,只会在重新连接的时候下发,如果一直在线就会一直淤积
3)集群功能很差:用Redis的订阅发布当作消息总线来构建集群,而且我刚熟悉的时候还有问题(1.0.7版本),
提交了issue后更新到1.0.8,不过集群这块还是不太好。
4)Kafka消息转发:只是单纯地转发而已,没有从后端服务接收消息的代码。而且用原始的代码去编写的转发
(为了使用没有Kafka功能的nutzboot,没有用spring的Kafka相关注解)。
5)主题:主题有一些限制,不能以/结尾,不支持通配符订阅+
七、Jmqtt
【官方文档宣称的特性】
完整的QoS等级
支持MQTT、Websocket连接方式
支持RocksDB进行数据本地存储
【坏处】
不支持集群
不支持共享订阅
不支持SSL
MessageQueue不是队列
源码:https://github.com/Cicizz/jmqtt
八.EMQ X
源码:https://github.com/emqx/emqx
三。选择
目前最好选择是EMQ X(https://cloud.emqx.io/)