Paho MqttAsyncClient inflight消息数超100及异步publish阻塞问题排查
问题分析与结论
先排除Broker端问题
你的mosquitto配置中:
max_inflight_messages 0和max_inflight_bytes 0在mosquitto中表示不对inflight消息做数量或字节限制,Broker不会因为这两个参数限制消息处理,所以当前inflight异常和publish阻塞大概率不是Broker负载能力导致的。
更可能是客户端(Paho Java MQTT5 Client 1.2.5)的问题
从现象和版本特性来看,主要有几个可能的点:
- 版本已知缺陷:Paho Java Client 1.2.x的MQTT5实现属于早期版本,存在一些异步发送和ACK处理的bug,比如异步publish时内部队列处理阻塞、PUBACK回调线程死锁或延迟处理的情况,这些都会导致inflight消息无法及时清理,进而阻塞后续publish请求。
- 客户端inflight管理逻辑:QoS1消息需要等待Broker的PUBACK才能从inflight队列移除,如果客户端的ACK处理线程被阻塞(比如用户自定义的回调逻辑耗时过长、线程池配置不合理),会导致inflight消息堆积;即使是异步publish,当客户端内部的发送队列或inflight队列达到阈值时,也会触发阻塞逻辑。
- 客户端资源配置:如果客户端的发送线程池、回调线程池的线程数配置过小,高负载下线程被占满,会导致消息发送和ACK处理延迟,进而出现publish阻塞的情况。
建议排查方向
- 升级Paho Java Client到最新稳定版本(比如1.3.x或更高),新版本修复了大量MQTT5相关的bug,尤其是异步发送和inflight管理的问题。
- 检查客户端的线程池配置(比如
MqttAsyncClient的ExecutorService参数),确保线程数足够处理消息发送和回调逻辑。 - 排查自定义的消息回调(比如
MqttCallback中的方法)是否存在耗时操作,避免阻塞ACK处理线程。
内容的提问来源于stack exchange,提问作者user2071938
相关产品推荐
相关产品推荐

