一、RocketMQ的消息消费过程中,有可能失败或报错,且支持消费重试:
重试情况(未返回消费成功状态)
1. 消费者抛异常,或返回reconsume_later
2. 网络超时
集群消费模式:消费失败后重试
广播消费模式:只打印日志不重试
并发消费重试
1. 根据消费失败消息的内容,创建新消息(重试主题为%RETRY%+consumerGroup),设置延迟时间重新投递
2. 当消息达到延迟时间后,再创建重试主题的消息,保存commitLog,重新消费
3. 并发消费最大重试次数:默认16次(可配置少于16次),超过则进入死信队列(%DLQ%+consumerGroup)
delayTimeLevel,代表不同的消息延迟级别,开源版本18个延迟级别1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
顺序消息消费失败:无reconsume_later状态,默认1s再提交到消费线程不断重试
二、重试消费流程
并发消费失败的消息,重试处理流程如下图所示:
1、根据消息失败的消息,构建新消息(重试消息主题为:%RETRY%+consumerGroup,消息属性中有原msgId),重新投递回broker,delayTimeLevel = 重试次数+3,如果重试次数达到16次(默认值),则进入死信队列
2、保存commitLog时,发现delayTimeLevel >0,构建新消息,将topic替换为SCEHDULE_TOPIC_XXXX,原topic保存在消息属性
3、待延迟时间到,再创建新消息,设置重试主题:%RETRY%+consumerGroup,保存到commitLog
一个消费失败的消息体发回broker,需要在commitLog里面存储两份(topic为SCHEDULE_TOPIC_XXXX的一份,主要是为控制延时;topic为%RETRY%groupName的消息一份)