mqtt中qos有三种值
qos = 0:最多一次的传输
qos = 1:至少一次的传输
qos = 2: 只有一次的传输
qos = 0
publisher 只发消息 ,不管有没有发送成功,即不等待mqtt broker的ack消息
qos = 1
publisher发送消息前,先存储消息msg,发送消息到 broker, 若未接收到ack消息,则会一直不停的重发。
那么我们要关注的是什么情况下会收不到 ack 消息,
1、首先考虑发送时网络不可用的情况
由于tcp协议,在发送之前如果网络不可用,发送方是能知道的,此时会报错,所以这种情况可以不用考虑。
2、发送到 broker 之后,收到broker回复之前,网络故障
此时,由于publiser未收到ack,则会一直不停的重发,那么broker会再次处理这个相同的消息(发送给reciever)
那么reciever就要在业务层对此种情况进行处理
qos = 2
qos = 2 (相当于qos =1加去重机制,猜测msgid生成规则和其他消息队列相同,clientid加时间戳)
与qos=1的区别是,broker缓存了msgId(消息id),如果收到相同消息,则不予处理。
此种情况的难点在于,msgId的删除时机。
1、publisher 发送msg 到broker
2、broker 回复 ack 到 publisher
---- 此时极端情况可能 1、2步骤重复多次---- (publisher 发送成功之后就断网,再继续发送,成功之后又断网)
3、publisher 告诉broker删除msgId
4、broker告诉publisher删除msg
mqtt与rocketmq的区别
mqtt采用push方式,rocketmq默认采用pull方式