我遇到了这个答案: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?
假设我发送“A”、“B”、“C”(均具有 QoS 1)并获取“A”和“C”的 ACK(“B”丢失)。
我假设所有消息都在同一个“有序主题”上发送(在整个答案中),并且服务器遵守 MQTT 规范。鉴于此,您应该只收到以下内容的 PUBACK:
因为:
这意味着您应该按照发送
PUBACK
数据包的顺序接收 PUBLISH
数据包,否则连接就会断开(并且重新发送数据包的规则将发挥作用)。
由于错误,服务器可能不会按指定的顺序响应。此时服务器违反了协议(因此协议提供的任何保证不再适用)。
但是我不清楚“按照PUBLISH数据包发送的顺序重新发送”是什么意思。
假设我发送“ABCD”并收到“A”的 ACK,然后连接丢失。上面只是说我应该按该顺序重新传输“BCD”。
这些规则可能看起来非常简单,但是当您尝试实施它们时,事情可能会变得非常复杂,并且需要做出各种权衡。考虑一个客户端接收两条
PUBLISH
消息并将它们都提交到数据库。为了加快处理速度,我们可以启动一个单独的线程来存储消息,然后触发 PUBACK
。然而,这意味着第二条消息可能会先完成处理——我们应该立即发送 ACK 还是等待? (规范表明 PUBACK
应延迟)。
“有序、无损”如果不是“100% 稳定”是什么意思?
该规范要求底层连接提供“有序、无损、双向连接”,但不包括对这些连接的寿命的任何要求。由于多种原因,连接有时会失败,包括: