首页 文章

达到消费者maxAttempts后会发生什么?

提问于
浏览
0

使用以下配置和方案,达到maxAttempts时会发生什么?

具有Kafka绑定的Spring Cloud Stream和以下属性:

  • spring.cloud.stream.bindings.input.consumer.maxAttempts = 3

  • spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset = true

  • spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOnError = false

  • spring.cloud.stream.kafka.bindings.input.consumer.enableDlq = false

这是场景:

  • 使用@StreamListener注释的Consumer接收消息有效负载

  • 在从带注释的方法返回之前,使用者尝试将消息保留在数据库中

  • 数据库已关闭,并且@StreamListener带注释的方法抛出了运行时异常

我看到的行为是消费者重试消息,直到达到maxAttempts限制 . 然后在重新启动服务之前没有任何反应 . 重新启动后,将重新使用该消息 .

如果在达到maxAttempts后数据库再次可用,会发生什么?我是重启服务的唯一选择吗?有没有办法将maxAttempts设置为无穷大?

我怀疑我没有完全理解这种行为

1 回答

  • 1

    这确实是预期的行为,因为您设置为不自动提交错误消息 . 会发生的是,这为客户端提供了从最后提交的偏移量重放的机会 .

    将maxAttempts设置为无穷大的问题是,当发生不可恢复的错误时,您将使您的侦听器尝试一遍又一遍地使用该消息 .

    更好的方法可能是为这些消息设置dlq,然后使用PollableChannel定期轮询消息并尝试重新处理它们,这将为您的外部资源提供一些时间来恢复 .

相关问题