Mqtt的broker技术选型

本页试图记录各种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)路线图规划中也就是计划支持。

image.png

image.png

选型

一、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(不开源
image.png
【官方文档宣称的特性】

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
image.png
【官方文档宣称的特性】

完整的QoS等级
支持MQTT、Websocket连接方式
支持RocksDB进行数据本地存储


【坏处】
不支持集群
不支持共享订阅
不支持SSL
MessageQueue不是队列

源码:https://github.com/Cicizz/jmqtt

八.EMQ X
image.png

源码:https://github.com/emqx/emqx

三。选择

目前最好选择是EMQ X(https://cloud.emqx.io/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 技术需求 完整的MQTT协议支持; 支持设备认证、发布订阅ACL; 消息能够持久化存储到数据库; 支持集群部署,支...
    centychen阅读 3,708评论 0 0
  • broker的主要职责是接受发布者发布的所有消息,并将其过滤后分发给不同的消息订阅者。如今有很多的broker,下...
    中v中阅读 63,208评论 8 34
  • 随着 5G 时代的来临,万物物联的伟大构想正在成为现实。联网的物联网设备在 2018 年已经达到了 70 亿[1]...
    觉释阅读 303评论 0 2
  • 黑色的海岛上悬着一轮又大又圆的明月,毫不嫌弃地把温柔的月色照在这寸草不生的小岛上。一个少年白衣白发,悠闲自如地倚坐...
    小水Vivian阅读 3,092评论 1 5
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,233评论 0 13