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

时间:2017-07-13 23:23:38

标签: spring-cloud-stream

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

使用Kafka绑定的Spring Cloud Stream和以下属性:

  • spring.cloud.stream.bindings.input.consumer.maxAttempts = 3
  • spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOffset =真
  • spring.cloud.stream.kafka.bindings.input.consumer.autoCommitOnError =假
  • spring.cloud.stream.kafka.bindings.input.consumer.enableDlq =假

以下是该方案:

  • 使用@StreamListener注释的Consumer接收消息有效负载
  • 在从带注释的方法返回之前,使用者尝试将消息保留在数据库中
  • 数据库已关闭,并且@StreamListener带注释的方法引发了运行时异常

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

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

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

1 个答案:

答案 0 :(得分:1)

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

将maxAttempts设置为无穷大的问题是当发生不可恢复的错误时,您的监听器会尝试反复使用该消息。

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