java - Kafka 生产者无法发送消息,出现 NOT_LEADER_FOR_PARTITION 异常

标签 java apache-kafka spring-cloud-stream

我们使用 spring-cloud-stream-binder-kafka (3.0.3.RELEASE) 将消息发送到我们的 Kafka 集群 (2.4.1)。生产者线程之一时不时地收到 NOT_LEADER_FOR_PARTITION 异常,甚至超过重试次数(当前设置为 12,由依赖项 spring-retry 激活)。我们限制了重试,因为我们每秒发送大约 1k 消息(每个生产者实例)并且担心缓冲区的大小。 这样我们就会经常丢失消息,这对下游消费者不利,因为我们无法简单地重现传入流量。

错误信息是


[Producer clientId=producer-5] Received invalid metadata error in produce request on partition topic-21 due to org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.. Going to request metadata update now
[Producer clientId=producer-5] Got error produce response with correlation id 974706 on topic-partition topic-21, retrying (8 attempts left). Error: NOT_LEADER_FOR_PARTITION
[Producer clientId=producer-5] Got error produce response with correlation id 974707 on topic-partition topic-21, retrying (1 attempts left). Error: NOT_LEADER_FOR_PARTITION

有什么已知的方法可以避免这种情况吗? 我们应该回到默认的 MAX_INT 重试次数吗? 为什么它不断发送到同一个代理,即使它响应 NOT_LEADER_FOR_PARTITION?

欢迎任何提示。

编辑:我们刚刚注意到代理指标 kafka_network_requestmetrics_responsequeuetimems 大约在那个时间上升,但我们看到的最大值约为 2.5 秒

最佳答案

Produce 和 Fetch 请求都会发送到分区的领导副本。 NotLeaderForPartitionException 当请求发送到当前不是该分区的leader副本的分区时抛出异常。

客户端将每个分区的领导者信息维护为缓存。缓存管理的完整流程如下所示。

enter image description here

客户端需要通过在生产者配置中设置metadata.max.age.ms来刷新此信息。该标签的默认值为300000毫秒

您可以阅读以下 Apache Kafka 文档。

https://kafka.apache.org/documentation/

请仔细检查 Sender.java 代码。

https://github.com/a0x8o/kafka/blob/master/clients/src/main/java/org/apache/kafka/clients/producer/internals/Sender.java

您将在发件人代码中找到这两条错误消息。 metadata.max.age.ms 的默认值为 3 秒。我认为你应该减少这个值,然后观察行为。

关于java - Kafka 生产者无法发送消息,出现 NOT_LEADER_FOR_PARTITION 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61798565/

相关文章:

java - 4D+ 阵列的实际应用

jvm - JRE 和 JVM 有什么区别?

apache-kafka - 我们应该使用 max.poll.records 还是 max.poll.interval.ms 来处理在 kafka 消费者中需要更长时间处理的记录?

python - NoBrokersAvailable : NoBrokersAvailable Error in Kafka

java - Java 或 C++ 是否缺少任何 OO 特性?

java - GridBagLayout 中的项目未正确对齐

hadoop - Gobblin Kafka 到 HDFS pull 作业报错

spring-boot - 消息调度异常 : Dispatcher has no subscribers

java - Spring Cloud Stream 手动偏移管理

java - 将 Spring Cloud Stream 与 Rabbitmq 结合使用,交换类型为 "headers"