admin 管理员组

文章数量: 887032


2023年12月25日发(作者:虚拟机安装linux系统报错)

今天一到公司,就发现某个业务的回调全部没有处理,打开

RabbitMQ Management 查看 Queue 发现有两个状态为

Unacked 的消息。

这个状态的产生是因为消费者处理消息,还没有给 Rabbit 应答,没有应答的原因可能是有异常没有捕获。如果 Unacked 的数量大于或等于消费者的线程数时,其他消息就不会被消费,导致积压。当程序断开与 RabbitMQ 的链接后,Unacked 的消息状态会重新变为

Ready 等待消费。从上图可以看到,我这个 Queue 只有两个消费线程,Unacked 消息也有两个,于是其他消息就不会被处理。(故障时

Ready 消息有好几百个,没截图)

既然知道了原因,那就好解决了,先增加回调的异常捕获,异常处理完成后,回复应答即可。

ck(sageProperties().getDeliveryTag(), true);

因为业务比较着急,我这里先通过增加消费线程临时解决了。

一般来说,如果队列中 Ready 状态的消息数比较多,可以认为是消费者的处理能力不足,可以通过增加消费者来解决;而 Unacked

消息较多除了可能消费者处理能力不足外,还可能是消费者取走消息后,由于某种原因没有做消息应答,需要根据情况处理。


本文标签: 处理 消息 消费者 没有