MQTT消息中是否保留消息顺序?

MQTT消息中是否保留消息顺序?,mqtt,Mqtt,我想知道是否保留了按顺序发送的消息。也就是说,当发布者发送一系列消息时,是否保证每个订阅者都会收到与发布者发送的消息相同的序列?对于干净会话和持久会话 MQTT 3.1.1中消息排序功能的摘要可以在规范本身中找到 总之: 不保证以不同QoS值发布的消息的相对顺序。(例如,QoS 0可以超过QoS 2,因为它涉及单个分组,而不是后者的4个分组) QoS 0消息将按顺序传递(尽管消息可能会丢失) QoS 2消息将按顺序传递 QoS 1允许消息重复-有可能在发布的下一条消息的第一个实例之后出现重复消

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

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

总之:

  • 不保证以不同QoS值发布的消息的相对顺序。(例如,QoS 0可以超过QoS 2,因为它涉及单个分组,而不是后者的4个分组)
  • QoS 0消息将按顺序传递(尽管消息可能会丢失)
  • QoS 2消息将按顺序传递
  • QoS 1允许消息重复-有可能在发布的下一条消息的第一个实例之后出现重复消息
如果客户机/代理在任何时候只允许发送一条消息,则可以保证QoS 1排序

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

这个问题已经得到了回答,并得到了广泛的接受,但我在报告中看到以下陈述存在问题

QoS 2消息将按顺序传递

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

让我们看看如何:

  • 消息m1的发布数据包已由代理发送

  • 消息m2的发布数据包已由代理发送

  • 订户已为消息m1发送PUBREC数据包

  • 订户已为消息m2发送PUBREC数据包

  • 代理已为消息m1发送PUBREL数据包但它掉了。

  • 代理已为消息m2发送PUBREL数据包

  • 订户已为消息m2发送PUBCOMP数据包

  • 消息m1在代理上的PUBREL数据包超时。代理将重试消息m1。

  • 代理为消息m1重新传输PUBREL数据包

  • 订户已为消息m1发送PUBCOMP数据包

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

    有关更多详细信息,请参见此


    图片取自。

    v5.0规范:但是,QoS1中是否保证了“首次到达”的顺序?是否只保证每个主题的消息顺序?@user7335295不保证跨主题发送。我无法理解您如何从文档中推断以下
    QoS 2消息将按顺序发送。我认为,对于QOS 1和QOS 2,顺序是不能保证的,除非为broker和任何发布者将搏击中的
    消息设置为1。