(一)问题现象
同事反馈,产线有一个topic,总共4个消息队列,其他3个都正常,但是有一个队列只进不出,消息一直挤压,挤压的量越来越大,感觉完全不消费了。
(二)问题排查
按照经验,初步怀疑是应用侧消费进程堵死了导致的
通过jstack取了不同时间段,该应用的线程dump信息
发现"ConsumeMessageThread_13" #274这个线程一直处于RUNNABLE,堵死了
然后进一步分析该线程是具体是在干啥的
线程堵住的地方在发送邮件的部分,估计是处理超时且没加超时时间导致,查看代码确认
果然,没加超时时间
那有一个问题,为啥单个线程堵死会造成整个队列都完全不消费了?
这是因为rocketmq是最小位点提交机制,虽然是并发消费消息,但是上报的是最小位点,一条消息没消费成功,后续位点就没法推动,就会触发消费端限流,进而出现这种一个队列不消费了的情况。
总结
消费端发送邮件部分没加超时时间,异常情况导致线程一直堵死,又因为rocketmq是最小位点提交机制,导致该消息后续位点的消息都没法消费,进而就产生了这种就一个队列只进不出的现象。