EMQX 的keepalive_timeout和设置的超时时间不匹配

环境

  • EMQX 版本:5.1.0

  • 操作系统版本:Debian GNU/Linux 11

  • Keep Alive Multiplier 是默认配置,在web管理页面上查看是1.5

重现此问题的步骤

  1. 客户端设置Keep Alive = 20秒,建立连接
  2. 断开客户端的网络,并使用秒表开始计时
  3. 在EMQX的Web管理后台中,持续查询客户端在线状态
  4. 当秒表显示56秒时查询到状态为离线

预期行为

我的预期是心跳超时时间不应该超过Keep Alive的2倍,即心跳超时时间不应超过40秒。EMQX应该在40秒内检测到客户端心跳超时,断开客户端连接

实际行为

实际心跳超时时间是56秒,即客户端断网56秒后,EMQX才检测到超时,断开客户端连接

2023-10-11T13:59:43.851227+08:00 [MQTT] fs-device-sn1@60.29.3.146:53731 msg: mqtt_packet_received, packet: CONNECT(Q0, R0, D0, ClientId=fs-device-sn1, ProtoName=MQTT, ProtoVsn=4, CleanStart=true, KeepAlive=20, Username=fs-device-sn1|type=device, Password=******)

大概在13:59:47秒断开了客户端网络

2023-10-11T14:00:43.855035+08:00 [SOCKET] fs-device-sn1@60.29.3.146:53731 msg: emqx_connection_terminated, reason: {shutdown,keepalive_timeout}

日志文件:
fs.zip (1.4 KB)

配置文件:
emqx.zip (781 字节)

hi, 观察日志追踪文件发现 EMQX 断开客户端 socket 连接时刻与上一条客户端发送的 MQTT 控制报文中间间隔了 60s 也就是
KeepAlive * KeepAliveMultiplier * 2 = 60 (20 * 1.5 * 2)
除了配置文件,有用其他方式设置过 keepalive_backoff 这个配置么?

官方你好,
KeepAlive * KeepAliveMultiplier * 2 这里为什么要乘以2呢 :smile:

没有设置过keepalive_backoff,请问为什么是60秒呢,文档没有找到太详细的说明

@JimMoen
我把 EMQX 的 KeepAliveMultiplier 设置成 1 ,客户端连接时的 KeepAlive 保持20秒不变,
按照上面所说的逻辑,应该是 KeepAlive * KeepAliveMultiplier * 2 = 40 (20 * 1 * 2)

这时又出现了新问题无法理解,客户端连接以后不断网,过一段时间就被服务器踢掉了,查看日志发现:客户端发送心跳 20 秒后,即将发送下一次心跳之前,被 EMQX 服务器当做心跳超时踢掉了

请问 EMQX 的 keepalive_timeout 时间是固定的吗?以下哪种说法才是正确的?
1、KeepAlive * KeepAliveMultiplier * 2
2、KeepAlive * KeepAliveMultiplier
3、其它特殊算法生成的随机区间

一个心跳周期就被服务器踢掉的日志:
fs1 (2).zip (7.1 KB)

请问这个问题,您解决了嘛,我也遇到和你一样的问题。