MQTT QoS Downgrade



我在嵌入式应用程序中使用MQTT。我已经广泛地阅读了文档,并且了解了QoS特性是如何在MQTT中实现的,以及每个值的含义。

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

然而,我对一个特定的情况有问题。如果消息以QoS 1发布,而客户端订阅了QoS 2,会发生什么情况?

消息将至少被传递一次到代理,这意味着它可以被传递多次。另一方面,订阅客户端希望保证它只接收一次消息,但事实并非如此。

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

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

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

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

最新更新