一、消息重试的基本概念
RocketMQ 的消息重试机制是指在消息消费失败时,系统自动或手动重新投递消息的过程。这是保证消息可靠消费的重要机制,主要分为两种类型:
- 生产者重试:消息发送失败时的重试
- 消费者重试:消息消费失败时的重试
二、生产者重试机制
1. 同步发送重试
DefaultMQProducer producer = new DefaultMQProducer("producer_group");
// 设置同步发送失败时的重试次数(默认2次)
producer.setRetryTimesWhenSendFailed(3);
触发条件:
- 网络异常
- Broker响应超时
- Broker返回失败状态
2. 异步发送重试
// 设置异步发送失败时的重试次数(默认2次)
producer.setRetryTimesWhenSendAsyncFailed(3);
3. 关键配置参数
参数 | 默认值 | 说明 |
---|---|---|
retryTimesWhenSendFailed | 2 | 同步发送重试次数 |
retryTimesWhenSendAsyncFailed | 2 | 异步发送重试次数 |
retryAnotherBrokerWhenNotStoreOK | false | 是否尝试其他Broker |
三、消费者重试机制
1. 集群模式下的重试
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
// 设置最大重试次数(默认16次)
consumer.setMaxReconsumeTimes(5);
触发条件:
- 消费逻辑返回
RECONSUME_LATER
- 消费逻辑抛出异常
2. 重试队列机制
- 首次消费失败:进入
%RETRY%consumerGroup
队列 - 每次重试间隔逐渐增加(基于延迟级别)
- 超过最大重试次数后转入死信队列(
%DLQ%consumerGroup
)
3. 重试间隔配置
在Broker端配置(broker.conf
):
# 重试间隔对应延迟级别(默认从3开始:10s, 30s, 1m, 2m...)
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
4. 顺序消息重试
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeOrderlyContext context) {
try {
// 处理消息...
return ConsumeOrderlyStatus.SUCCESS;
} catch (Exception e) {
// 顺序消息必须保持队列暂停
context.setSuspendCurrentQueueTimeMillis(1000);
return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;
}
}
});
四、死信队列(Dead Letter Queue)
1. 死信队列特性
- 命名格式:
%DLQ%consumerGroup
- 消息进入条件:
- 超过最大重试次数(默认16次)
- 消息已过期(默认保留3天)
2. 监控死信队列
# 查看死信队列
sh mqadmin topicList -n namesrv:9876 | grep DLQ
# 消费死信队列中的消息
DefaultMQPushConsumer dlqConsumer = new DefaultMQPushConsumer("dlq_consumer");
dlqConsumer.subscribe("%DLQ%original_consumer_group", "*");
五、配置建议
1. 生产环境推荐配置
// 生产者配置
producer.setRetryTimesWhenSendFailed(3); // 网络不稳定时可适当增加
// 消费者配置
consumer.setMaxReconsumeTimes(5); // 根据业务容忍度设置
consumer.setSuspendCurrentQueueTimeMillis(1000); // 顺序消息暂停时间
2. 不同场景下的配置策略
场景 | 重试策略 | 最大重试次数 | 间隔配置 |
---|---|---|---|
支付交易 | 快速失败 | 2-3次 | 短间隔(10s,30s,1m) |
通知类 | 温和重试 | 5-8次 | 中等间隔(1m,2m,5m) |
数据同步 | 持久重试 | 10-16次 | 长间隔(5m,10m,30m) |
六、注意事项
- 幂等性设计:
- 必须实现消费逻辑的幂等处理
- 推荐使用唯一业务ID+状态机控制
- 性能影响:
- 大量重试会占用Broker资源
- 频繁重试可能掩盖系统问题
- 监控建议:
# 监控重试队列 sh mqadmin consumerProgress -n namesrv:9876 -g consumer_group | grep RETRY # 监控消费失败率 sh mqadmin brokerStats -n namesrv:9876 -b broker_ip:10911
- 特殊场景:
- 广播模式不支持重试
- 事务消息有独立的重试机制
RocketMQ的重试机制需要根据业务特点合理配置,既要保证消息可靠性,又要避免无限重试导致系统雪崩。建议配合监控系统实时观察重试情况,及时处理异常。
THE END
暂无评论内容