MQTT简介Mosquitto桥接及集群环境搭建

MQTT v5.0草案中文翻译: github.com/hui6075/mqtt_v5

原创文章如转载,请注明出处(http://blog.csdn.net/hui6075/)。

目录:
MQTT协议简介
Mosquitto桥接模式
Mosquitto集群模式

MQTT协议简介

MQTT是IBM为物联网等环境定义的一套应用层即时通信协议,通过消息中间件,提供订阅/发布方式通过“主题”为不同设备之间的通信提供解耦。

类似的协议还有XMPP、COAP等,但MQTT协议由于信令种类少、控制信息少、信息承载率高,因而对设备的处理能力和网络环境要求比较低。试想,让一个200MHz、64K内存的嵌入式模块去解析HTTP/JASON/XML字符串,可能还没等到数据包解析完,下一条数据就到了,哈哈。当然,也有很多人拿MQTT作为安卓推送协议,也是非常能提高用户体验的,比如MQTT协议里的保留消息,可以让手机收到开机之前系统或其他设备就已经发布的一些消息。

通常称消息中间件为broker,支持MQTT的broker有很多,开源的比如基于C语言的Mosquitto,基于Erlang的EMQ、RabbitMQ+插件,基于Java的ActiveMQ,甚至基于Node.js的Mosca。我自己尝试过Mosquitto和RabbitMQ,Mosquitto完全实现了MQTT协议的所有内容,而RabbitMQ对MQTT的支持并不完善,比如不支持QoS=2的消息以及保留消息。另外中国人自己开发的EMQ也是非常棒的MQTT broker,支持集群,消息持久化。

Mosquitto桥接模式

我的生产环境使用的broker是Mosquitto,老实说Mosquitto最初设计可能也是为了运行在嵌入式平台,使用的IO模型、定时器都比较简陋,通常需要优化才能支持大流量高并发的业务场景,而且流量太大的情况下Mosquitto也支持通过bridge(桥接)的方式连接多台broker,通常选取一台broker作为bridge节点,在其配置文件(mosquitto.conf)中添加桥接选项:

connection bridge1
address 192.168.1.102:1883
topic # both 0

connection bridge2
address 192.168.1.103:1883
topic /sensor/temperature in 1

其中bridge1/bridge2是为其他broker起的名字,地址是其他broker的IP和端口,topic指定了允许本地broker和对方broker之间传递的消息主题,配成#则所有主题消息都将被传递。both/in/out是指允许的消息方向,in是指此主题消息的转发方向只能是从对方broker到本地broker,不能是从本地broker到对方broker,这样如果有客户端连接到本地broker订阅/sensor/temperature这个主题的话,发布到对方broker上的/sensor/temperature主题消息本地客户端也可以收到,反之则收不到。

通过以上介绍,可以知道bridge方式下主题配置非常不灵活,特别是有些场景下消息发布客户端和订阅客户端之间通过MAC地址、UUID等作为主题名进行通信,根本无法手工为每对发布/订阅设备进行配置。

Mosquitto集群模式

Mosquitto也有基于二次开发的集群实现。

集群方式则是动态订阅,每个broker既是发布者也是订阅者,对于连到本地broker的客户端订阅的主题,本地broker会向集群中其他broker进行订阅,因此无需事先动态配置主题过滤器。此外,集群中所有broker都处于同等地位,因此不存在单点失效的问题。配置起来也非常简单,在每个机器的mosquitto.conf中:

node_name node1
node_address 192.168.1.101:1883

node_name node2
node_address 192.168.1.102:1883

node_name node3
node_address 192.168.1.103:1883

编译mosquitto时把config.mk中的WITH_BRIDGE注释掉,把WITH_CLUSTER:=yes取消注释,然后make && make install安装mosquitto,并在所有机器启动mosquitto即可。

功能测试:

在主机1上订阅主题"clustermsg",在主机2上发布主题为"clustermsg"的消息,主机1上可以收到此消息。


benchmark:

在1台broker、2台broker、3台broker、4台broker、9台broker的情况下分别测试集群的整体吞吐率,从1台broker到3台broker时整体吞吐率逐渐增长,增长系数大概在0.8左右,broker超过3台时整体吞吐率由于压测工具的瓶颈而停止增长。


测试参数说明:消息长度固定1000字节,n10k指每个客户端发送10k个消息,c100指一共100个客户端,QoS选取为2。

集群的原理和更详细的性能测试报告,可见mosquitto cluster@github 项目的readme.md。

你可能感兴趣的:(mqtt,消息中间件)