现象
MQ消费端不定期出现不消费,间隔几天不等。工程重启后,总是恢复消费。
分析
消费端会进行http请求,而请求会出现超时情况,甚至出现请求一直不释放的情况。怀疑与网路有关,且目前无法优化。
按道理请求不释放,只影响一个消费线程,不应该影响其他消费。
原因
发现是prefetch没有配置,SpringBoot默认prefetch为250。因此一个消费线程,一次会拉取最多250个消息,如果其中一个消息卡住了,该线程后续的消息都会卡住,导致消息不能ack。
解决
将prefetch设置为1。同时增加了http请求清理。
总结
起初定位一脸懵,请求超时的情况,是很快发现了。但是为什么导致其他消息挤压,就比较抓瞎。主要还是对于RabbitMQ的prefetch理解不到位。prefetch用于客户端一次性拉取多条消息,减少IO耗时,但是如果消费端本身处理就比较耗时,设置的过大反而得不偿失,甚至造成一个线程拉取到很多消息,在慢慢消费,其他前程在围观的情况。
prefetch | 使用场景 |
---|---|
1 | 消费端处理比较耗时 |
30 | 消费端处理比较快, RabbitMQ官网推荐 |
250 | SpringBoot 默认 |
网友评论