【问题标题】:QoS1 vs QoS2 messages - difference in handling it with Paho MQTT client in JavaQoS1 与 QoS2 消息 - 在 Java 中使用 Paho MQTT 客户端处理它的区别
【发布时间】:2015-07-15 19:05:49
【问题描述】:

参考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() 方法,但是如何确定返回 true 的 mqttMessage 不是我的订阅者收到的第一条消息?

我非常有兴趣找到一个展示如何处理 QoS1 的解决方案,但我们将不胜感激每一个能澄清这里任何事情的答案。

来自克拉科夫的问候!

【问题讨论】:

    标签: java mqtt paho


    【解决方案1】:

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

    • 对有效负载 + 主题进行哈希处理,并提供一个包含最后 X 条消息及其哈希值的表格,以便您检查是否已收到该消息
    • 在负载中具有唯一 ID,并有一个表,其中包含最后 X 条消息及其可用 ID
    • 在负载中有一个时间戳,并有一个表,其中包含最后 X 条消息及其可用的时间戳

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

    【讨论】:

    • 我明白了,我希望有一种更简单的方法来发现重复的消息。感谢您的快速答复。
    • 不幸的是,我不知道更简单的方法。您还可以使用 MQTT 消息 ID 来比较您是否已经看到该消息。这将是高度依赖于代理的,尽管因为消息 ID 可以在任何时间点重用(如果消息流已经完成)并且不能保证它们是例如依次。不过,大多数实现都提供顺序消息 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多