【问题标题】:What happens when consumer maxAttempts is reached?当达到消费者 maxAttempts 时会发生什么?
【发布时间】:2017-07-13 23:23:37
【问题描述】:

使用以下配置和场景,达到 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注解接收消息载荷
  • 在从带注释的方法返回之前,消费者尝试将消息持久化到数据库中
  • 数据库已关闭,@StreamListener 注解的方法抛出运行时异常

我看到的行为是消费者重试消息,直到达到 maxAttempts 限制。然后什么都没有发生,直到我重新启动服务。重新启动后,消息将被重新使用。

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

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

【问题讨论】:

    标签: spring-cloud-stream


    【解决方案1】:

    这确实是预期的行为,因为您设置为不自动提交错误消息。发生的情况是,这使客户端有机会从上次提交的偏移量重播。

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 2020-07-19
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2018-01-15
      • 2019-03-26
      相关资源
      最近更新 更多