MQTT消息中的消息顺序是否得以保留?

39

我想知道消息发送的顺序是否被保留。也就是说,当发布者发送一系列的消息时,每个订阅者是否保证接收到与发布者发送顺序相同的消息?这适用于干净和持久化会话吗?

2个回答

59
在MQTT 3.1.1规范中,可以找到有关消息排序功能的摘要,请点击这里
总而言之:
  • 不能保证使用不同QoS值发布的消息相对顺序。 (例如,QoS 0可以超过QoS 2,因为它涉及单个数据包,而后者则涉及4个数据包)。
  • QoS 0消息将按顺序传递(尽管消息可能会丢失)
  • QoS 2消息将按顺序传递
  • QoS 1允许消息重复-可能会在发布下一条消息的第一个实例之后到达重复的消息。
如果客户端/代理只允许同时处理一条消息,则可以保证QoS 1排序。

1
v5.0规范:https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901240 - Slate
2
但是,在QoS1中,“第一次到达”的顺序是否得到保证? - Stasik
1
每个主题中的消息顺序是否有保证? - user7335295
@user7335295 没有跨主题的保证。 - knolleary
我无法理解你是如何从文档中推断出以下内容:“QoS 2 消息将按顺序传递”。我认为,除非经纪人和任何发布者都将“in-flight”消息设置为1,否则QOS 1和2的顺序不能保证。 - abhiarora

5
当出版者发送一系列消息时,每个订阅者是否保证接收到的顺序与出版者发送的顺序相同?
这个问题已经得到了回答并被广泛接受,但我看到已接受的答案中以下陈述存在问题。
QoS 2 消息将按顺序传递
根据文档,在 QOS 2 级别的消息中,将按主题维护发布、PUBREC、PUBREL、PUBCOMP 数据包的顺序。然而,订阅者仍可能按照出版者不同的顺序接收(可能但很少见)。相同的逻辑也适用于 QOS 1。
让我们看看如何:
  1. 代理已发送PUBLISH数据包以传递消息m1。

  2. 代理已发送PUBLISH数据包以传递消息m2。

  3. 订阅者已发送PUBREC数据包以确认收到消息m1。

  4. 订阅者已发送PUBREC数据包以确认收到消息m2。

  5. 代理已发送PUBREL数据包以传递消息m1,但该数据包已被丢弃。

  6. 代理已发送PUBREL数据包以传递消息m2。

  7. 订阅者已发送PUBCOMP数据包以确认收到消息m2。

  8. 代理在消息m1的PUBREL数据包超时后重试,将为消息m1重试。

  9. 代理重新发送PUBREL数据包以传递消息m1。

  10. 订阅者已发送PUBCOMP数据包以确认收到消息m1。

根据上述顺序,接收器有可能先处理消息m2。然而,m1是在m2之前发布的。

查看此答案以获取更多详细信息。

enter image description here

图片来自u-blox


我认为值得注意的是,3.1规范指出重新连接是“客户端或服务器必须重新传递消息的唯一情况”,而v5规范则通过“客户端和服务器在任何其他时间都不得重发消息”来加强这一点。由于MQTT运行在“提供有序、无丢失、双向连接”的连接上,因此丢失的消息应该会导致断开连接。 - Brits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接