MQTT特性 五:服务质量水平(QoS)

原文:滑动验证页面

正文

什么是服务质量?

  • 服务质量水平(QoS)是一个消息的发送者和限定递送保证用于特定消息的消息的接收器之间的协议。MQTT 中有 3 个 QoS 级别:
    1.最多一次(0)
    2.至少一次(1)
    3.恰好一次(2)。
    在 MQTT 中谈 QoS 时,需要考虑消息传递的两个方面:
    1.消息从发布客户端传递到代理。
    2.从代理到订阅客户端的消息传递。
    我们将分别查看消息传递的两个方面,因为两者之间存在细微差别。向代理发布消息的客户端在向代理发送消息时定义了消息的 QoS 级别。代理使用每个订阅客户端在订阅过程中定义的 QoS 级别将此消息传输到订阅客户端。如果订阅客户端定义的 QoS 低于发布客户端,则代理会以较低的服务质量传输消息。

为什么服务质量很重要?

  • QoS 是 MQTT 协议的一个关键特性。QoS 使客户端能够选择与其网络可靠性和应用程序逻辑相匹配的服务级别。因为 MQTT 管理消息的重新传输并保证交付(即使底层传输不可靠),QoS 使不可靠网络中的通信变得更加容易。

它是如何工作的?

  • 让我们仔细看看每个 QoS 级别在 MQTT 协议中是如何实现的,以及它是如何运作的:
  • QoS 0 - 最多一次 (服务质量级别 0:最多交付一次)
    最低 QoS 级别为零。此服务级别可确保尽最大努力交付。不保证交货。接收方不会确认收到消息,并且消息不会被发送方存储和重新传输。QoS 级别 0 通常被称为“即发即忘”,并提供与底层 TCP 协议相同的保证。

image.png

  • QoS 1 - 至少一次 (服务质量级别 1:至少交付一次)
    QoS 级别 1 保证消息至少传递一次给接收者。发送方存储消息,直到它从接收方收到确认收到消息的 PUBACK数据包。一条消息可以多次发送或传递。

image.png

发送方使用每个数据包中的数据包标识符将 PUBLISH 数据包与相应的 PUBACK 数据包进行匹配。如果发送方在合理的时间内没有收到 PUBACK 数据包,则发送方重新发送 PUBLISH 数据包。当接收者收到 QoS 1 的消息时,它可以立即处理它。例如,如果接收方是代理,则代理将消息发送给所有订阅客户端,然后回复一个 PUBACK 数据包。

image.png

如果发布客户端再次发送消息,它会设置重复 (DUP) 标志。在 QoS 1 中,此 DUP 标志仅用于内部目的,不由代理或客户端处理。无论 DUP 标志如何,消息的接收者都会发送 PUBACK。

  • QoS 2 - 恰好一次 (服务质量级别 2:仅交付一次)
    QoS 2 是 MQTT 中最高级别的服务。此级别保证每条消息仅被预期收件人接收一次。QoS 2 是最安全、最慢的服务质量级别。该保证由发送方和接收方之间的至少两个请求/响应流(四部分握手)提供。发送方和接收方使用原始 PUBLISH 消息的数据包标识符来协调消息的传递。

image.png

当接收方从发送方获得 QoS 2 PUBLISH 数据包时,它会相应地处理发布消息并使用PUBREC数据包回复发送方以确认 PUBLISH 数据包。如果发送方没有从接收方得到 PUBREC 数据包,它会再次发送带有重复 (DUP) 标志的 PUBLISH 数据包,直到它收到确认为止。

image.png

一旦发送方收到来自接收方的 PUBREC 数据包,发送方就可以安全地丢弃初始的 PUBLISH 数据包。发送方存储来自接收方的 PUBREC 数据包,并以PUBREL数据包进行响应 。

image.png

接收方得到PUBREL报文后,可以丢弃所有存储的状态,用PUBCOMP报文应答(发送方收到PUBCOMP报文也是如此)。在接收方完成处理并将 PUBCOMP 数据包发送回发送方之前,接收方存储对原始 PUBLISH 数据包的数据包标识符的引用。此步骤对于避免再次处理消息很重要。发送方收到 PUBCOMP 数据包后,已发布消息的数据包标识符可供重复使用。

![image.png](https://upload-images.jianshu.io/upload_images/23718996-22596a0da293faa9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

当 QoS 2 流完成时,双方都确定消息已传递,并且发送方已确认传递。
如果数据包在途中丢失,则发送方有责任在合理的时间内重新传输消息。如果发送方是 MQTT 客户端或MQTT 代理则同样如此。接收方有责任相应地响应每个命令消息。

关于QoS

  • QoS 的某些方面乍一看并不是很明显。当您使用 QoS 时,请记住以下几点:

  • QoS降级
    正如上文已经提到,发送(发布)消息的客户端和接收消息的客户端之间的 QoS 定义和级别是两件不同的事情。这两种交互的 QoS 级别也可以不同。向代理发送 PUBLISH 消息的客户端定义消息的 QoS。但是,当代理将消息传递给接收者(订阅者)时,代理使用接收者(订阅者)在订阅期间定义的 QoS。例如,客户端 A 是消息的发送者。客户端 B 是消息的接收者。如果客户端 B 以 QoS 1 订阅代理并且客户端 A 以 QoS 2 向代理发送消息,则代理以 QoS 1 将消息传递给客户端 B(接收者/订阅者)。消息可以多次传递给客户端乙,

  • 每个客户端的数据包标识符是唯一的
    MQTT 用于 QoS 1 和 QoS 2 的数据包标识符在交互中的特定客户端和代理之间是唯一的。此标识符在所有客户端之间不是唯一的。一旦流完成,数据包标识符就可以重新使用。这种重用是包标识符不需要超过65535的原因。客户端可以在不完成交互的情况下发送超过这个数量的消息是不现实的。

最佳实践

  • 我们经常被问到如何选择正确的 QoS 级别的建议。以下是一些可以帮助您进行决策的指南。适合您的 QoS 在很大程度上取决于您的用例。

当……时使用 QoS 0

  • 您在发送方和接收方之间建立了完全或大部分稳定的连接。QoS 0 的一个经典用例是通过有线连接将测试客户端或前端应用程序连接到 MQTT 代理。
  • 不介意偶尔丢失几条消息。如果数据不是那么重要或数据间隔很短,则某些消息的丢失是可以接受的
  • 不需要消息队列。仅当断开连接的客户端具有 QoS 1 或 2 和持久会话时,消息才会排队 。

当……时使用 QoS 1

  • 需要获取每条消息,并且您的用例可以处理重复项。QoS 级别 1 是最常用的服务级别,因为它保证消息至少到达一次,但允许多次传递。当然,您的应用程序必须容忍重复并能够相应地处理它们
  • 无法承受 QoS 2 的开销。QoS 1 传递消息的速度比 QoS 2 快得多

当……时使用 QoS 2

  • 一次接收所有消息对您的应用程序至关重要。如果重复交付可能损害应用程序用户或订阅客户端,则通常会出现这种情况。请注意开销以及 QoS 2 交互需要更多时间才能完成。

QoS 1 和 2 消息的排队

  • 使用 QoS 1 和 2 发送的所有消息都会排队等待离线客户端,直到客户端再次可用。但是,这种排队只有在客户端具有持久会话时才有可能 。



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值