2

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

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

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

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

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

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

4

1 回答 1

3

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

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

于 2016-08-18T08:31:13.897 回答