背景:
系统正常运行一段时间,某日突然发生客户端无法连接问题,客户端开启了自动重连setAutomaticReconnect(java paho),一直报错invalid client id无法连接至服务器以及connection lost 32109,导致了很多消息丢弃,客户端在程序启动时会带时间戳生成唯一的client id,clean start为false。
问题一直持续,直到重启客户端程序后正常。
环境
- EMQX 版本:5.0.26
- 操作系统版本:centos
重现此问题的步骤
1.暂无法稳定复现
预期行为
客户端能自动成功重连至服务器
emqx日志:
emqx error日志:
客户端错误日志日志:
Shawn
2
这是客户端的问题,很可能是泄漏了一个 MQTT 连接。就是说同一个客户端发起了至少两个 MQTT 连接,导致同样的 clientid 连接互相踢。
具体情况你可以在问题复现之后用抓网络报文确认。从 reset 客户端之后就能解决这一点来看,基本确认是这个问题。
EMQX 这边有一个阻止此类客户端连接上来的功能,发现互踢就将 clientid 加入黑名单,但它只是保护 EMQX 而解决不了客户端本身的问题:连接抖动配置 | EMQX 企业版文档
那能请教下一般什么情况下会发生这种同一客户端产生两个mqtt连接的情况呢?排查了下代码似乎也没有新建一个mqttClient之类的操作。会跟mqtt开启了自动重连这个机制相关么?
(因为之前有观察到该客户端推送的数据偶尔有非utf-8字符导致topic含有非法编码字符,从而会被服务器端拒绝触发一次重新连接mqtt)