该模式的工作原理
如果消息处理失败,该消息会被转发到一个带有退避时间戳的重试主题。然后重试主题的消费者会检查该时间戳,如果尚未到期,就暂停该主题分区的消费。到期后恢复该分区的消费,消息被再次消费。如果消息处理再次失败,该消息将被转发到下一个重试主题,如此重复,直到处理成功,或重试次数耗尽,消息被发送到死信主题(如果已配置)。
举例来说,如果你有一个 "main-topic" 主题,并希望设置一个指数退避的非阻塞重试,延迟为 1000ms、乘数为 2、最多 4 次尝试,它将创建 main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000 和 main-topic-dlt 主题,并配置相应的消费者。框架还负责创建这些主题以及设置和配置监听器。
important
使用此策略,你将失去该主题的 Kafka 顺序保证。
important
你可以设置你喜欢的 AckMode,但建议使用 RECORD。
当使用手动 AckMode 且 asyncAcks 设置为 true 时,DefaultErrorHandler 必须配置为 seekAfterError 设为 false。从 2.9.10、3.0.8 版本开始,对此类配置会无条件地将其设置为 false。在更早的版本中,需要覆盖 RetryTopicConfigurationSupport.configureCustomizers() 方法将该属性设为 false。
@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}
此外,在那些版本之前,使用默认的(日志)DLT 处理器与任何形式的手动 AckMode 都不兼容,无论 asyncAcks 属性如何设置。