跳到主要内容

非阻塞重试

ChatGPT-4o-mini 中英对照 Non-Blocking Retries

版本 2.9 更改了引导基础设施 bean 的机制;请参阅 Configuration 了解现在引导该功能所需的两种机制。

实现非阻塞重试 / DLT 功能与 Kafka 通常需要设置额外的主题,并创建和配置相应的监听器。自 2.7 版本起,Spring for Apache Kafka 通过 @RetryableTopic 注解和 RetryTopicConfiguration 类提供对这一功能的支持,以简化该引导过程。

自 3.2 版本以来,Spring for Apache Kafka 支持使用 @KafkaListener on a Class 进行非阻塞重试。

important

不支持与 Batch Listeners 的非阻塞重试。

important

非阻塞重试不能与 容器事务 结合使用。

部分总结

📄️ 模式是如何工作的

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

📄️ 回退延迟精度

所有消息处理和退避都是由消费者线程处理的,因此,延迟精度在最佳努力的基础上得到保证。如果一条消息的处理时间超过该消费者的下一条消息的退避时间,则下一条消息的延迟将高于预期。此外,对于短延迟(大约 1s 或更短),线程必须执行的维护工作,例如提交偏移量,可能会延迟消息处理的执行。如果重试主题的消费者处理多个分区,精度也可能受到影响,因为我们依赖于从轮询中唤醒消费者并拥有完整的 pollTimeouts 来进行时间调整。