飞行队列打满导致客户端无法接收数据

现象:
最近生产设备出现订阅无法接收mqtt消息(qos1)的情况,排查发现是飞行队列inflight(max_inflight)满了,继续推送mqtt消息,设备就无法收到

问题:
因为没有ack,飞行队列打满就再也不推送后续的消息了,那么飞行队列里的消息没有失效时间吗或者能不能设置失效时间?

飞行队列满了之后是不会再继续推送了,后续的消息会进入该订阅者的 Session 的消息队列中,等待飞行队列中的消息收到 ACK 被删除之后,才会进入飞行队列被发送出去。

飞行队列有长度限制但没有一个失效时间,满了就无法继续推送消息。消息队列也有长度限制,但如果超过限制后续的消息会进入队列并把最老的消息挤出去丢弃。

你这里唯一的解决办法是让客户端尽快回复 ACK。如果是因为大量的消息推送到同一个订阅者导致它处理不过来,你可以使用共享订阅的办法来做负载均衡。