了解 Spring Cloud Stream Kafka 和 Spring Retry

Posted

技术标签:

【中文标题】了解 Spring Cloud Stream Kafka 和 Spring Retry【英文标题】:Understanding Spring Cloud Stream Kafka and Spring Retry 【发布时间】:2020-09-27 22:37:58 【问题描述】:

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

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

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

这些假设正确吗?

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

见the reference documentation。

【讨论】:

谢谢你,加里。不知道我怎么错过了你链接的文档。

以上是关于了解 Spring Cloud Stream Kafka 和 Spring Retry的主要内容,如果未能解决你的问题,请参考以下文章

一文了解Spring Cloud Stream体系

了解 Spring Cloud Stream Kafka 和 Spring Retry

`spring-cloud-starter-eureka-server`和`spring-cloud-starter-netflix-eureka-server`之间的区别

精通springcloud:消息驱动的微服务,了解Spring Cloud Stream

随手记录关于spring-cloud-starter-eureka-server 和 spring-cloud-starter-netflix-eureka-server

spring-cloud-starter-eureka-server 和 spring-cloud-starter-netflix-eureka-server的区别