【问题标题】:Kafka Producer is not retrying after TimeoutKafka Producer 超时后未重试
【发布时间】:2019-11-26 05:22:35
【问题描述】:

间歇性(一个月一次或两次)我看到错误 org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for cart-topic-0: 5109 ms has passed since batch creation plus linger time in my logs due to which the corresponding message was not processed by Kafka Producer

尽管所有代理都已启动并且可用,但我不确定为什么会出现此错误。在此期间,即使负载也不大。

我已在 Producer 配置中将 retries 属性值设置为 10,但仍然没有重试该消息。我还需要为 Kafka 发送方法添加什么其他内容吗?我已经经历了提出的类似问题,但是对于这个错误没有正确的结论。

有人可以帮忙解决这个问题吗?

【问题讨论】:

  • 您是否弄清楚您的案例中批次过期的确切原因?

标签: spring-boot apache-kafka kafka-producer-api


【解决方案1】:

来自KIP proposal,现已解决

我们建议添加一个新的超时 delivery.timeout.ms。实施窗口包括累加器中的批处理、重试和批处理的飞行段。使用此配置,用户可以保证从发送返回时开始发送记录、失败或过期的时间上限。换句话说,我们不再重载 request.timeout.ms 来充当累加器超时的弱代理,而是引入用户可以依赖的显式超时,而不会暴露生产者的任何内部结构,例如累加器。

所以基本上,现在发布这个,您还可以为您执行的每个异步发送配置 delivery timeoutretries

【讨论】:

    【解决方案2】:

    我遇到了一个问题,即不遵守重试,但在我的特殊情况下,这是因为我们在发送时调用 get() 方法以实现同步行为。我们没有意识到这会影响重试。

    在通过各种途径调查问题时,我发现了重试错误的定义

    https://kafka.apache.org/11/javadoc/org/apache/kafka/common/errors/RetriableException.html

    让我困惑的是超时被列为重试。

    我通常会建议您检查一下您的批次交付时间是否过长,并且缓冲区中的消息是否由于数量增加而过期,但您提到数量不是特别高。

    您是否确定增加 request.timeout.ms 是否会影响发生频率?它可能更多的是治疗症状而不是原因。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2021-10-16
      • 2021-11-25
      • 2021-07-15
      相关资源
      最近更新 更多