这是一项使用我们今年早些时候在 Spring for Apache Kafka 2.7.0 上推出的主题功能启用延迟非阻塞重试自动配置的提案。
有关该功能的更多详细信息可以在文档中找到:https://docs.spring.io/spring-kafka/docs/current/reference/html/#retry-topic
我已经有了一份带有测试的工作草案,应该很快就会打开一个 PR,以便我们可以在必要时更详细地讨论它。
最小配置就像添加spring.kafka.retry-topic-enabled=true
到应用程序 yaml 或属性配置文件一样简单,这会将默认的全局重试配置应用于所有主题。
spring:
kafka:
retry-topic-enabled: true
通过最小配置,框架将使用以下默认值设置主题和使用者:
- 重试所有主题
- 将消息发送到 DLT 之前进行 3 次处理尝试
- 尝试之间的固定 BackOffPolicy 为 1 秒
- 默认主题后缀“-retry-1”、“-retry-2”、“-dlt”
- 通过 NewTopic 实例自动创建重试主题和 dlt
- 重试所有异常
- 使用自动配置提供的专用默认 ConcurrentKafkaListenerContainerFactory 实例,专门用于创建重试主题和 dlt 消费者
- 使用自动配置中默认的 Spring Kafka KafkaTemplate 将消息转发到主题
配置文件中还可以提供更具体的配置,例如:
spring:
kafka:
retry-topic-enabled: true
retry-topic:
myGlobalConfiguration:
attempts: 4
back-off:
delay: 300s
multiplier: 2
max-delay: 1200s
topic-suffixing-strategy: suffix-with-index-value
dlt-strategy: fail-on-error
或者,可以提供不止一种配置,以便对配置进行更细粒度的控制:
spring:
kafka:
retry-topic-enabled: true
retry-topic:
myGlobalConfiguration:
attempts: 4
back-off:
delay: 300s
multiplier: 2
max-delay: 1200s
topic-suffixing-strategy: suffix-with-index-value
dlt-strategy: fail-on-error
exclude-topics: my-specific-topic
mySpecificConfiguration:
include-topics: my-specific-topic
attempts: 5
back-off:
delay: 5s
not-retry-on:
- com.mycompany.myproject.mypackage.exceptions.MyException
- com.mycompany.myproject.mypackage.exceptions.MyOtherException
topic-suffixing-strategy: suffix-with-index-value
dlt-strategy: fail-on-error
注意:如果对于许多主题配置来说过于冗长,用户应该能够使用标准 Spring Boot 配置功能(例如spring.config.import
.
如果您对此有任何反馈,我将不胜感激。如果有任何问题或需要我提供帮助,请告诉我。
@garyrussell 和@artembilan,如果可能的话,我也非常感谢您的反馈。
感谢大家为精彩的 Spring 项目付出的辛勤工作!