模式如何工作

如果消息处理失败,该消息将被转发到一个重试 topic,并带有退避时间戳。然后,重试 topic 的 consumer 会检查时间戳,如果时间未到,则暂停该 topic 分区的消费。当时间到达时,该分区消费将恢复,消息被再次消费。如果消息处理再次失败,该消息将被转发到下一个重试 topic,此模式重复进行,直到处理成功,或者尝试次数耗尽,并且(如果配置了)消息被发送到 Dead Letter Topic。

举例来说,如果您有一个名为 "main-topic" 的 topic,并想设置一个非阻塞重试,其指数退避为 1000ms,乘数为 2,最大尝试次数为 4,它将创建 main-topic-retry-1000、main-topic-retry-2000、main-topic-retry-4000 和 main-topic-dlt 这些 topic,并配置相应的 consumer。该框架还会负责创建这些 topic 以及设置和配置监听器。

使用此策略会失去 Kafka 对该 topic 的顺序保证。
您可以设置您偏好的 AckMode 模式,但建议使用 RECORD

当使用手动 AckModeasyncAcks 设置为 true 时,必须将 DefaultErrorHandler 配置为 seekAfterErrorfalse。从版本 2.9.10 和 3.0.8 开始,对于此类配置,这将被无条件地设置为 false。在更早的版本中,需要重写 RetryTopicConfigurationSupport.configureCustomizers() 方法才能将该属性设置为 false

@Override
protected void configureCustomizers(CustomizersConfigurer customizersConfigurer) {
    customizersConfigurer.customizeErrorHandler(eh -> eh.setSeekAfterError(false));
}

此外,在这些版本之前,使用默认的(日志记录)DLT handler 与任何类型的手动 AckMode 都不兼容,无论 asyncAcks 属性如何。