RocketMQ-Retry

RocketMQ的Retry队列用于处理消费失败的消息,每个消费组都有独立的Retry队列。生产逻辑中,Concurrently模式下消费失败会发送至Retry队列,Orderly模式则在本地尝试重试。消费逻辑中,消息先被写入SCHEDULE_XXXX队列,延迟一定时间后发送到Retry队列供消费者重试。目前Broadcasting模式下直接丢弃消息,存在优化空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Retry队列是什么

当消息消费失败时,消费者会将消息发往retry队列,等待重试

Retry队列的命名方式为:%RETRY%GROUP_NAME,也就是说每个消费组都会有自己独立的Retry队列

生产逻辑

RequestCode:CONSUMER_SEND_MSG_BACK

脉络图如下:

在这里插入图片描述

Client端

Concurrently模式

在以下几种情况下会向Retry队列发送该条消息

  1. 当消息消费失败返回RECONSUME_LATER,并且是Clustering模式时
  2. 清理本地超时消息(已拉取缓存在内存中的消息)
public void processConsumeResult(
    final ConsumeConcurrentlyStatus status,
    final ConsumeConcurrentlyContext context,
    final ConsumeRequest consumeRequest
) {
   
    switch (this.defaultMQPushConsumer.getMessageModel()) {
   
        case BROADCASTING:
            for (int i = ackIndex + 1; i < consumeRequest.getMsgs().size(); i++) {
   
                MessageExt msg = consumeRequest.getMsgs().get(i);
                log.warn("BROADCASTING, the message consume failed, drop it, {}", msg.toString());
            }
            break;
        case CLUSTERING:
            List<MessageExt> msgBackFailed = new ArrayList<MessageExt>(consumeRequest.getMsgs().size());
            
### RocketMQ 生产者配置参数及其功能 以下是 RocketMQ 中生产者的常见配置参数以及它们的功能说明: #### 1. **name-server** `NameServer` 是 RocketMQ 的核心组件之一,负责管理 Broker 地址信息并提供路由服务。生产者通过 `namesrvAddr` 参数连接到 NameServer 来获取目标 Topic 所绑定的 Broker 列表。 - 配置方式: ```java DefaultMQProducer producer = new DefaultMQProducer("producer_group"); producer.setNamesrvAddr("localhost:9876"); // 设置 NameServer 地址 ``` - 功能描述:指定生产者与哪个 NameServer 进行通信以完成消息发送操作[^5]。 --- #### 2. **group** `Group` 表示生产者组名,用于区分不同的生产者集群。同一 Group 下的所有 Producer 实例共享相同的逻辑行为。 - 配置方式: ```java DefaultMQProducer producer = new DefaultMQProducer("my_producer_group"); ``` - 功能描述:定义一组具有相同业务逻辑的生产者实例集合,便于管理和监控[^6]。 --- #### 3. **namesrvAddr** 该参数指定了 NameServer 的地址列表,通常是一个或多个 IP 和端口组合而成的字符串形式。 - 配置方式: ```properties namesrvAddr=localhost:9876;another-host:9876 ``` - 功能描述:告知生产者如何找到可用的 NameServers 并建立初始连接链路[^7]。 --- #### 4. **maxMessageSize** 此参数控制单条消息的最大允许大小,默认值为 4MB(即 4 * 1024 * 1024 字节)。如果尝试发送的消息超过这个限制,则会抛出异常。 - 配置方式: ```java producer.setMaxMessageSize(8 * 1024 * 1024); // 将最大消息尺寸设置为 8 MB ``` - 功能描述:防止过大的消息占用过多资源而导致性能下降或其他问题发生[^8]。 --- #### 5. **sendMsgTimeout** 表示每次调用 `sendMessage()` 方法时等待服务器响应的时间间隔(单位毫秒),默认超时时限为 3 秒钟 (3000 ms)。 - 配置方式: ```java producer.setSendMsgTimeout(5000); // 设置超时时间为 5 秒钟 ``` - 功能描述:当网络延迟较高或者目标队列满载等情况可能引起长时间阻塞现象时,可以通过调整此项来优化用户体验[^9]。 --- #### 6. **retry settings** 重试机制对于保障数据可靠性至关重要,在某些特殊场景下可以自定义失败后的处理策略。 - 常见选项包括但不限于: - `RetryAnotherBrokerWhenNotAvailable`: 如果当前 broker 不可访问则切换至其他备选节点继续尝试; - `MaxReconsumeTimes`: 对于消费过程中遇到错误的情况限定最多重新投递次数; - 示例代码片段如下所示: ```java producer.setRetryAnotherBrokerWhenNotAvailable(true); producer.setMaxReconsumeTimes(3); ``` - 功能描述:增强系统的容错能力并通过合理的回退方案减少因瞬态故障引发的数据丢失风险[^10]。 --- ```java // 完整示例程序 DefaultMQProducer producer = new DefaultMQProducer("example_producer_group"); producer.setNamesrvAddr("localhost:9876"); producer.setMaxMessageSize(8 * 1024 * 1024); producer.setSendMsgTimeout(5000); producer.setRetryAnotherBrokerWhenNotAvailable(true); try { producer.start(); Message msg = new Message("TopicTest", "TagA", ("Hello RocketMQ").getBytes(RemotingHelper.DEFAULT_CHARSET)); SendResult sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); } catch (Exception e) { e.printStackTrace(); } finally { producer.shutdown(); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值