MQTT Qos

MQTT Qos等级

  • MQTT设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同层次QoS(Quality of Service):

  • Qos 0:最多发送一次

    • 发送端发送报文 如果发送失败就算了
  • Qos 1:至少发送一次 【通过Ack机制】

    • 发送端发送报文 如发送失败就继续发送,接收端至少收到一次

      也就是发送失败会继续发送,因为消息重传,接收端有可能收到相同的信息

  • Qos 2:确保只有一次

    • 发送端发送数据,确保接收端可以收到,确保只能收到一次

      发送端向接收端发送数据,发送失败就继续重试,直到接收端收到消息为止,同时保证接收端不会因为消息重传而重复接收到相同的信息

PS:QoS 级别越高,流程越复杂,系统资源消耗越大。应用程序可以根据自己的网络场景和业务需求,选择合适的 QoS 级别

流程图设计:

Qos 0:

image-20221111175037748

Qos 1:

image-20221111185458363

Qos 2:

  • 流程太复杂

当 QoS 为 2 时,发布者和订阅者通过两次会话来保证消息只被传递一次,这是最高等级的服务质量,消息丢失和重复都是不可接受的。使用这个服务质量等级会有额外的开销。

发布者发布 QoS 为 2 的消息之后,会将发布的消息储存起来并等待接收者回复 PUBREC 的消息,发送者收到 PUBREC 消息后,它就可以安全丢弃掉之前的发布消息,因为它已经知道接收者成功收到了消息。发布者会保存 PUBREC 消息并应答一个 PUBREL,等待接收者回复 PUBCOMP 消息,当发送者收到 PUBCOMP 消息之后会清空之前所保存的状态。

当接收者接收到一条 QoS 为 2 的 PUBLISH 消息时,他会处理此消息并返回一条 PUBREC 进行应答。当接收者收到 PUBREL 消息之后,它会丢弃掉所有已保存的状态,并回复 PUBCOMP。

无论在传输过程中何时出现丢包,发送端都负责重发上一条消息。不管发送端是 Publisher 还是 Broker,都是如此。因此,接收端也需要对每一条命令消息都进行应答。

MQTT_3.png

参考:MQTT QoS(服务质量)介绍 | EMQ (emqx.com)

posted @   ~内个臣呐~  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示