MQTT服务质量-QoS

QoS是消息发送方和接收方之间的协议,定义了指定消息发送保证等级。本文将深入探究MQTT中不同的QoS等级。

QoS是什么

MQTT提供三个QoS等级:

  • 最多一次(QoS 0)
  • 至少一次(QoS 1)
  • 确切一次(QoS 2)

在MQTT中如何检查消息发送

当讨论MQTT中的QoS时,很重要的是考虑消息从发布的客户端到代理(broker)、从代理(broker)到订阅的客户端。这两方面的消息发送和微秒的区别。
发布消息到代理(broker)的客户端定义了消息传输期间的QoS等级。代理(broker)然后将消息传输给订阅的客户端,使用的QoS等级是由订阅的客户端在订阅过程时定义的。如果订阅的客户端定义的QoS等级低于发布的客户端,代理(broker)将会使用低等级的QoS传输消息。
理解了消息在MQTT中是如何传递的,为理解QoS级别在确保发布客户端、代理(broker)和订阅客户端之间的可靠通信方面的重要性奠定了基础。

为什么QoS重要

QoS对MQTT很重要,因为它的作用是让客户端能够选择符合网络可靠性和应用程序需求的服务级别。MQTT的固有能力,即使在不可靠的网络条件下,也能处理消息重新传输并确保发送,使QoS对于在这种具有挑战性的环境中促进无缝通信至关重要。通过提供不同的QoS等级,MQTT授权客户端优化其网络应用,达到稳定性和有效性之间理解的平衡。
现在,我们理解了QoS在MQTT中意义,让我们深入了解QoS的工作机制,探究它在各种网络条件下,如何确保稳定的消息传输的。

QoS 0如何工作

在最低等级,在MQTT中,QoS 0提供了一种尽力而为的机制,在该机制中,发送方不期望对消息的传递的确认或保证。这意味着接收方不确认其收到了消息,发送方不保存或重发消息。QoS 0,通常被称为“即发即弃”,其功能类似于底层TCP协议,在该协议中发送消息时无需进一步跟进或确认。
MQTT服务质量-QoS_第1张图片

QoS 1如何工作

QoS 1,重点在确保消息至少发送一次到接收方。当一条消息以QoS 1发布时,发布方保存一个复本直到它接收到一条来自接收方的PUBACK包,确认消息成功接收。如果发送方在合理时间内没有收到PUBACK包,它会重新发送该消息来确保它的发送。
MQTT服务质量-QoS_第2张图片
一旦收到消息,接收方可以立即进行处理。比如,如果接收方是一个MQTT代理(broker),它会分发消息到所有的订阅客户端,然后用一个PUBACK包响应,确认收到这条消息。
MQTT服务质量-QoS_第3张图片
需要注意的是,在QoS 1中,如果发布客户端又发送了相同的消息,设置了一个重复(DUP)标志,但是这个标志是为了内部目的,不被代理(broker)或客户端处理。无论DUP标志如何,接收方仍会发送PUBACK包以确认收到消息,从而确保发送方知道成功传递。QoS 1的这种方法在可靠性和效率之间取得了平衡,确保至少一次到达接收方,同时允许适当处理潜在的重复项。

QoS 3如何工作

在MQTT中,QoS 2提供最高的等级,确保每条消息都被准确的发送一次到指定的接收者。为了达到这个目的,QoS 2涉及发送方和接收方之间四次握手。
MQTT服务质量-QoS_第4张图片
当接收方从发送方收到一个QoS 2等级的PUBLISH数据包,它处理发布的数据,用一个PUBREC数据包响应发送方,确认PUBLISH数据包。如果发送方没有从接收方收到PUBREC数据包,它就会再次发送有一个重复(DUP)标志的PUBLISH数据包,直接收到确认。
MQTT服务质量-QoS_第5张图片
发送方一旦收到PUBREC数据包,就可以安全的抛弃原来的PUBLISH数据包。发送方存储来自接收方的PUBREC数据包,以一个PUBREL数据包作为响应,接收方抛弃所有存储的状态,用一个PUBCOMP数据包作为响应。
MQTT服务质量-QoS_第6张图片
当接收方收到PUBREL数据包,就会抛弃所有存储的状态,用一个PUBCOMP数据包作为响应。直到接收方完成处理,发送一个PUBCOMP数据包到发送方之前,接收方会存储对原始PUBLISH数据包的数据包标识符的引用。这一步避免了重复处理这个消息。
当发送方收到PUBCOMP数据包,已发送消息的数据包标识符就可以再次使用。
MQTT服务质量-QoS_第7张图片
当QoS 2流程完成,双方就会确认消息已被发送,发送方也确认这个方法。
如果数据库包丢失,在规定的时间内发送方负载重新发送这条消息,无论发送方是一个MQTT客户端还是MQTT代理(broker)。接收方有责任相应的响应每个命令消息。

MQTT中QoS的关键考虑因素

当去理解MQTT中的QoS时,有几个重要的方面需要考虑。

QoS降级

发送方和接收方定义的QoS等级能够不同。发送消息到代理(broker)的客户端定义QoS,但是代理(broker)使用的QoS是接收方在订阅时定义的。比如,如果发送方使用的QoS 2,接收方使用QoS 1订阅,代理(broker)使用QoS 1发送消息到接收方。这就可能导致向接收方多次传递同一消息。

数据包标识符在每个客户端是唯一的

在一次指定客户端和代理(broker)的交互中,QoS 1和QoS 2使用的数据包标识符是唯一的。但是,在所有的客户端中不是唯一的。一旦一个流程结束,数据包标识符就可以再次使用。这就是为什么数据包标识符不需要超过65535,因为对于一个客户端来说,发送超过这个数量的消息且都没有完成是不太现实的。

使用QoS的最佳实践

经常被问到如何选择正确的QoS等级。选择合适的QoS等级依赖于具体的应用场景。下面是一些导则帮你做出合适的决定:

何时使用QoS 0

  • 发送方和接收方拥有完全或基本可靠的连接。QoS 0的一个经典用例是通过有线连接将测试客户端和前端应用程序连接到MQTT代理(broker).
  • 如果你不介意一些消息偶尔的丢失。一些消息的丢失是可接受的,如果数据不是那么重要或数据在较短间隔内发送。
  • 不需要消息队列。仅当断开连接的客户端具有QoS 1或QoS 2和持久会话时,才会为断开连接的客户端排队。

何时使用QoS 1

  • 你需要获取每条消息且你的用例能够处理重复消息。QoS 1是最常用的,因为它保证每条消息至少送达一次,但允许重复发送。当然,你的应用程序必须忍受重复并能够进行相应的处理。
  • 你无法承受QoS的开销。QoS 1传递消息的速度比QoS 2快得多。

何时使用QoS 2

  • 对你的程序来说,所有消息准确的接收一次非常重要。如果重复发送可能会损害应用程序用户或订阅的客户端。注意这其中的开销,QoS 2的交互会消耗更多的时间。

QoS 1和QoS 2的消息队列

对于离线的客户端,所有以QoS 1和QoS 2发送的消息都会排队,直到客户端再次可用。但是,只有当客户端有持续会话时,这些队列才可能。

结论

本文主要介绍了服务质量,即QoS。三个等级的QoS的工作原理,发送方和接收方的交互过程。对如何选择合适的QoS等级提了一些建议。接下来的文章,我们会介绍QoS相关的MQTT中的持续会话。

你可能感兴趣的:(MQTT,MQTT,架构,中间件)