MQTT over QUIC客户端断连后,需要大概20s左右Dashboard才显示客户端已断开

EMQX版本:EMQX 开源版 5.0.20
系统环境: Ubuntu 20.04

问题详情:

  • 使用MQTT over QUIC 客户端(pynng-mqtt)连接至EMQX broker。客户端断连后(通过杀客户端进程或者 Ctrl + C),约20s后,Dashboard → 连接管理页面中才显示该客户端离线。 也尝试过将离线事件用webhook发出,也需20s后才有离线事件。
  • MQTT over TCP客户端无此问题,客户端断连,离线事件即发出,“连接管理页面”中该设备也立刻显示断连

请问这是否是个QUIC的已知问题? TCP客户端异常离线后(例如网络断开),如果未在KeepAlive间隔上,服务端通过何种方式知晓客户端已断连?

cc @zhuwei

传统tcp 连接的断连fin由OS 发出。

对于quic可能是因为client 并没有发quic 的断连信息。 EMQX 作为broker不知道client 连接的断开, 并在MQTT keepalive后断连或是QUIC 层的idle timeout 后断连。

注意, 我们在EMQX 默认关闭了探活。
如果需要请设置一下quic listener 参数 来提高探活灵敏度(单位ms) 但这会增加断连机率。
keep_alive_interval_ms

1 个赞

感谢解答。我会继续测试以下两种场景:

  1. 断网情况下(禁网卡),TCP和QUIC现象是否一致(延迟一会后才断开)
  2. 设置keep_alive_interval_ms时间并测试其对系统性能的影响(PING包应该会消耗一定系统资源)

抓包看到了TCP是有fin包的。
进一步测试,TCP客户端断连前,用iptables禁用TCP流量,之后再断开客户端,这种情况下,EMQX无法感知客户端已掉线,直到被keepalive机制检测到。

再次感谢两位的协助 @zhuwei @heeejianbo

2 个赞