MQTT QoS降级

MQTT QoS降级,mqtt,mosquitto,paho,qos,Mqtt,Mosquitto,Paho,Qos,我在嵌入式应用程序中使用MQTT。我已经详细阅读了文档,了解了MQTT中QoS特性是如何实现的,以及每个值的含义 众所周知,MQTT会降低QoS,这意味着消息将在发送方和接收方之间以最低的QoS值传递。这是可以理解的,对于发送和接收之间的大多数QoS补偿来说,这是有意义的 然而,我有一个具体情况的问题。当客户端订阅QoS 2时,使用QoS 1发布消息时会发生什么情况 消息将至少被传递给代理一次,这意味着它可能被传递不止一次。另一方面,订阅客户端希望保证只接收一次消息,但事实并非如此 如何克服这一

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

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

然而,我有一个具体情况的问题。当客户端订阅QoS 2时,使用QoS 1发布消息时会发生什么情况

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

如何克服这一严重问题?本质上,我不能信任QoS 2设置


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

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


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

因此,本质上,在我无法控制的发布客户端中,我应该始终假设QoS为0或QoS为1,但决不假设QoS2,对吗?@FotisPanagiotopoulos:客户端规范应该说明消息发布的级别,然后您应该使用正确的级别订阅。其他一切都是自找麻烦。例如,MQTT规范明确禁止QoS级别升级-因此,如果始终订阅QoS 1,而客户端发布QoS 0,则可能永远不会收到任何消息。大多数代理都可以选择允许这样做,但这样做的副作用将取决于具体的实现和上下文。