MQTT QoS降级

时间:2016-08-17 22:42:54

标签: mqtt mosquitto paho qos

我在嵌入式应用程序中使用MQTT。我已经详细阅读了文档,并了解了MQTT中QoS功能的实现方式,以及每个值的含义。

众所周知,MQTT会进行QoS降级,这意味着将在发送方和接收方之间以最低的QoS值传递消息。这是理解的,对于发送和接收之间的大多数QoS组合,这是有道理的。

但是我遇到特定情况的问题。当客户端订阅QoS 2时,如果使用QoS 1发布消息会发生什么?

该消息将至少一次发送给代理,这意味着它可能会被多次发送。另一方面,订阅客户端期望保证只接收一次消息,但事实并非如此。

如何克服这个严重问题?基本上我不相信QoS 2设置。

(注意,通常这不会是一个问题,因为我可以发布带有QoS 2的消息。但是,当发布客户端不受您的控制时,这就成了一个问题,并且无法保证它们具有哪些QoS将使用。)

1 个答案:

答案 0 :(得分:2)

正如您已经指出的那样,当原始发件人将消息发送到具有QoS 1的代理时,该消息可能会多次到达代理,这意味着代理可以将此消息传递给(QoS 2)订户也是多个倍。由于第一个QoS 1消息和第二个QoS消息之间的时间可能非常长(如果原始发送者在原始发送之后离线,因此重新发送在稍后的时间点发生),对于消息的订阅者来说,在代理方面很难保证完全一次保证。

实质上,如果您无法确保只接收QoS 2消息,请确保您的客户端可以处理重复项。你可以,例如在应用程序有效负载中使用唯一标识符,以确保消息不是业务级别的重复。