【发布时间】:2019-12-22 15:51:37
【问题描述】:
我们正在处理一个场景,我们需要针对同一应用程序中的不同消费者使用不同的重试策略。
请参考下图(简要架构图):
main_consumer 使用来自main_topic 的有效负载并尝试将其发送到 API。如果 API 处理失败,我们会将此失败的有效负载写入另一个名为 error_topic 的主题中。有一个不同的消费者 (error_consumer) 从 error_topic 消费,并通过 3 次重试尝试再次将有效负载发送到 API。如果仍然失败,则error_consumer 将此有效负载推送到DLQ。
我们面临的问题:
我们需要main_consumer 不重试失败,error_consumer 重试失败 3 次。我们将maxAttempts 作为main_consumer 的1 和maxAttempts 作为error_consumer 的3。但是使用这种配置,main_consumer 会重试 3 次,error_consumer 会重试一次。它的工作方式与我们的预期完全相反。
P.S : 我们尝试为两个消费者交换 maxAttempts 是徒劳的(这是不合逻辑的)。
下面是我们正在使用的 Spring 云流应用配置:
我们正在使用以下配置文件运行应用程序。
application-main.yml
spring:
cloud:
stream:
kafka:
bindings:
main-consumer-channel:
consumer:
autoCommitOffset: false
bindings:
main-consumer-channel:
destination: main_topic
consumer:
maxAttempts: 1
backOffInitialInterval: 5000
backOffMultiplier: 2
application-error-retry.yml
spring:
cloud:
stream:
kafka:
bindings:
error-consumer-channel:
consumer:
autoCommitOffset: false
bindings:
error-consumer-channel:
destination: error_topic
consumer:
maxAttempts: 3
backOffInitialInterval: 5000
backOffMultiplier: 2
【问题讨论】:
标签: spring-boot apache-kafka kafka-consumer-api spring-cloud-dataflow spring-retry