mqtt qos2 和 qos 的最佳实践 · 物联网平台-威尼斯人最新

niubi · 2020年05月25日 · 最后由 回复于 2022年08月19日 · 504 次阅读
本帖已被设为精华帖!

qos0 和 qos1 是相对简单的 qos 等级,qos2 不仅要确保 receiver 能收到 sender 发送的消息,还要保证消息不重复。它的重传和应答机制就要复杂一些,同时开销也是最大的。下面就让我们来看一下 qos2 的机制。本节课核心内容:

  • qos2 -qos 和会话(session)
  • 如何选择 qos

7.1 qos2

在 qos2 下,一条消息的传递流程如下:

qos 使用 2 套请求/应答流程(一个 4 段的握手)来确保 receiver 收到来自 sender 的消息,且不重复:

  • sender 发送 qos 为 2 的 publish 数据包,数据包 packet identifier 为 p,并在本地保存该 publish 包;
  • receiver 收到 publish 数据包以后,在本地保存 publish 包的 packet identifier p,并回复 sender 一个 pubrec 数据包,pubrec 数据包可变头中的 packet identifier 为 p,没有消息体(payload);
  • 当 sender 收到 pubrec,它就可以安全地丢弃掉初始的 packet identifier 为 p 的 publish 数据包,同时保存该 pubrec 数据包,同时回复 receiver 一个 pubrel 数据包,pubrel 数据包可变头中的 packet identifier 为 p,没有消息体;如果 sender 在一定时间内没有收到 pubrec,它会把 publish 包的 dup 标识设为 1,重新发送该 publish 数据包(payload);
  • 当 receiver 收到 pubrel 数据包,它可以丢弃掉保存的 publish 包的 packet identifier p,并回复 sender 一个 pubcomp 数据包,pubcomp 数据包可变头中的 packet identifier 为 p,没有消息体(payload);
  • 当 sender 收到 pubcomp 包,那么它认为数据包传输已完成,它会丢弃掉对应的 pubrec 包。如果 sender 在一定时间内没有收到 pubcomp 包,它会重新发送 pubrel 数据包。

我们可以看到在 qos2 中,完成一次消息的传递,sender 和 reciever 之间至少要发送四个数据包,qos2 是最安全也是最慢的一种 qos 等级了。

我们可以运行上一课中的 publish_with_qos.js 和 subscribe_with_qos.js 来验证一下:

node publish_with_qos.js --qos=2 输出为:

send: publish
receive: pubrec
send: pubrel
receive: pubcomp

node subscribe_with_qos.js --qos=2 输出为:

receive: publish
send: pubrec
receive: pubrel
send: pubcomp

当然,和上一课讲的一样,如果 publish qos 为 1,subscribe qos 为 2,或者 publish qos 为 2,subscribe qos 为 1,那么实际 subscribe 接收消息的 qos 仍然为 1。

7.2 qos 和会话(session)

如果 client 想接收离线消息,必须使用持久化的会话(clean session = 0)连接到 broker,这样 broker 才会存储 client 在离线期间没有确认接收的 qos 大于 1 的消息。

7.3 如何选择 qos

在以下情况下你可以选择 qos0:

  • client 和 broker 之间的网络连接非常稳定,例如一个通过有线网络连接到 broker 的测试用 client;
  • 可以接受丢失部分消息,比如你有一个传感器以非常短的间隔发布状态数据,所以丢一些也可以接受;
  • 你不需要离线消息。

在以下情况下你应该选择 qos1:

  • 你需要接收所有的消息,而且你的应用可以接受并处理重复的消息;
  • 你无法接受 qos2 带来的额外开销,qos1 发送消息的速度比 qos2 快很多。

在以下情况下你应该选择 qos2:

  • 你的应用必须接收到所有的消息,而且你的应用在重复的消息下无法正常工作,同时你也能接受 qos2 带来的额外开销。

实际上,qos1 是应用最广泛的 qos 等级,qos1 发送消息的速度很快,而且能够保证消息的可靠性。虽然使用 qos1 可能会收到重复的消息,但是在应用程序里面处理重复消息,通常并不是件难事。在实战的课程里面我们会看到如何在应用里对消息去重。

thingskit 将本帖设为了精华贴 05月25日 23:16
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
网站地图