You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用唯一ClientID的MQTT客户端会不断重连Broker?

问题根因

你使用的是公开的EMQX公共Broker,所有用户都可以自由接入,你设置的固定ClientID go_mqtt_client 被其他接入该公共Broker的用户占用了:
MQTT 3.1/3.1.1/5.0协议均明确规定,同一个MQTT Broker上不允许存在两个相同ClientID的活跃连接,后发起连接的客户端会主动踢掉前一个同ID的连接,被踢的客户端会抛出EOF连接丢失错误。
你开启了自动重连,所以被踢后会立刻重连,反过来踢掉对方的同ID连接,双方都开启自动重连的情况下就会出现反复「连接成功-被踢下线-重连成功」的循环。你修改ClientID后可以正常运行,就是因为新的ClientID暂时没有被其他用户占用。

解决方案

  • 优先使用带唯一标识的动态ClientID,不要在公共Broker上用简单固定的ClientID,可在固定前缀后加随机数、时间戳等唯一后缀,代码修改参考:
import "time"
// 初始化ClientOptions时替换原来的SetClientID逻辑
opts.SetClientID(fmt.Sprintf("go_mqtt_client_%d", time.Now().UnixNano()))
  • 若业务需要固定ClientID,不要使用公共Broker,自行部署私有MQTT Broker即可避免其他用户占用你的ClientID。
  • 测试场景下如果不需要持久化会话,也可将SetCleanSession参数改为true,减少异常退出后遗留在Broker的会话残留对重连的影响,但该方案无法解决其他用户占用同ID的核心问题。

内容的提问来源于stack exchange,提问作者CharmCcc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 19:06:03