客户端连接broker后频繁离线,客户端数据上报频率5分钟一次,心跳从60s到420s均尝试过,日志显示“socket_force_closed, reason: keepalive_timeout”,“emqx_connection_terminated, reason: {shutdown,keepalive_timeout}”

环境

  • EMQX 版本:5.0
  • 操作系统版本:windows10
    -MQTT:V3.1.1

重现此问题的步骤

MQTT客户端配置:keepalive 60,clean session FLASE

预期行为

实际行为,对应的日志追踪以及网络抓包



  1. 你用的是 5.0 哪一个版本?v5.0.26 吗?
  2. MQTT keepalive 超时是因为长时间收不到 MQTT 客户端的 pingreq,可能是由于 NAT 设备、防火墙或者其他路由设备导致长时间不活跃的连接中断。这种情况下,客户端应该设置小一些的 keepalive 值,比如 30s 或者 15s。
  3. 你给出的抓包没有 MQTT Keepalive 超时的问题,客户端(5547)和服务端(6061)整个过程中都有消息交互,最后还有 TCP 挥手过程。
    另外,我注意到你启用了 TCP 层的 Keepalive,其中有一个 Seq = 772 的 TCP Keepalive 报文连续重发了两次,看起来像是 emqx 端没有收到 ACK,表示网络可能有问题。

您好!
是V5.0.26版本

基本可以排除网络问题,前期在两个不同网络下用MQTT工具连接测试了一天也没出现离线情况。
个人也觉得是emqx没有收到pingreq,但是不知什么原因,请问有什么解决路径?

附昨日设备日志追踪信息(与上边的还不太一样):请分析下


附emqx参数设置


你是说用 MQTTX 没有问题,但是自己的程序就有问题吗?如果是这样:

  • 你自己的程序客户端代码可以调试吗?看看是不是客户端没有发出 PINGREQ。
  • 是你自己在服务端调了 linux 内核参数,调了 TCP Keepalive 参数吗?尝试把 TCP 层的 Keepalive 关掉看看情况。

另外,我们曾经间见过 Paho 客户端,CONNECT 上来就以同步模式订阅主题导致的 Race Condition 问题,如果客户端登录时 session 里有缓存的消息,emqx 会马上下发,导致 emqx 和客户端两边都在等待消息回执而超时断开。但我觉着跟你的情况不一样。