QoS1 与 QoS2 消息 - 在 Java 中使用 Paho MQTT 客户端处理它的区别

QoS1 vs QoS2 messages - difference in handling it with Paho MQTT client in Java

参考 this article 我想我知道 QoS1 和 QoS2 消息之间的区别,但我不知道作为 Paho MQTT 客户端处理它们的区别。

假设我订阅了这样的主题:

MqttClient subscriber = new MqttClient(SERVER_URI, SUBSCRIBER_ID);
subscriber.subscribe(TOPIC);

然后我发布这样的消息:

publisher.publish(TOPIC, PAYLOAD, 1, false);

此刻我正在使用 MqttCallback 接口来处理到达订阅者的消息。

有一个方法可以覆盖:

public void messageArrived(String topic, MqttMessage mqttMessage) {
    if(mqttMessage.isDuplicate()) {
        // is it really the duplicate message from my perspective?
    } else {...}
}

在 MqttMessage 中我们可以找到一个 isDuplicate() 方法,但是我如何确定 returns true 的 mqttMessage 不是我的订阅者收到的第一条消息?

我非常有兴趣找到一个解决方案来说明如何处理 QoS1,但我们将不胜感激每一个能够澄清此处任何内容的答案。

来自 Cracow 的问候!

仅仅依赖重复标志是不够的,因为您可能错过了第一条消息。如果 QoS 1 消息不是幂等的,这里有一些如何进行重复检测的建议:

  • 对有效负载 + 主题进行哈希处理,并获得一个 table,其中包含最后 X 条消息及其可用的哈希值,这样您就可以检查您是否已经收到该消息
  • 在有效载荷中有一个唯一的 ID,并且有一个 table 最后 X 条消息及其 ID 可用
  • 在有效载荷中有一个时间戳,并有一个 table 最后 X 条消息及其可用的时间戳

如果您确实需要确保消息到达一次且仅一次,则可以使用 QoS 2。QoS 1 意味着您的客户端可以处理重复消息(通过忽略重复消息或消息是幂等的)。