RocketMQ-Retry

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

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());
            
Spring Boot集成RocketMQ工具主要是通过添加依赖和配置来实现的。首先,你需要将`rocketmq-tools:5.3.0-api`库添加到你的项目依赖中,这通常是在pom.xml文件中进行: ```xml <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client-tools</artifactId> <version>5.3.0</version> </dependency> ``` 接下来,你需要配置Spring Boot应用来连接RocketMQ服务器。在application.properties或application.yml文件中设置相关的属性,例如: ```properties roocketmq.namesrv.address=your-nameserver-address:9876 # RocketMQ名称服务地址 roocketmq.broker.address.list=your-broker-address:9876 # 生产者和消费者的broker地址列表 roocketmq.consumer.group.id=your-consumer-group-id # 消费者组ID ``` 对于发送普通消息、重试消息和死信消息,你可以使用RocketMQ的API。以下是一些基本操作示例: 1. **普通消息查询**: - 创建一个消费者实例,如`DefaultMQPushConsumer` - 设置消费策略,比如订阅主题和队列 - 调用`consumeMessage`方法来接收消息 2. **重试消息**: - 配置`ConsumeMessageModel`来启用消息重试机制,比如设置`RETRY_TIMES` - 使用监听`MessageReconsumeException`处理重试失败的消息 3. **死信消息查询**: - 某些异常可能导致消息变为死信,需要监控`SendResultCode` - 使用`DeadLetterQueue`管理死信消息,包括查找和删除死信 以下是创建消费者并进行消息查询的基本代码片段: ```java import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.consumer.MessageExt; // ... public class MyConsumer { private DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup"); // 配置消费者属性... consumer.start(); public void consumeMessages() { consumer.subscribe(topic, null); // 订阅主题 consumer.registerMessageListener((message) -> { MessageExt messageExt = (MessageExt) message; // 处理接收到的消息 }); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值