【问题标题】:Kafka producer fails to send messages with NOT_LEADER_FOR_PARTITION exceptionKafka 生产者无法发送带有 NOT_LEADER_FOR_PARTITION 异常的消息
【发布时间】:2020-08-31 01:24:49
【问题描述】:

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

错误信息是


[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 秒

【问题讨论】:

  • 你能更新你的发现吗?

标签: java apache-kafka spring-cloud-stream


【解决方案1】:

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

客户端将每个分区的leader信息作为缓存进行维护。缓存管理的完整流程如下图所示。

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

【讨论】:

  • 感谢有关 metadata.max.age.ms 的提示,但显示错误的日志消息还显示“Going to request metadata update now”,这意味着它没有等待间隔结束,但现在请求新的元数据。不幸的是,重试似乎不受此影响......
  • 从日志中添加了另外 2 行。似乎重试期间的错误甚至不会触发元数据更新,但只有在超过重试并且异常再次出现时才会触发......
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多