模式工作原理
如果消息处理失败,则消息将转发到重试主题,并带有回退时间戳。重试主题消费者随后检查时间戳,如果未到期,则暂停该主题分区的消费。到期后,将恢复分区消费,并再次消费消息。如果消息处理再次失败,则消息将转发到下一个重试主题,并重复此模式,直到成功处理或尝试次数用尽,并将消息发送到死信主题(如果已配置)。
例如,如果您有一个“main-topic”主题,并且想要设置具有 1000 毫秒指数回退、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
属性如何。