了解 mqtt 订阅者 qos

Understanding mqtt subscriber qos

我是MQTT新手,刚刚了解了发布消息时决定的QOS级别的含义:

我注意到订阅方也可以设置“他们将收到的最大 QOS 级别”。 引用自 here:

For example, if a message is published at QoS 2 and a client is subscribed with QoS 0, the message will be delivered to that client with QoS 0.

这是否意味着尽管发布者使用 QOS 2 发送消息,但消息可能无法到达客户端 (QOS 0)?

这对于没有经验的开发人员来说可能是个大问题 - 例如,npm mqtt package 中订阅功能的默认 QOS 是 0! (我认为默认应该是最大值2,即"let the publisher decide the QOS")。

你是对的,不能保证以 QoS 2 发布的消息会到达使用 QoS 0 的订阅者。如果该订阅者接收消息很重要,他们应该使用 QoS 1 或2. 对于任何给定的应用程序,这都是要决定的事情。

我会将您对 QoS 0 的定义重写为 "at most once",即消息将被接收或不被接收,不可能重复。

关于默认 QoS - 我认为大多数客户端使用 QoS 0 作为默认值。我不认为将 QoS 1 或 2 设置为默认值会对没有经验的开发人员有所帮助,他们仍然需要了解他们在做什么以及他们在做什么,并考虑对他们的应用程序的影响。

我还没有阅读 MQTT 协议规范, 就说我用 mosquitto 1.5.3 测试的吧。

1。 运行 蚊子 server/broker

使用默认配置

mosquitto -v

1541075091: mosquitto version 1.5.3 starting
1541075091: Using default config.

2。发布测试消息

AAA sub topic 'aaa'
BBB sub topic '+'
DDD pub topic 'aaa'

3。服务器标准输出

1541075322: New connection from 10.1.1.159 on port 1883.
1541075322: New client connected from 10.1.1.159 as DDD (c1, k60).
1541075322: No will message specified.

1541075322: Sending CONNACK to DDD (0, 0)
1541075322: Received PUBLISH from DDD (d0, q1, r1, m1, 'aaa', ... (8 bytes))
1541075322: Sending PUBACK to DDD (Mid: 1)

1541075322: Sending PUBLISH to AAA (d0, q0, r0, m0, 'aaa', ... (8 bytes))
1541075322: Sending PUBLISH to BBB (d0, q0, r0, m0, 'aaa', ... (8 bytes))
1541075322: Received DISCONNECT from DDD
1541075322: Client DDD disconnected.

服务器 PUBACKPUBLISH 消息之前 DDD。

4。所以我猜

pub qos=1 仅确保代理收到消息,
sub qos 还有:

[ pub ] ---pub_qos---> [ broker ] ---sub_qos--> [ sub ]

// MQTT 客户端和代理网络拓扑是星形网络。
// 如果我有时间,我会阅读协议规范

"Does this mean that the message might not arrive to the client (QOS 0) despite the fact that publisher sent it with QOS 2?"

没错。发布者希望以 QOS 2 发布,以确保记录只到达状态层一次(没有重复)。一层重试+确认用于确保这一点。为订阅客户端提供主题的代理还有额外的工作,以确保消息以请求的 QOS 级别传递。

例如,一条消息以 QOS 1 发布,而同一主题的订阅者以 QOS 2 订阅,那么处理将消息传递给所述订阅者的代理将必须确保不会向该订阅者发送重复消息客户.

在您的示例中,发布者以 QOS 2 发布,因此状态层插入了一次记录,并且有一个 QOS 0 的订阅者针对同一主题。订户可能永远不会收到此消息。例如,在消息发送过程中出现网络故障,记录从未到达。由于 QOS 0 中没有确认机制,代理永远不会尝试重新交付。

发布者确实不直接了解哪些客户订阅了该消息。出版商的 QOS 级别决定了确保 经纪人 接收出版物的服务质量。一旦代理收到发布, 负责re-send 以各自订阅者选择的 QOS 向每个订阅者发送消息。订阅者可以从 QOS 2 的代理接收消息,即使发布者以 QOS 0 或 1 将消息发送给代理。

我发现 this article 对理解这个概念很有帮助。