消息堆积

环境信息

  • EMQX 版本: 5.0.3 permanent
  • 操作系统及版本:linux CentOS
  • 其他

问题描述

消息队列一直堆积;客户端不断发送publish消息

配置文件及日志

image

看第二张图中,飞行窗口已经满了。证明这个客户端没有/或在没来得及回复 ACK,导致 emqx 向客户端的发消息阻塞了。
此时需要检查下,是属于那种情况:

  1. 是否消息太多,压力太大客户端处理不了了?一般来说,你的客户端消息回调里面,不挂什么耗时的业务的话每秒 1000的 QoS1 是没啥问题的,如果由需要检查下。
  2. 消息量很小,客户端或在服务端实现有bug,就卡住了,不往下发了。这种情况就只有多检查下日志和网络抓包具体看了

反正对于 EMQX 来说,飞行窗口满了后,就不会在往下发 Qos1 和 QoS2 的消息了,必须要客户端把前面的 ACK 先发给 EMQX 才行

如果是订阅客户端下线了,一直没发送PUBACK,而pub客户端一直在发消息,这时候飞行窗口会满吗?

它有几种情况:

  1. 客户端断电。emqx 是在在心跳周期内是感知不到连接已经断开的,还是会一直发消息,此时就会满了,类似于上面提到的图。
  2. emqx 能感知到的断开,例如正常下线,socket 被关闭等。此时如果保留会话是开启的(clean_session=false),所有消息会被放到消息队列里( mqueue ),不会到飞行窗口(inflight) 的

感谢,我个人观点,可能pub客户端根据reasonCode发现是没有订阅端,就不应该发消息,可能更方便解决这个问题