How the Pattern Works
如果消息处理失败,则消息将转发到具有回退时间戳的重试主题。然后,重试主题使用者会检查时间戳,如果没有过期,则暂停对该主题分区的消耗。当过期时,分区消耗恢复,并且再次消耗消息。如果消息处理再次失败,则会将消息转发到下一个重试主题,并且会重复该模式,直到成功处理,或尝试次数用尽并向死信主题(如果已配置)发送消息为止。
举例来说,如果你有一个“main-topic”主题,并希望设置具有 1000ms 指数回退和 2 倍数以及 4 次最大尝试的非阻塞重试,它将创建 main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000 和 main-topic-dlt 主题,并配置相应的使用者。该框架还负责创建主题、设置和配置监听器。
使用此策略后,你将失去 Kafka 对该主题的顺序保证。
你可以设置你首选的 AckMode
模式,但建议使用 RECORD
。
目前,此功能不支持类级的 @KafkaListener
注释。
在将 asyncAcks
设置为 true 的手动 AckMode
中,DefaultErrorHandler
必须配置为将 seekAfterError
设置为 false
。从 2.9.10、3.0.8 版开始,对于这样的配置,它将无条件地设置为 false
。在较早的版本中,有必要覆盖 RetryConfigurationSupport.configureCustomizers()
方法以将该属性设置为 false
。
@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}
此外,在这些版本之前,使用默认(日志记录)DLT 处理程序与任何种类的 AckMode
不兼容,无论 asyncAcks
属性如何。