1. MQTT协议
这段时间吧,很有幸,解除到了一种协议MQTT,之前呢,在一些同行的盆友口中也略有耳闻。但是也仅仅是听过,并没有下来花什么时间对它进入太多的了解与熟悉。现在不同,工作项目中有所应用,这下我就不得不去了解了。我们搞技术的就是这样,很多时候,对于新鲜的事务可能没有到真实应用的时候,并不会去刻意的了解与学习,只有等到要用的时候,才去学习。哎!都是被工作赶着走的人儿呢。尴尬!!
好了,言归正转。我们来聊聊MQTT。
首先我来说一下这篇文章的标题,可能会把人带偏,其实MQTT并不是一种消息中间件,MQTT是一种通信传输协议。只是我们可以去基于MQTT规范去实现一个MQTT的消息中间件。所以人们可以将这一类实现了MQTT协议的中间件服务统称为MQTT消息中间件,我暂时是这么理解的。
说到MQTT协议,那么MQTT是一种什么协议呢。MQTT是IBM定义的一种比较轻量级的发布定于模式消息传输协议。主要用于针对物联网应用中低宽带和网络环境不是很稳定的场景。比如什么智能硬件啊,车联网等,智能家居,智能电器,智慧城市,电力,石油,能源等市场。
MQTT协议的特点:
- 开放消息协议,简单易实现
- 发布订阅模式,一对多消息发布
- 基于TCP/IP网络连接
- 1字节固定报头,2字节心跳报文,报文结构紧凑
- 消息QoS支持,可靠传输保证
目前MQTT V3.1.1应用比较广泛。他的报文结构主要包含三个部分 固定报头(Fixed header) 可变报头(Variable header) 报文有效载荷(Payload) 报文类型相对比较多。
消息类型 | 说明 |
---|---|
CONNECT | 发起链接请求 |
CONNACK | 链接响应 |
PUBLISH | 发布消息 |
PUBACK | 发布消息响应 |
PUBREC | QoS2消息响应 |
PUBREL | 释放QoS2消息 |
PUBCOMP | QoS2消息完成 |
SUBSCRIBE | 主题订阅 |
SUBACK | 主题订阅响应 |
UNSUBSCRIBE | 取消订阅 |
UNSUBACK | 取消订阅响应 |
PINGREQ | PING请求 |
PINGRESP | PING响应 |
DISCONNECT | 断开连接 |
消息QoS MQTT的QoS保证不是端到端的,是客户端与服务端之间的,订阅者受到MQTT消息的Qos级别,最终取决于发布消息的QoS和主题订阅的QoS。 Qos有0,1,2三个可选值
Qos值 | 描述 |
---|---|
0 | 最多一次的传输 |
1 | 至少一次的传输 |
2 | 只有一次的传输 |
2. MQTT与传统消息中间件应用场景对比
传统的消息中间件,例如消息队列 RocketMQ 版、消息队列 Kafka 版等都是面向微服务大数据等领域,负责消息的存储和转发,消息的生产者和消费者都是服务端应用。
这种比较适合服务端语言平台相对固定,技术栈也相对固定的场景,但是在物联网IOT领域不同,这样的场景更多的是多语言多平台的海量硬件设备的接入,传统的消息中间件在这种领域并不是那么合适。
说白了,还是使用场景不同。下面总结一下
中间件 | 应用场景 |
---|---|
MQTT | 适用于移动端场景,在那种海量设备,<br>但是单个设备数据量较少的场景。<br>所以MQTT这种在大量的在线客户端,比如设备过万,上百万,<br>且每个设备消息又不是很多的场景 |
Kafka,RocketMQ等传统消息中间件 | 应用在项目,服务内部进行通信的场景,<br>主要还是解决解耦合,异步通知,削峰等问题,<br>这种响度规模比较小,大多就几十上百个服务的规模,<br>但是针对单个的服务,数据量相对较大,吞吐量要求比较高,<br>所以这种传统的消息中间件更适合去做一些数据的处理与分析的场景 |
3. 介绍几种MQTT代理服务器
这种基于MQTT协议实现的服务器还是比较多的,有共有云的,也有自己可以私下进行部署使用的。
基于云环境,比较推荐的是阿里云的MQTT。这种在阿里云也有响应的介绍。
私有部署的种类繁多,我这里只部署使用到一种mosquitto,单机环境不是相对简单,在集群环境下部署的话,就问题比较多了。
来源:oschina
链接:https://my.oschina.net/u/3553496/blog/4253897