重试模板与@RetryableTopic

RetryTemplate vs @RetryableTopic

我正在尝试了解 RetryTemplate 和 @RetryableTopic 之间的异同。

RetryTemplate 定义在KafkaListenerContainerFactory 自身内部,@RetryableTopic 注解与@KafkaListener 一起添加。这更多的是风格上的差异,还是它们有两个不同的目的?

容器工厂中的

RetryTemplate 已弃用,因为错误处理程序现在支持退避和异常分类。

正常重试(模板或错误处理程序)之间的区别在于,重试的记录会阻止分区中其他记录的使用,直到该记录被成功处理或丢弃。如果需要严格排序,这很重要。

另一方面,

@RetryableTopic 是 non-blocking 重试,因为失败的记录每次失败时都会移动到不同的主题。这允许在重试期间处理后续记录。如果严格排序不重要,则很有用。

查看 Non-Blocking 重试 https://docs.spring.io/spring-kafka/docs/2.8.4-SNAPSHOT/reference/html/#retry-topic

这些是重试失败处理记录的不同方法。

RetryTemplate 方法已经 deprecated - 它依赖于重试内存中的记录,如果重试的总时间大于 max.poll.interval.ms,这可能会触发分区重新平衡属性.

您可以使用 DefaultErrorHandler 来实现 blocking retrials - 如果记录处理失败,框架将寻找该偏移量并再次接收记录 - 这减少了触发重新平衡的机会与以前的方法相比,等待重试。在此记录成功或用尽重试之前,不会处理其他记录,如果您需要保持记录排序,这一点很重要。

@RetryableTopic的方法是使用一个或多个topic来实现non-blocking retrials,意思是如果一条记录失败,会转发到另一个topic重试,主topic继续处理剩下的记录。在这种方法中,您失去了排序保证,以换取没有失败的记录处理重试减慢其他记录的处理。