解析Mqtt 消息服务质量Qos
(1)、概述
Mqtt中 qos定义了消息服务质量(Quantity Of Service), 它保证了在不同网络环境下消息传递的可靠性;
它是MQTT中重要的一个组成部分
(2)、Mqtt Qos等级
Qos 0: 消息最多传递一次,如果当时客户端不可用时,则会丢失该消息Qos 1: 消息最少传递一次Qos 2: 消息正好传递一次
(3)、Qos工作原理
当Qos为0时,消息最多到达一次,也有可能会丢失,消息到达的能力完全依赖底层的网络能力;发布者只会发布一次消息,不会保存和重发
当Qos为1时,保证消息至少到达一次;Publisher发布消息到Broker 等待返回 ACK ; Broker投递消息到订阅者Subscriber等待返回ACK;如果在规定时间内没有收到ACK,则标记DUP并重发消息
当Qos设置为2时,消息严格执行传递一次;当发布者发送qos为2的消息时,会存储消息下来并等待订阅者Subscriber回复PUBREC,收到之后发布者Publisher即会安全的删除消息;同时保存PUBREC消息并应答一个PUBREL,同时等待订阅者返回PUBCOMP, 订阅者收到PUBREL之后,它就会丢掉消息和状态消息,并回复PUBCOMP;
(4)、Qos在Publish和Subscribe的联系和区别
需要注意的是,Mqtt发送的消息有两个阶段,第一阶段是发布者Publisher传递消息到Broker,
第二阶段是Broker传递消息到订阅者Subscriber
如下图所示,发布和订阅时不同的qos决定了最终接受消息的Qos
发布消息的 QoS | 主题订阅的 QoS | 接收消息的 QoS |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
0 | 2 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
1 | 2 | 1 |
2 | 0 | 0 |
2 | 1 | 1 |
2 | 2 | 2 |
(5)、如何选择合适的Qos
Qos越大,对应的网络开销也就越大
在允许偶尔丢消息的情况下,设置qos=0
在需要消息不丢,可以接受消息重复的情况下,设置qos=1
在一些需要严格保证刚好到达一次的情况下,一般在银行、金融、消防、航空等行业,设置Qos=2