基于MQTT协议的Broker技术选型

/ RocketMQ / 90浏览

背景

由于我们公司的主要产品是工业互联网产品,大部分数据都是通过传感器采集而来。因此,在采集数据时,我们一开始选择使用的是RabbitMQ。随着客户越来越多,采集数据量越来越大,RabbitMQ开始出现了一些问题。最近几周,几乎每天都在处理RabbitMQ带来的问题。因此,我们决定弃用RabbitMQ,选择一种新的消息中间件。

市面上比较流行的消息中间件有:Kafka、RocketMQ。之所以从这两个里面选,主要原因是它的吞吐量大、延迟低、可靠、易扩展。至于选择Kafka还是RocketMQ,目前我们选择的是RocketMQ。因为RocketMQ在消费数据时,可以严格保证顺序消费,RocketMQ的延迟性要比Kafka更低。

RocketMQ采用的协议是基于tcp之上的二进制协议,而我们数据来源都是传感器采集,在使用RabbitMQ时,使用的是MQTT协议。为了不影响目前的业务,我们需要寻找一个MQTT协议代理来完成我们整体的消息中间件集群。

消息中间件集群规划图如下:

image-20201104142521444

那么,使用什么样的MQTT Broker呢?

MQTT Broker比较

Broker language QoS auth cluster bridge 是否开源
EMQ erlang语言 username/password;
JWT;LDAP、ClientID等
mosquitto c++
moquette java - 支持,但有限制
jmqtt java username/password

Broker技术选型

MQTT Broker还有很多,包括尚未开源的,没有在上面的表格中列出来。主要原因就是它不在我们的考虑范围。

emq

EMQ是一个基于Erlang语言的开源mqtt服务器,目前来看是开源的最好的mqtt服务器,也是国内开源的mqtt服务器,优点是功能全面,文档齐全,社区活跃,有很好的支持,缺点是因为erlang语言,对于其他语言的开发者自己扩展有一定难度。

emq官网宣称的特性:

EMQ的缺点:

开源版本的EMQ不支持消息持久化。

虽说EMQ是一个很好的Broker,但是不在我们选择之中。第一个原因是,erlang语言并非流行开发语言,不好维护。第二个原因是,消息持久化不开源。

mosquitto

mosquitto是基于c++的开源mqtt服务器,开源社区较活跃,功能较齐全,缺点也是因为采用c++实现,对于其他语言的开发者很难扩展。

因为语言关系,也不在我们的考虑之中。

moquette

moquette是基于java开发的mqtt服务器。开源社区较活跃,采用java实现,功能较齐全,也是我在实际工作中参考最多的一个mqtt开源broker。

缺点是:无法集群实现,无高可用、高可靠等功能。基本决定了无法在生产环境使用。因此,也不在我们的考虑范围之中。

jmqtt

jmqtt也是由java语言实现的,主要基于netty实现。jmqtt官网宣称的特性:

通过jmqtt的介绍,看起来符合我们的技术选型标准。java语言,大家都比较熟悉。可集群化部署,可和RocketMQ进行对接。

总结

综上所述,在对MQTT协议的Broker上,我们选择JMQTT。关于消息中间件的集群搭建,后面文章会详细介绍。