MQTT客户端断开重连后无法接收特定客户端消息问题排查
MQTT重连后无法接收QoS≥1消息问题排查与解决
问题现象
client A经过几次断开重连操作后,无法接收client B发送的消息,但存在以下例外情况:
- 使用
mosquitto_sub手动订阅client B的发布主题,可正常接收消息 - 使用
mosquitto_pub向client A订阅的主题发送消息,client A能正常接收
环境信息
- Broker:Mosquitto 1.6.12(运行在RaspberryPi CM3,曾从1.6.10升级至此)
- 客户端:Go语言编写,基于paho mqtt v1.4.2,以systemd服务启动
- 客户端配置:
SetCleanSession(false)、SetKeepAlive(10*time.Second),客户端ID唯一
排查过程
- 查看Mosquitto日志发现:client A重连后完成订阅操作前,broker已向其发送消息
- 定位到QoS等级关联问题:client A仅能接收QoS 0的消息,无法接收QoS≥1的消息,而client B所有消息均以QoS 1发送
- 尝试升级Mosquitto版本、重启broker,仅重启能临时恢复,但无法彻底解决问题
解决方案
编写可复现问题的Go代码示例验证后,确认通过添加DefaultPublishHandler处理broker提前发送的消息,问题得到彻底解决。
内容的提问来源于stack exchange,提问作者FishermansEnemy
相关产品推荐
相关产品推荐

