Kafka 重试如何与 request.timeout 配合使用?

Jus*_*ode 3 apache-kafka spring-boot kafka-producer-api

我已将 Producer 配置为 request.timeout.ms = 70,0000ms 和 retries=5。我怀疑这实际上是如何运作的,

在“request.timeout.ms=70,000”过期后,它会重试 5 次,或者在给定的“request.timeout.ms=70,000”内,它会以 retry.backoff.ms 值重试 5 次。

Gwe*_*ira 6

有 3 个重要配置需要注意:

  • “request.timeout.ms” - 重试单个请求的时间
  • “delivery.timeout.ms” - 完成整个发送操作的时间
  • “重试” - 当代理响应可重试错误时重试多少次。

Apache Kafka 建议设置“delivery.timeout.ms”,并将其他两个配置保留为默认值。这个想法是,作为用户,你应该担心的主要事情是你想让 Kafka 在放弃之前花多长时间来解决问题。Kafka 花费这么长时间的原因并不重要——连接、获取元数据、长队列等,唯一重要的是您愿意等待多长时间。

现在回答你的问题 - request.timeout.ms 适用于每次重试。因此 Producer 会将 recordbatch 发送到 Kafka,如果 70,000ms 后没有响应,它将认为这是一次失败并重试。请注意,大多数错误(例如 NoLeaderForPartition)将从代理返回的速度要快得多(这就是需要重试退避的原因)。

即使对于那些编写生产者的人来说,用 retries + request.timeout.ms 来推理交付时间也几乎是不可能的。因此,引入了带有非常明确契约的delivery.time.ms。