MQTT QoS 2中PUBCOMP报文丢失会引发哪些技术问题?
MQTT QoS 2 中
PUBCOMP 报文丢失的处理逻辑 MQTT QoS 2 是可靠性最高的级别,通过四次握手保证消息仅交付一次:
PUBLISH:发布者向代理发送消息PUBREC:代理确认收到消息,发布者未收到则重发PUBLISHPUBREL:发布者收到PUBREC后发送该报文PUBCOMP:代理发送该报文表示消息处理完成
当PUBCOMP报文在传输中丢失时,流程会按以下逻辑恢复:
发布端的处理
发布者发送PUBREL后会启动超时定时器,若超时未收到PUBCOMP,会重复发送相同报文ID的PUBREL,直到收到PUBCOMP确认。这里PUBREL是幂等报文——重复发送不会引发代理重新处理消息,仅触发PUBCOMP重发。
代理端的处理
代理首次收到PUBREL后,会完成消息的最终交付(确保订阅者仅收到一次),随后发送PUBCOMP。但代理不会立即清除该报文ID的相关状态:
- 它会记录该报文ID对应的
PUBREL已处理、消息已完成交付 - 再次收到相同报文ID的
PUBREL时,代理不会重复交付消息给订阅者,只会直接重发PUBCOMP - 只有在确认发布者已收到
PUBCOMP(或经过足够时长判定无后续重发),代理才会彻底清除该报文ID的状态记录
对“仅一次交付”的保障
整个流程的核心是PUBREL的幂等性:无论发布者重发多少次PUBREL,代理都只会完成一次消息交付,后续的PUBREL仅触发PUBCOMP重发,不会导致订阅者收到重复消息,完全符合QoS 2的可靠性要求。
内容的提问来源于stack exchange,提问作者Ali Ehyaie
相关产品推荐
相关产品推荐

