6

我有一个使用 Kafka 活页夹的 Spring Cloud Stream 项目,我正在尝试理解并最终自定义 Cloud Stream 使用的 RetryTemplate。

我没有找到很多关于它是如何工作的文档,但我读过的内容让我做出了以下假设:

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

这些假设是否正确?

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

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

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

4

1 回答 1

3

默认重试配置为 3次尝试,1 秒初始延迟,2.0 乘数,最大延迟 10 秒。

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

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

使用现代版本的 Spring for Apache Kafka(由 binder 使用);最好禁用活页夹重试 ( maxAttempts=1) 并使用SeekToCurrentErrorHandler具有适当BackOff配置的 a。

ListenerContainerCustomizer<AbstractMessageListenerContainer<?, ?>> @Bean您可以使用with设置错误处理程序return (container, dest, grp) -> container.setErrorHandler(handler)

这样就避免了上面提到的问题,只有一条记录的最大延迟间隔必须小于max.poll.interval.ms

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

请参阅参考文档

于 2020-06-08T22:37:57.110 回答