模式工作原理

如果消息处理失败,消息将被转发到一个重试主题,并带有回退时间戳。重试主题的消费者会检查时间戳,如果时间未到,则会暂停该主题分区的消息消费。当时间到达时,分区消费将恢复,消息将再次被消费。如果消息处理再次失败,消息将被转发到下一个重试主题,并重复此模式,直到成功处理消息,或者尝试次数用尽,消息被发送到死信主题(如果已配置)。

举例来说,如果你有一个名为 "main-topic" 的主题,并且想要设置非阻塞重试,并使用 1000 毫秒的指数回退,乘数为 2,最大尝试次数为 4,那么它将创建 main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000 和 main-topic-dlt 主题,并配置相应的消费者。框架还负责创建主题,以及设置和配置监听器。

使用这种策略,你会失去 Kafka 对该主题的排序保证。
您可以设置您喜欢的AckMode模式,但建议使用RECORD
目前,此功能不支持类级别的@KafkaListener注释。

当使用手动AckMode并将asyncAcks设置为true时,必须将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属性如何。