Kafka的春天-重试机制

开发 架构
最近业务上用到了Spring Kafka,所以系统性的探索了下Spring Kafka的各种用法,发现了很多实用的特性,下面介绍下Spring Kafka的消息重试机制。

哈喽,大家好,我是指北君。

最近业务上用到了Spring Kafka,所以系统性的探索了下Spring Kafka的各种用法,发现了很多实用的特性,下面介绍下Spring Kafka的消息重试机制。

0. 前言

原生 Kafka 是不支持消息重试的。但是 Spring Kafka 2.7+ 封装了 Retry Topic 这个功能。

1. @RetryableTopic

使用注解的方式启用 Retry Topic,在 @KafkaListener 方法上添加 @RetryableTopic 即可:

@Slf4j
@Component
public class DemoConsumer {
@RetryableTopic
@KafkaListener(topics = "topic1", groupId = "group1")
public void onMsg(ConsumerRecord<String, String> record){
log.info("topic: {}", record.topic());
throw new RuntimeException("kafka exception");
}

}

这样就开启了 Spring Kafka 的消息重试机制:默认重试 3 次,间隔为 1 秒。

我们在方法里模拟了抛出异常,运行后可以发现打印了 3 条日志,间隔时间大约为 1 秒,重试的topic为原topic加上后缀“-retry”

2022-11-12 12:14:10.230  INFO 1023 --- [ner#3-dlt-0-C-1] c.b.b.demo.retrytopic.KafkaListener: topic: topic1
2022-11-12 12:14:11.315 INFO 1023 --- [ner#3-dlt-0-C-1] c.b.b.demo.retrytopic.KafkaListener: topic: topic1-retry-0
2022-11-12 12:14:12.310 INFO 1023 --- [ner#3-dlt-0-C-1] c.b.b.demo.retrytopic.KafkaListener: topic: topic1-retry-1

2. DLT死信队列

如果 3 次重试后依旧失败,会将消息发送到 DLT,

默认情况,消息被发送到死信队列后,会输出一条日志。

2022-11-12 12:14:13.324  INFO 1023 --- [ner#3-dlt-0-C-1] o.s.k.retrytopic.RetryTopicConfigurer    : Received message in dlt listener: topic1-dlt@233

DLT的topic为原topic加上后缀“-dlt”

我们可以使用@DltHandler注解来定义进入死信队列后的操作:

@DltHandler
public void dltHandler(ConsumerRecord<String, String> record){
log.info("topic:{}, key:{}, value:{}", record.topic(), record.key(), record.value());
}

3. 自定义@RetryableTopic

可以自定义重试次数、延迟时间、topic命名策略等等,支持使用 Spring EL 表达式读取配置。

@Slf4j
@Component
public class DemoConsumer {
@RetryableTopic(
attempts = "4",
backoff = @Backoff(delay = "5000", multiplier = "2"),
fixedDelayTopicStrategy = FixedDelayStrategy.SINGLE_TOPIC
)
@KafkaListener(topics = "topic2", groupId = "group1")
public void onMsg2(ConsumerRecord<String, String> record){
log.info("topic: {}", record.topic());
throw new RuntimeException("kafka exception");
}

}

注解属性说明:

attempts:重试次数,默认为3。

@Backoff delay:消费延迟时间,单位为毫秒。

@Backoff multiplier:延迟时间系数,此例中 attempts = 4, delay = 5000, multiplier = 2 ,则间隔时间依次为5s、10s、20s、40s,最大延迟时间受 maxDelay 限制。

fixedDelayTopicStrategy:可选策略包括:SINGLE_TOPIC 、MULTIPLE_TOPICS

4. 配置类

以上介绍的是注解的方式,只对注解下的方法有效。如果想让多个方法都用相同的消息重试配置,那么可以使用配置类方式:

@Bean
public RetryTopicConfiguration retryTopic(KafkaTemplate<String, String> template){
return RetryTopicConfigurationBuilder
.newInstance()
.maxAttempts(4)
.fixedBackOff(5000)
.includeTopic("topic1")
.create(template);
}

小结

以上就是Spring Kafka消息重试机制的简单应用~希望能够帮助那些正在使用Spring Kafka或即将使用的人少走一些弯路、少踩一点坑。

责任编辑:武晓燕 来源: Java技术指北
相关推荐

2024-09-25 08:32:05

2020-07-19 15:39:37

Python开发工具

2021-02-20 10:02:22

Spring重试机制Java

2022-05-06 07:44:10

微服务系统设计重试机制

2023-10-27 08:20:12

springboot微服务

2017-07-02 16:50:21

2017-06-16 15:16:15

2023-11-27 07:44:59

RabbitMQ机制

2023-11-06 08:00:38

接口高可用机制

2024-01-04 18:01:55

高并发SpringBoot

2024-09-30 08:30:37

2024-08-13 15:46:57

2023-06-07 15:25:19

Kafka版本日志

2024-08-27 09:05:45

2024-01-26 07:48:10

SpringKafka提升

2024-01-05 13:26:00

KafkaTopicSpring

2020-08-24 07:34:39

网络超时请求

2023-10-17 08:01:46

MQ消息重试

2018-05-07 10:20:38

Kafka存储机制

2023-11-17 11:55:54

Pythonretrying库
点赞
收藏

51CTO技术栈公众号