我正在嵌入式应用程序中使用MQTT。我已经详细地阅读了这些文档,并且了解了QoS特性是如何在MQTT中实现的,以及每个值的含义。
众所周知,MQTT降低了QoS的等级,这意味着消息将以发送方和接收方之间最低的QoS值传递。这是可以理解的,对于大多数发送和接收之间的QoS折算来说,这是有意义的。
不过,我对某一特定情况有异议。当客户端订阅QoS 2时,用QoS 1发布消息会发生什么?
消息将至少被传递一次给代理,这意味着它可能被传递不止一次。另一方面,订阅客户端希望它能够保证只接收一次消息,但情况并非如此。
如何才能克服这一严重问题?实际上,我不能信任QoS 2设置。
(请注意,这通常不是一个问题,因为我可以只使用QoS 2发布消息。但是,当发布客户端超出您的控制范围时,这将成为一个问题,并且无法保证他们将使用哪个QoS。)
发布于 2016-08-18 08:31:13
正如您已经指出的,当原始发送方使用QoS 1向代理发送消息时,消息可能会多次到达代理,这意味着代理也可以多次将此消息传递给(QoS 2)订阅者。由于第一条QoS 1消息与第二条消息之间的时间可能很长(如果原始发送方在原始发送之后离线,因此重发发生在稍后的时间点),因此很难在代理端为消息的订阅者提供准确的一次保证。
本质上,如果不能确保您只接收到QoS 2消息,请确保您的客户端能够处理副本。例如,您可以在应用程序有效负载中使用唯一标识符,以确保消息在业务级别上不是重复的。
https://stackoverflow.com/questions/39007355
复制相似问题