MQTT QoS 1 排序

问题描述 投票:0回答:1

我遇到了这个答案:https://stackoverflow.com/a/38094997/403875

但是我不清楚“按照PUBLISH数据包发送的顺序重新发送”是什么意思。

假设我发送“A”、“B”、“C”(均具有 QoS 1)并获取“A”和“C”的 ACK(“B”丢失)。如果我然后重新发送“B”,接收者将乱序接收它们,不是吗?那么这个限制有什么作用呢?什么时候适用?发送方是否需要重新发送“B”“C”以确保最后收到“C”?如果这次它收到“B”的 ACK,而不是“C”怎么办?现在是否需要再次发送“C”直到收到另一个“C”ACK?

networking mqtt packet-loss
1个回答
0
投票

假设我发送“A”、“B”、“C”(均具有 QoS 1)并获取“A”和“C”的 ACK(“B”丢失)。

我假设所有消息都在同一个“有序主题”上发送(在整个答案中),并且服务器遵守 MQTT 规范。鉴于此,您应该只收到以下内容的 PUBACK:

  • “A”后跟失去连接,或
  • “AB”后跟失去连接,或
  • “ABC”

因为:

  • MQTT 它运行在“TCP/IP 或其他提供有序、无损、双向连接的网络协议”上,因此连接应按顺序传送数据包(否则连接应断开)。
  • 规范要求服务器“按照收到相应 PUBLISH 数据包的顺序发送 PUBACK 数据包”。

这意味着您应该按照发送

PUBACK
数据包的顺序接收
PUBLISH
数据包,否则连接就会断开(并且重新发送数据包的规则将发挥作用)。

由于错误,服务器可能不会按指定的顺序响应。此时服务器违反了协议(因此协议提供的任何保证不再适用)。

但是我不清楚“按照PUBLISH数据包发送的顺序重新发送”是什么意思。

假设我发送“ABCD”并收到“A”的 ACK,然后连接丢失。上面只是说我应该按该顺序重新传输“BCD”。

这些规则可能看起来非常简单,但是当您尝试实施它们时,事情可能会变得非常复杂,并且需要做出各种权衡。考虑一个客户端接收两条

PUBLISH
消息并将它们都提交到数据库。为了加快处理速度,我们可以启动一个单独的线程来存储消息,然后触发
PUBACK
。然而,这意味着第二条消息可能会先完成处理——我们应该立即发送 ACK 还是等待? (规范表明
PUBACK
应延迟)。

“有序、无损”如果不是“100% 稳定”是什么意思?

该规范要求底层连接提供“有序、无损、双向连接”,但不包括对这些连接的寿命的任何要求。由于多种原因,连接有时会失败,包括:

  • 您可能需要重新启动正在运行接收的服务器。
  • 网络可能出现中断(例如,手机连接丢失)。
  • 您的网关可能会失败(意味着 NAT 规则丢失)

该规范详细说明了应如何详细处理连接问题(请参阅保持活动状态操作行为等)。

© www.soinside.com 2019 - 2024. All rights reserved.