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间隔上,服务端通过何种方式知晓客户端已断连?
传统tcp 连接的断连fin由OS 发出。
对于quic可能是因为client 并没有发quic 的断连信息。 EMQX 作为broker不知道client 连接的断开, 并在MQTT keepalive后断连或是QUIC 层的idle timeout 后断连。
注意, 我们在EMQX 默认关闭了探活。
如果需要请设置一下quic listener 参数 来提高探活灵敏度(单位ms) 但这会增加断连机率。
keep_alive_interval_ms
1 个赞
抓包看到了TCP是有fin包的。
进一步测试,TCP客户端断连前,用iptables禁用TCP流量,之后再断开客户端,这种情况下,EMQX无法感知客户端已掉线,直到被keepalive机制检测到。
再次感谢两位的协助 @zhuwei @heeejianbo
2 个赞