消息重传
MQTT协议标准规范的一部分。
协议规定作为通信双方 服务端 和 客户端 对于自己发送到对端的 publish 消息都应该满足其 服务质量的要求。
QoS 1:消息至少送达一次;即发送端会一直重发该消息,除非收到了对端对该消息的确认。是在MQTT协议的上层(即业务的应用层)相同QoS1 消息可能会受到多次。
QoS 2:消息只送达一次;即该消息在上层仅会接收到一次。
注:QoS 1 和QoS 2 的publish 报文在MQTT协议栈这一层都会发送重传,
QoS 1 消息发生重传后,在MQTT 协议栈上层,也会收到这些重发的publish消息。
QoS 2 消息无论如何重传,最终在MQTT协议栈上层,都只会收到一条publish消息。。
消息重发的两种场景
1、publish 报文发送给对端后,规定时间内未收到应答。则重发这个报文。
2、在保持会话的情况下,客户端重连后; emqx会自动重发为应答的消息,以确保QoS 流程的正确。
文件 etc/emqx.conf 中
retry_interval duration 默认 30s 等待一个超时间隔,如果没收到应答则重传消息。
协议规范与设计
重传对象
QoS 1 ,涉及2个报文,发送端和接收端各发送1次;这2个报文有相同的PacketId。只需要对publish报文进行重发。
QoS 2 , 涉及4个报文,发送端和接收端各发送2次;这4个报文有相同的PacketId。需要发送端对publish和pubrel报文进行重发。