RocketMQ—RocketMQ消费重试和死信消息

RocketMQ---RocketMQ消费重试和死信消息

消费重试

生产者重试

设置重试的代码如下

java 复制代码
// 失败的情况重发3次
producer.setRetryTimesWhenSendFailed(3);
// 消息在1S内没有发送成功,就会重试
producer.send(msg, 1000);

一般情况下,我们不会在生产者方进行重试。

消费者重试

消费者在消费消息的过程中,下方三种情况会进行重试:

  • 业务报错了
  • 返回null 返回
  • 返回RECONSUME_LATER

代码如下:

java 复制代码
/**
     * 重试的时间间隔
     * 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
     * 默认重试16次
     * --------------
     * 重试的次数一般 5次
     * @throws Exception
     */
@Test
public void retryConsumer() throws Exception {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("retry-consumer-group");
    consumer.setNamesrvAddr(MqConstant.NAME_SERVER_ADDR);
    consumer.subscribe("retryTopic", "*");
    consumer.registerMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            MessageExt messageExt = msgs.get(0);
            System.out.println(new Date());
            System.out.println(messageExt.getReconsumeTimes());
            System.out.println(new String(messageExt.getBody()));
            // 业务报错了 返回null 返回 RECONSUME_LATER 都会重试
            return ConsumeConcurrentlyStatus.RECONSUME_LATER;
        }
    });
    consumer.start();
    System.in.read();
}

消息默认重试16次:

能否自定义重试次数

设置重试次数的代码如下:

java 复制代码
// 设定重试次数
consumer.setMaxReconsumeTimes(2);

消息的构成如下:

如果使用了上述代码,就会为消息头设置重试次数。

死信消息

如果消息重试了最大次数还是失败怎么办

最大次数:如果没有设置最大次数,默认情况下,并发模式是16次,顺序模式是int的最大值。

如果重试了最大次数还是失败,就会变成死信消息,会被放进一个死信主题中去,这个死信主题的名字是有规律的,这个主题是

%DLQ%消费者组的名称。

当消息处理失败的时候该如何正确的处理

  1. 可以监听死信消息,给管理员发送邮件或者短信通知,但是如果有多个死信消息,就要写多个监听器;
  2. 可以手动判断重试次数,如果大于某个次数,就记录下来,就不重试了,发送邮件或者短信通知。
java 复制代码
try {
    handleDb();
} catch (Exception e) {
    // 重试
    int reconsumeTimes = messageExt.getReconsumeTimes();
    if (reconsumeTimes >= MAX_TIMES) {
        // 不要重试了
        System.out.println("记录到特别的位置 文件 mysql 通知人工处理");
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
}
相关推荐
千里达景区票务系统12 小时前
消息队列选型对比:RabbitMQ vs RocketMQ vs Kafka
kafka·消息队列·rabbitmq·rocketmq
Sayai14 小时前
Kafka 跨数据中心日志同步实战:MirrorMaker 2 选型对比 + Flink 中继任务落地(双中心互备与消费者组隔离避坑)
大数据·运维·分布式·flink·kafka·消息队列·高可用
IT规划师2 天前
Redis 数据类型全解 - List:用对是队列用错是灾难(二)
redis·消息队列·.net
螺蛳粉 螺蛳粉4 天前
CDH第七篇:CDH 集成 Kafka 实战:CSD + Parcel 组合拳,先装 ZooKeeper 是铁律
物联网·zookeeper·kafka·消息队列·parcel·cdh集成·csd
阿里云云原生5 天前
阿里云云原生四项 AI 应用工程化实荣获“鼎新杯”优秀案例
rocketmq
阿里云云原生5 天前
Qoder Cloud Agents 手脑分离实践:RocketMQ LiteTopic 如何支撑规模化长程 Agent 任务
rocketmq
阳光不锈@6 天前
三大主流消息队列架构设计思想剖析:从 RabbitMQ 到 RocketMQ 的改造实践
kafka·rabbitmq·rocketmq·rabbit改造rocket·去除rabbitmq·rabbitmq改造
我不会起名字3228 天前
Kafka 重复消费:自动提交位点与手动提交的 3 个错位
kafka·消息队列·幂等·排查
爱好曙光8 天前
NATS JetStream 消费者 ack 与重投递:重复消费治理实战
消息队列·幂等·ack·jetstream·nats
我不会起名字32210 天前
Kafka 顺序消息为什么乱了:分区数变化与重试的 3 类原因
kafka·消息队列·顺序·排查