跳到主要内容

模式如何工作

ChatGPT-4o-mini 中英对照 How the Pattern Works

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

为了说明,如果你有一个 "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

当使用手动 AckModeasyncAcks 设置为 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));
}
java

此外,在这些版本之前,使用默认的 (logging) DLT 处理程序与任何类型的手动 AckMode 不兼容,无论 asyncAcks 属性如何。