澄清订阅者不可用时的 QoS 1 和 2 行为

问题描述 投票:0回答:1

MQTT 的一般流程是:生产者 ---> MQTT Broker ---> 消费者。 假设 MQTT 代理始终启动并运行,但消费者暂时不可用

如果生产者向 QoS 1 的 MQTT 代理发送消息,那么代理是否会在收到消息后向生产者发送确认?

如果生产者向 QoS 1 的代理发送一条消息,代理将继续尝试向消费者传递消息。如果生产者发送更多消息,代理是否会继续重试向消费者发送第一条消息?这是否意味着消息将在代理中排队?代理将在多长时间内重试向消费者传递消息,然后再继续处理下一条消息?

如果生产者向 QoS 2 的代理发送一条消息,代理是否会无限期地重试,因为 QoS 2 只能保证一次交付?

mqtt consumer broker producer qos
1个回答
0
投票

如果生产者向 QoS 1 的 MQTT 代理发送消息,那么代理是否会在收到消息后向生产者发送确认?

是的,MQTT 中没有端到端的传送通知。 QoS 1 或 2 消息的任何握手始终在 1 个客户端和代理之间进行。

代理会继续重试向消费者发送第一条消息吗?

代理不会尝试将任何 QoS 1 或 2 消息发送到离线客户端,消息仅发送到主动订阅该主题的在线客户端。将为具有有效订阅的客户端存储消息,直到他们重新连接,此时消息将被传递。

代理将在多长时间内重试向消费者传递消息,然后再继续处理下一条消息?

消息会永远排队,或者直到同一个 clientid 重新连接。如果客户端重新连接并将干净会话标志设置为 true,则所有排队的消息将被丢弃。在 MQTT v5 中,现在可以告诉代理在丢弃消息之前将消息排队多长时间。 (某些代理还可以在 MQTT v3.x 上配置最大排队时间,但这不是规范的一部分)

如果生产者向 QoS 2 的代理发送一条消息,代理是否会无限期地重试,因为 QoS 2 只能保证一次交付?

这和之前一样,消息会为客户端排队,直到重新连接,然后再投递。为了使 QoS 2 发挥作用,代理和客户端都需要具有持久存储来在重新启动时保存状态以跟踪交付阶段。

© www.soinside.com 2019 - 2024. All rights reserved.