简化情况下能否保证mqtt消息送达顺序?

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

如果只有一个代理、一个发布者、一个主题和干净的会话,在这个简化的情况下,

能否保证订阅者端的消息传递顺序与发布者端的发送顺序相同?会受到QoS影响吗?

mqtt paho
2个回答
5
投票
MQTT 3.1.1

spec 中的4.6 节涵盖了消息排序:

4.6 消息订购

客户端在实现协议流程时必须遵循这些规则 本章其他地方定义:

  • 当它重新发送任何 PUBLISH 数据包时,它必须按照原始 PUBLISH 数据包的发送顺序重新发送它们(这适用于 QoS 1 和 QoS 2 消息)[MQTT-4.6.0-1]
  • 它必须按照接收相应 PUBLISH 数据包的顺序发送 PUBACK 数据包(QoS 1 消息) [MQTT-4.6.0-2]
  • 它必须按照接收相应 PUBLISH 数据包的顺序发送 PUBREC 数据包(QoS 2 消息) [MQTT-4.6.0-3] 它必须按照相应 PUBREC 数据包的接收顺序发送 PUBREL 数据包(QoS 2 消息) [MQTT-4.6.0-4]

服务器必须默认将每个主题视为“有序主题”。它 可以提供管理或其他机制来允许一个或多个 被视为“无序主题”的主题 [MQTT-4.6.0-5]。

当服务器处理一条已发布到某个服务器的消息时 已订购主题,发送时必须遵循上述规则 向每个订阅者发送消息。此外,它必须发送 PUBLISH 数据包发送给消费者(对于相同的主题和 QoS)的顺序如下: 它们是从任何给定客户端 [MQTT-4.6.0-6] 收到的。

读完后,我得出的结论是,消息通常会按顺序发送(除非代理专门设置为使用无序主题),但如果高 QOS 消息未正确确认,则可能会重新发送,这可能会导致它被重新传送到外部顺序。


0
投票

对于 MQTT v5.0 spec 留下“非规范注释”:

如果客户端和服务器都将接收最大值设置为 1,则它们会确保在任何时间“正在发送”的消息不超过一条。在这种情况下,即使在重新连接时,在任何后续消息之后都不会收到 QoS 1 消息。例如,订阅者可能会按 1,2,3,3,4 的顺序收到它们,但不会按 1,2,3,2,3,4 的顺序收到。

类似的评论在 v3.x 的规范中,但没有任何提示如何将飞行中的消息保持在 1。

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