超时后,Kafka Producer不再重试

时间:2019-07-17 11:27:03

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

间歇性地(每月一次或两次),我看到了错误    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 send方法,我还需要添加其他内容吗?我已经经历了提出的类似问题,但是没有针对此错误的正确结论。

请有人帮忙解决此问题。

2 个答案:

答案 0 :(得分:1)

KIP proposal(现在已解决)

我们建议添加新的超时delivery.timeout.ms。强制执行窗口包括在累加器中进行批处理,重试以及该批处理的进行中部分。使用此配置,用户可以保证记录从发送返回点开始发送,失败或过期的时间上限。换句话说,我们不再重载request.timeout.ms来充当累加器超时的弱代理,而是引入了一个明确的超时,用户可以依赖该超时,而不会暴露生产者的任何内部情况,例如累加器。

因此,基本上,现在发布此消息,您还可以为您执行的每个异步发送配置传递超时重试

答案 1 :(得分:0)

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

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

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

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

我通常建议您调查批量交付时间是否太长,以及由于数量增加而导致缓冲区中的消息即将到期,但是您已经提到数量不是特别高。

您是否确定增加request.timeout.ms是否对发生频率有影响?