SpringBoot RabbitMQ不定期出现未消费问题定位(prefetch配置不合理)

现象

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

分析

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

原因

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

解决

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

总结

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

prefetch 使用场景
1 消费端处理比较耗时
30 消费端处理比较快, RabbitMQ官网推荐
250 SpringBoot 默认
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容