SpringBoot RabbitMQ不定期出现未消费问题定位(

2021-04-02  本文已影响0人  kingbo1587

现象

MQ消费端不定期出现不消费,间隔几天不等。工程重启后,总是恢复消费。

分析

消费端会进行http请求,而请求会出现超时情况,甚至出现请求一直不释放的情况。怀疑与网路有关,且目前无法优化。
按道理请求不释放,只影响一个消费线程,不应该影响其他消费。

原因

发现是prefetch没有配置,SpringBoot默认prefetch为250。因此一个消费线程,一次会拉取最多250个消息,如果其中一个消息卡住了,该线程后续的消息都会卡住,导致消息不能ack。

解决

将prefetch设置为1。同时增加了http请求清理。

总结

起初定位一脸懵,请求超时的情况,是很快发现了。但是为什么导致其他消息挤压,就比较抓瞎。主要还是对于RabbitMQ的prefetch理解不到位。prefetch用于客户端一次性拉取多条消息,减少IO耗时,但是如果消费端本身处理就比较耗时,设置的过大反而得不偿失,甚至造成一个线程拉取到很多消息,在慢慢消费,其他前程在围观的情况。

prefetch 使用场景
1 消费端处理比较耗时
30 消费端处理比较快, RabbitMQ官网推荐
250 SpringBoot 默认
上一篇下一篇

猜你喜欢

热点阅读