面试题:什么是 RocketMQ 的消息重试机制?如何配置?

一、消息重试的基本概念

RocketMQ 的消息重试机制是指在消息消费失败时,系统自动或手动重新投递消息的过程。这是保证消息可靠消费的重要机制,主要分为两种类型:

  1. 生产者重试:消息发送失败时的重试
  2. 消费者重试:消息消费失败时的重试

二、生产者重试机制

1. 同步发送重试

DefaultMQProducer producer = new DefaultMQProducer("producer_group");
// 设置同步发送失败时的重试次数(默认2次)
producer.setRetryTimesWhenSendFailed(3); 

触发条件

  • 网络异常
  • Broker响应超时
  • Broker返回失败状态

2. 异步发送重试

// 设置异步发送失败时的重试次数(默认2次)
producer.setRetryTimesWhenSendAsyncFailed(3);

3. 关键配置参数

参数默认值说明
retryTimesWhenSendFailed2同步发送重试次数
retryTimesWhenSendAsyncFailed2异步发送重试次数
retryAnotherBrokerWhenNotStoreOKfalse是否尝试其他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)

六、注意事项

  1. 幂等性设计
    • 必须实现消费逻辑的幂等处理
    • 推荐使用唯一业务ID+状态机控制
  2. 性能影响
    • 大量重试会占用Broker资源
    • 频繁重试可能掩盖系统问题
  3. 监控建议
    # 监控重试队列
    sh mqadmin consumerProgress -n namesrv:9876 -g consumer_group | grep RETRY
    
    # 监控消费失败率
    sh mqadmin brokerStats -n namesrv:9876 -b broker_ip:10911
  4. 特殊场景
    • 广播模式不支持重试
    • 事务消息有独立的重试机制

RocketMQ的重试机制需要根据业务特点合理配置,既要保证消息可靠性,又要避免无限重试导致系统雪崩。建议配合监控系统实时观察重试情况,及时处理异常。

THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容