了解Spring Cloud Stream Kafka和Spring重试

问题描述 投票:2回答:1

我有一个使用Kafka活页夹的Spring Cloud Stream项目,我试图理解并最终定制Cloud Stream使用的RetryTemplate。

我没有找到很多有关其工作原理的文档,但是我所阅读的内容使我得出以下假设:

  • Cloud Stream默认配置并启用Spring Retry,包括默认重试和退避策略。
  • 默认情况下,@StreamListener中任何未捕获的异常都会触发Spring Retry
  • Cloud Stream将以某种方式跟踪每条消息的RetryContext信息(如何?我不确定)

这些假设正确吗?

现在,在我的应用程序中,我有一种模式,其中某些消息可以立即处理,但是其他消息必须推迟以备稍后再试(使用指数补偿等)。

我应该抛出一个异常,导致Spring Cloud Stream在绑定器层重试这些消息,还是自己实施重试并跟踪自己的重试上下文?

如果我应该依靠Cloud Stream的重试设置,那么应该如何自定义退避策略等?

spring-cloud-stream spring-retry spring-cloud-stream-binder-kafka
1个回答
0
投票

default retry configuration尝试3次,初始延迟为1秒,乘数为2.0,最大延迟为10秒。

默认情况下,使用无状态重试,这意味着重试在内存中。

poll()返回的所有记录的所有重试的总延迟不得超过max.poll.interval.ms

[使用适用于Apache Kafka的现代版Spring(由活页夹使用);最好禁用联编程序重试(maxAttempts=1)并使用配置了适当SeekToCurrentErrorHandlerBackOff

您可以通过ListenerContainerCustomizer<AbstractMessageListenerContainer<?, ?>>@Bean一起设置错误处理程序。

这避免了上述问题,并且仅一条记录的最大延迟间隔必须小于return container -> container.setErrorHandler(handler)

您还可以分类哪些异常是可重试的,哪些不是可以重试的,以及配置在重试用尽后调用的死信恢复器。

请参见max.poll.interval.ms

© www.soinside.com 2019 - 2024. All rights reserved.