【发布时间】:2015-09-06 10:31:09
【问题描述】:
我想知道是否保留了消息发送顺序。也就是说,当发布者发送一系列消息时,是否保证每个订阅者都会收到与发布者发送消息相同的序列?对于干净和持久的会话?
【问题讨论】:
标签: mqtt
我想知道是否保留了消息发送顺序。也就是说,当发布者发送一系列消息时,是否保证每个订阅者都会收到与发布者发送消息相同的序列?对于干净和持久的会话?
【问题讨论】:
标签: mqtt
可以在规范本身here 中找到 MQTT 3.1.1 中消息排序功能的摘要。
总结:
如果客户端/代理在任何时候只允许一条消息传输,则可以保证 QoS 1 排序。
【讨论】:
QoS 2 messages will be delivered in order。我认为顺序不能保证 QOS 1 和 2,除非 in-fight 消息为代理和任何发布者设置为 1。
当发布者发送一系列消息时,是否保证每个订阅者都会收到与发布者发送消息相同的序列?
这个问题已经得到回答并被广泛接受,但我发现accepted answer 中的以下语句存在问题。
QoS 2 消息将按顺序传递
根据documentation,提到了PUBLISH、PUBREC、PUBREL、PUBCOMP 的数据包序列将在QOS 2 级别的消息中按主题维护。但是,订阅者仍然可以以不同于发布者发布的顺序接收(可能但很少见)。同样的逻辑也适用于QOS 1。
让我们看看如何:
消息 m1 的代理已发送 PUBLISH 数据包。
消息 m2 的代理已发送 PUBLISH 数据包。
订户已为消息 m1 发送 PUBREC 数据包。
订户已为消息 m2 发送 PUBREC 数据包。
消息 m1 的代理已发送 PUBREL 数据包。 但它被丢弃了。
消息 m2 的代理已发送 PUBREL 数据包。
订阅者已为消息 m2 发送 PUBCOMP 数据包。
消息 m1 发生了代理处的 PUBREL 数据包超时。 Broker 将重试消息 m1。
代理重新传输消息 m1 的 PUBREL 数据包。
订阅者已为消息 m1 发送 PUBCOMP 数据包。
通过上述顺序,有可能消息m2在接收方首先被处理。但是,m1 是在 m2 之前发布的。
更多详情请参阅answer。
图片取自u-blox。
【讨论】: