【问题标题】:Is message order preserved in MQTT messages?MQTT 消息中是否保留了消息顺序?
【发布时间】:2015-09-06 10:31:09
【问题描述】:

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

【问题讨论】:

    标签: mqtt


    【解决方案1】:

    可以在规范本身here 中找到 MQTT 3.1.1 中消息排序功能的摘要。

    总结:

    • 不保证以不同 QoS 值发布的消息的相对顺序。 (例如,QoS 0 可以取代 QoS 2,因为它涉及单个数据包而不是后者的 4 个数据包)。
    • QoS 0 消息将按顺序传递(尽管消息可能会丢失)
    • QoS 2 消息将按顺序传递
    • QoS 1 允许消息重复 - 在发布的下一条消息的第一个实例之后可能会出现重复消息。

    如果客户端/代理在任何时候只允许一条消息传输,则可以保证 QoS 1 排序。

    【讨论】:

    • 但是,QoS1中是否保证了“先到”的顺序?
    • 是否只保证每个主题的消息顺序?
    • @user7335295 不保证跨主题
    • 我无法理解您如何从文档中推断出以下QoS 2 messages will be delivered in order。我认为顺序不能保证 QOS 1 和 2,除非 in-fight 消息为代理和任何发布者设置为 1。
    【解决方案2】:

    当发布者发送一系列消息时,是否保证每个订阅者都会收到与发布者发送消息相同的序列?

    这个问题已经得到回答并被广泛接受,但我发现accepted answer 中的以下语句存在问题。

    QoS 2 消息将按顺序传递

    根据documentation,提到了PUBLISHPUBRECPUBRELPUBCOMP 的数据包序列将在QOS 2 级别的消息中按主题维护。但是,订阅者仍然可以以不同于发布者发布的顺序接收(可能但很少见)。同样的逻辑也适用于QOS 1

    让我们看看如何:

    1. 消息 m1 的代理已发送 PUBLISH 数据包。

    2. 消息 m2 的代理已发送 PUBLISH 数据包。

    3. 订户已为消息 m1 发送 PUBREC 数据包。

    4. 订户已为消息 m2 发送 PUBREC 数据包。

    5. 消息 m1 的代理已发送 PUBREL 数据包。 但它被丢弃了。

    6. 消息 m2 的代理已发送 PUBREL 数据包。

    7. 订阅者已为消息 m2 发送 PUBCOMP 数据包。

    8. 消息 m1 发生了代理处的 PUBREL 数据包超时。 Broker 将重试消息 m1。

    9. 代理重新传输消息 m1 的 PUBREL 数据包。

    10. 订阅者已为消息 m1 发送 PUBCOMP 数据包。

    通过上述顺序,有可能消息m2在接收方首先被处理。但是,m1 是在 m2 之前发布的。

    更多详情请参阅answer

    图片取自u-blox

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2015-05-09
      • 2011-04-09
      • 2019-06-18
      • 2019-11-15
      相关资源
      最近更新 更多