mqtt客户端订阅的topic会主动掉,是什么原因导致的

启动的mqtt客户端订阅设备上报的数据,比如刚开始订阅10个topic,运行着一段时间,topic会主动掉,变成5个,是什么原因导致的

麻烦补下这几项关键信息:

  1. 这类现象一般都是会话被重建:给下 EMQX 版本和部署方式(Docker/K8s/裸机)。
  2. 客户端连接参数贴一下:MQTT 协议版本、clean_start/clean_session、session_expiry_interval。
  3. 确认是否有多个进程共用同一个 clientid;有的话会发生 takenover/discarded,订阅会看起来“变少”。
  4. 把问题出现时这两个输出贴出来:emqx ctl clients show ;emqx ctl topics list | grep <clientid 或关键topic>。
  5. 再贴一段 broker 日志(掉订阅前后 1-2 分钟),重点看 keepalive_timeout、takenover、discarded、not_authorized。

部署方式:Docker;EMQX版本:5.0.24;MQTT协议版本:v5;

现在的现象是跑着跑着mqtt客户端订阅的topic掉了,重启重新订阅上

现在的现象是跑着跑着mqtt客户端订阅的topic掉了,重启重新订阅上;
没有多个进程共用同一个 clientid

来点有用的日志

3、4比较难,之前日志没有映射出来

你这类“跑一段时间订阅变少”,从你截图看最可疑的是会话参数组合。Clean Start=falseSession Expiry Interval=0,一旦连接有抖动并重连,会话会被立即回收,之前订阅不会保留;再叠加 Keepalive=15(超时阈值约 22.5s),网络稍有抖动就容易触发断连重连。
先改这 3 个点再观察:

  1. 客户端把 session_expiry_interval 改成非 0(先用 360086400)。
  2. keepalive 先提高到 60(至少别用 15)。
  3. 客户端每次重连后都执行完整订阅,并检查每条 SUBACK 返回码。
    你说 3、4 不方便拿日志,那就先用这 3 条命令,不需要映射容器日志目录:
docker exec -it <emqx容器名> emqx ctl listeners
docker exec -it <emqx容器名> emqx ctl clients show mqtt_21944
docker logs --since 30m <emqx容器名> | grep -E "mqtt_21944|keepalive_timeout|takenover|discarded|tcp_closed|not_authorized"

重点看两个东西:

  • shutdown_count 里有没有持续增长的 keepalive_timeout / tcp_closed / takenover
  • 断连时间点是否和“订阅变少”的时间点一致
    另外你截图里看起来有两个相近 clientid 在线(mqtt_21944mqtt_21944_pro...),确认下是不是同一业务逻辑创建了两个连接,避免把订阅分散到不同连接上。
    把这三条命令输出贴上来。