EMQ 4.3.1 本版 批量发送QOS=0的消息1500条,客户端再检测心跳ACK时会超过心跳周期导致客户端主动关闭连接

环境

  • EMQX 版本:4.3.1
  • 操作系统版本:

重现此问题的步骤

  1. 使用Spring integration 5.5.14 集成EMQ,1500次循环调用发送方法发送Qos=0的消息到同一主题,消费端是MQTTX客户端进行的接收。
  2. 发现1500条消息客户端大概1s内全部把1500条消息全部扔进了BufferedOutputStream并且flush,随后发送了心跳PINGREQ,等待PINGACK回来,超时检查机制等一个周期PINGACK还未回来主动抛出异常关闭了Socket,随即MQTTX客户接收消息还未接收完毕,此时再无剩余消息被接收。
  3. 为了效果明显KeepAliveInterval可以调小一点10s。
  • 看看 emqx 有没有错误日志
  • 看看 emqx 节点的 CPU 使用率
  • 如果是测试环境,打开 emqx 的 debug 日志看看消息交互有无异常。如果是线上系统,使用日志追踪功能看一下这个客户端发消息相关的日志:命令行接口 | EMQX 企业版 4.4 文档
  • v4.3 已经不在维护周期,建议升级到 v4.4.18