QoS、Retain、Clean Session
一段简单说明
看到网上介绍QoS
,Retain Message
,Clean Session
的文章很多,但都只是对官方文档的一些总结或者翻译,相信很多小伙伴也对这3个设置有或多或少的疑惑。比如,不同发布或者订阅的QoS条件下,不同类型的消息如何传递;设置Retain之后有什么效果;清理回话标志有什么作用。
我用Python脚本对不同的设置都做了尝试,下面总结下,希望对怀有和我一样的疑惑的小伙伴们有所帮助。
QoS
MQTT提供了3个等级的消息传递质量来满足不同场景的需要。它允许订阅和发布设置不同的QoS,对于每一个订阅者或者发布者来说,都是独立的。2个客户端的最终等级取决于较低的。举个例子,发布的QoS=1,订阅的QoS=0,那发布者能确保消息传递给broker,但是broker和订阅者之间的QoS=0,不需要确认消息,不能保证消息一定传递成功,所以QoS取决于低者。
下面以eclipse的mosquitto为例,总结下不同发布(Pub)和订阅(Sub)QoS的消息传递情况。
QoS:Pub=0,Sub=0
a)sub在线,发布消息,sub收到消息;sub掉线再上线,消息不会被重复收到
Pub
Sub
b)sub不在线,发布消息,sub上线,消息不会被收到
QoS:Pub=1,Sub=0
a)sub在线,pub发布消息,pub收到puback,sub正常收到消息(qos=0);sub掉线再重新上线,该条消息不会重复收到
b)sub不在线,pub发布消息,pub收到puback,sub上线不会再收到消息
QoS:Pub=0,Sub=1
a)sub在线,pub发布消息,sub收到消息且不回复puback,重新上线,没有收到重复消息
b)sub不在线,发布消息,sub上线,收不到该条消息
QoS:Pub=1,Sub=1
a)sub在线,pub发布消息,pub收到puback,sub回复puback,sub掉线上线,不会重复收到消息
b)sub不在线,发布消息,pub收到puback,sub上线,不会收到消息。
c)sub在线,发布消息,sub回复错误的ack(模拟pub收不到puback)
d)sub在线,发布消息,pub收到puback,sub收到publish消息但是不回复puback,sub掉线上线,都会收到消息
QoS:Pub=2,Sub=1
a)sub在线,发布消息,pub收到rec,rel和comp,sub回复puback,掉线上线不会收到重复消息
b)sub不在线,发布消息,pub收到rec,rel和comp,sub上线不会收到消息
QoS:Pub=1,Sub=2
a)sub在线,发布消息,pub收到puback,sub回复puback,sub掉线上线,不会收到
b)sub不在线,发布消息,pub收到puback,sub上线不会收到
QoS:Pub=2,Sub=2
a)sub在线,发布消息,pub收到rec,rel和comp,sub回复rec,rel和comp,sub掉线上线不会重复收到消息
b)sub不在线,发布消息,pub收到rec,rel和comp,sub上线收不到消息
Retain Flag
- sub在线,pub r=1,sub收到的r应该为0
- b不在线,pub r=1,sub上线,收到的r为1的消息
- Sub1在线,pub r=1,sub2上线,收到的r为1
- Pub r=1,sub重复上线,sub重复收到消息
- #4之后,pub r=0,sub重新上线,重复收到之前保留的消息
- #5之后,pub r=1的空消息,sub收到空消息,sub重新上线,不会再收到保留的消息
- #6之后,pub r=0,sub上线,不会收到消息
Clean Session Flag
- 订阅QoS=0,clean session=0,订阅topic1,连接之后,掉线上线,不订阅任何消息,依然能收到topic1的消息
- 订阅qos=0,c=0,订阅topic1,连接之后,掉线,发布qos=1,订阅者重新上线,收不到消息
- 订阅qos=1,c=0,订阅topic1,连接之后,掉线,发布qos=1,订阅者重新上线,可以收到消息