线上是否遇到过消息积压的问题,下游消费系统宕机了,导致几百万条消息在消息中间件里积压,如何处理?
首先要找到导致消息堆积的原因,是Producer太多了还是Consumer太少了导致的;
并且检查消息消费速度是否正常,正常的话,可以通过上线更多consumer临时解决消息堆积问题;
如果Consumer和Queue个数不对等,上线了多台Consumer在短时间内也无法消费完堆积的消息;
准备一个临时的topic(里面定义queue的个数非常大);
queue的数量是堆积的几倍;
上线一台Consumer,把原来Topic中的消息通过Consumer消费并投递到新的Topic中,不做业务逻辑处理,只是把消息消费并投递过去;
上线N台Consumer同时消费临时Topic中的数据;
至此完成了堆积消息的消费,后续再修改程序bug,恢复原来的Consumer,继续消费之前的Topic;
追问:堆积时间过长消息消失了?
RocketMQ中的消息只会在commitLog被删除的时候才会消失,也就是说未被消费的消息不会存在超时删除这情况;
追问:堆积的消息会不会进死信队列?
不会,消息在消费失败后才会进入重试队列(%RETRY%+ConsumerGroup),16次(默认16次)失败才会进入死信队列(%DLQ%+ConsumerGroup);