MQTT 提供了 QoS 机制,设计了多种消息交互机制来提供不同的服务质量,满足用户在各种场景下对消息可靠性的要求。

[ 参考文献 ] : https://www.emqx.com/zh/blog/introduction-to-mqtt-qos

QoS 0 - 最多一次

​ QoS 0 消息的分发依赖于底层网络的能力。发布者只会发布一次消息,接收者不会应答消息,发布者也不会储存和重发消息。

QoS 1 - 最少一次

​ 简单的 ACK 机制来保证 QoS 1。发布者会发布消息,并等待接收者的 PUBACK 报文的应答,如果在规定的时间内没有收到 PUBACK 的应答,发布者会将消息的 DUP 置为 1 并重发消息。

QoS 2 - 精确一次

​ 发布者发布 QoS 为 2 的消息之后,会将消息储存并等待接收者回复 PUBREC,发送者收到 PUBREC 后就可以安全丢弃消息,因为它已经知道接收者成功收到消息。

​ 发布者会保存 PUBREC 消息并应答一个 PUBREL,等待接收者回复 PUBCOMP 消息,当发送者收到 PUBCOMP 消息之后会清空保存的状态。

​ 接收者接收QoS 为 2 的 PUBLISH 消息时,他会存储此消息并返回一条 PUBREC 进行应答。当接收者收到 PUBREL 消息之后,会清空保存的状态,并回复 PUBCOMP。

​ 订阅者收到PUBREL后,才会将存储的消息体发布出去。

​ 本质:QoS 1作消息存储 + PUBREL作实际发布。