MQTT是在 TCP/IP 之上使用的轻量级发布-订阅协议,常用于物联网的场景,MQTT 使用消息代理在发布消息的发送者和对这些消息感兴趣的接收者之间分派消息,同一个客户端可以发布和订阅消息。
MQTT 定义了三个级别的服务质量,也就是QoS,这三种级别分别代表什么意思,估计很多使用MQTT的小伙伴没太关注,有时候你遇到问题了,特别是那种诡异的问题,更不会朝这个上面想,今天瑞哥就带大家详细的了解一下MQTT的QoS,让我们直接开始!
MQTT的消息传输过程
在展开QoS前,我们有必要知道MQTT的消息传输过程。
MQTT分别三种角色:
- Publisher:消息的发布者
- Broker:消息的中转地,也被称为经纪人
- Subscriber:消息的订阅者
从三种角色的描述中,大家也不难发现,消息的传递过程大体是这样:
- Publisher产生消息并将消息传递到Broker;
- Broker将消息传输给不同的Subscriber;
- Subscriber再订阅响应的消息。
值得注意的是发布和订阅还有一个概念叫做Topic,也就是主题,这个又是个啥?
在上面描述中,大家不知道有没有疑问,发布者将消息发给Broker,Broker又向外分发,Broker知道怎么发吗?无脑的群发吗?订阅者也无脑的接收所有的消息吗?
如果真的是这样,那不乱套了!
所以Topic就来拯救了!
如果你不知道怎么理解主题,那你就把主题看作是一个通道或者你就把其中一个主题看成我的网站【不念博客】,在看文章的你,微信中关注的公众号肯定是有限的,你作为订阅者,我是作者,所以相当于是消息的发布者,而微信服务器相当于是Broker,我觉得这个概念你是理解的吧?
那么想象一下,你是不是订阅了所有的公众号?或者说每个公众号发布的消息你都能看到?再或者说微信服务器有没有将所有的公众号消息都推给你?
这一切的一切,答案是不是都是:“否”?
那么首先要明确的是网站的推送方式就类似于“发布-订阅”的模式,那么主题怎么理解呢?
你可以就理解为我的网站【不念博客】,只是在网站的领域,主题可能是【科技/信息技术/不念博客】。
在MQTT中主题也是通过“/”去连接的,它是消息的通道,消息的发布者会朝某个主题中发布消息,订阅这个主题的订阅者都能收到这个消息。
以上就是MQTT消息传输过程的简单解释,下面我们介绍一下MQTT的QoS。
什么是服务质量 (QoS)?
服务质量(QoS) 级别是消息发送者和消息接收者之间的协议,它定义了特定消息的传递保证。
MQTT 中有 3 个 QoS 级别:
- QoS 0
- QoS 1
- QoS 2
有人对特定消息的传递保证这个短句不太理解,什么叫做传递保证?
我举个例子哈,比如你去某某公司找个人,到这家公司后你肯定首先见到的是前台工作人员,这个时候你跟前台人员说话,你说“美女,你好,我找你们公司王工,请帮我喊一下!”
这个时候,可能公司太忙,美女前台没有听到你的消息,你就在那一直问,或者你就问一次,也不管结果了。
还有一种情况就是,前台听到了,她去找你要找的王工,可能王工去开会了,没在工位,这个时候前台也有两种情况,一种就是来回来回找,知道找到,一种就是找过一次,不管找没找到也不找了。
那么理解上面的话,我再讲QoS,你就很好理解了。
MQTT中的QoS
在 MQTT 中谈 QoS 时,需要考虑消息传递的两个方面:
- 消息从发布客户端(Publisher)传递到代理(Broker)。
- 从代理(Broker)到订阅客户端(Subscriber)的消息传递。
我们将分别查看消息传递的两个方面,因为两者之间存在细微差别。将消息发布到代理的客户端(你)在向代理(前台)发送消息时定义了消息的 QoS 级别(重复喊的次数),代理使用每个订阅客户端在订阅过程中定义的 QoS 级别将此消息传输到订阅客户端,这个时候,如果订阅客户端定义的 QoS 低于发布客户端,则代理会以较低的服务质量发送消息。
最后一句话怎么理解,比如你向前台喊一次,正常情况下,前台会帮你去王工工位上喊一次,或者不喊,这个理解吧,这个是不是就是【代理会以较低的服务质量发送消息】的理解,或者你向前台喊两次,前台可以帮你喊一次、喊两次(最多)、甚至不喊。
如果你能理解以上我举的例子,下面你再去了解各个级别的QoS会非常好理解!
QoS 0
最多一次
QoS 0 是尽最大努力传递,不保证消息的传递。当 MQTT 客户端以 QoS 1 发布时,MQTT 代理不确认收到,并且消息不被发送者存储和重新发送,QoS 0 通常被称为“即发即弃”,提供与底层 TCP 协议相同的保证。
QoS 1
至少一次
QoS 1 保证一条消息至少一次传递给接收方,MQTT 代理将使用 PUBACK 确认消息。MQTT 客户端将存储消息,直到它收到来自代理的 PUBACK,MQTT 客户端可能会多次传递消息,直到收到代理的确认。
发送方使用每个数据包中的数据包标识符将 PUBLISH 数据包与相应的 PUBACK 数据包匹配,如果发送方在合理的时间内没有收到 PUBACK 数据包,则发送方重新发送 PUBLISH 数据包。
QoS 2
仅一次
QoS 2 是 MQTT 中最高级别的服务,此级别保证每条消息仅由预期的收件人接收一次,QoS 2 是最安全和最慢的服务质量级别,该保证由发送方和接收方之间的至少两个请求/响应流(四次握手)提供,发送方和接收方使用原始 PUBLISH 消息的数据包标识符来协调消息的传递。
当接收方从发送方获得 QoS 2 PUBLISH 数据包时,它会相应地处理发布消息,并使用确认 PUBLISH 数据包的PUBREC数据包回复发送方。如果发送方没有从接收方收到 PUBREC 数据包,它会再次发送带有重复 (DUP) 标志的 PUBLISH 数据包,直到收到确认。
总结
近年来,物联网的发展,使得MQTT协议变得越来越香,而MQTT中的服务质量也就是QoS是MQTT中比较重要的概念,当你使用的时候,发现你明明就想发送一条消息,但是日志显示你发了多条,难道你是真的发了多条吗?非也,可以好好检查一下你设置的QoS,然后不理解的话可以多看看本文,本文详细的介绍了QoS的三个级别,希望能给您带来收获!