首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kafka producer发送消息失败,出现NOT_LEADER_FOR_PARTITION异常

Kafka producer发送消息失败,出现NOT_LEADER_FOR_PARTITION异常
EN

Stack Overflow用户
提问于 2020-05-14 21:27:08
回答 1查看 3.4K关注 0票数 1

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

错误消息是

代码语言:javascript
复制
[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进行响应?

欢迎任何提示。

编辑:我们刚刚注意到broker指标kafka_network_requestmetrics_responsequeuetimems在这段时间左右上升,但我们看到的最大值约为2.5s

EN

回答 1

Stack Overflow用户

发布于 2020-05-15 00:35:22

产生和获取请求都被发送到分区的前导副本。NotLeaderForPartitionException当请求被发送到分区,而不是分区的前导副本时,会抛出异常。

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

客户端需要通过在生产者配置中设置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秒。我认为你应该减少这个值,然后观察它的行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61798565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档