当前位置: 首页 > 知识库问答 >
问题:

Kafka生产者无法发送消息NOT_LEADER_FOR_PARTITION异常

湛骏祥
2023-03-14

我们使用sping-cloud-stream-binder-kafka(3.0.3.RELEASE)向我们的Kafka集群(2.4.1)发送消息。时不时地,其中一个生产者线程会收到NOT_LEADER_FOR_PARTITION异常,甚至超过重试(当前设置为12,由依赖sping-retry激活)。我们限制了重试,因为我们发送了大约1kmsg/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秒

共有2个答案

柯瀚玥
2023-03-14

您需要适当的配置侦听器

我在用docker构图

services:
  zookeeper:
    container_name: zookeeper
    ports:
      - "2181:2181"
    ...
  broker-1:
    hostname: "broker-1.mydomain.com"
    ports:
      - "29091:29091"
    ...
  broker-2:
    hostname: "broker-2.mydomain.com"
    container_name: broker-2
    ports:
      - "29092:29092"

编辑每个经纪商的server.properties

经纪人-1

listeners: PRIVATE_HOSTNAME://broker-1.mydomain.com:9092,PUBLIC_HOSTNAME://broker-1.mydomain.com:29091
advertised.listeners: PRIVATE_HOSTNAME://broker-1.mydomain.com:9092,PUBLIC_HOSTNAME://broker-1.mydomain.com:29091
listener.security.protocol.map: PUBLIC_HOSTNAME:PLAINTEXT,PRIVATE_HOSTNAME:PLAINTEXT
inter.broker.listener.name: PRIVATE_HOSTNAME

经纪人-2

listeners: PRIVATE_HOSTNAME://broker-2.mydomain.com:9092, PUBLIC_HOSTNAME://broker-2.mydomain.com:29092
advertised.listeners: PRIVATE_HOSTNAME://broker-2.mydomain.com:9092, PUBLIC_HOSTNAME://broker-2.mydomain.com:29092
listener.security.protocol.map: PUBLIC_HOSTNAME:PLAINTEXT, PRIVATE_HOSTNAME:PLAINTEXT
inter.broker.listener.name: PRIVATE_HOSTNAME

重要提示:请注意,我对私有网络和公共网络使用相同的< code>hostname,因为消费者/生产者只能通过如下注册名访问kafka:

    [BrokerToControllerChannelManager broker=1 name=forwarding]: Recorded new controller, from now on will use broker broker-1.mydomain.com:9092
...
    [BrokerToControllerChannelManager broker=2 name=forwarding]: Recorded new controller, from now on will use broker broker-2.mydomain.com:9092

编辑您的主机/etc/hosts

127.0.0.1   broker-1.mydomain.com
127.0.0.1   broker-2.mydomain.com
方鸿羲
2023-03-14

“生成”和“提取”请求都发送到分区的领导副本。NotLeader对于分区除了当请求被发送到分区时会引发异常,该分区现在不是该分区的领导者副本。

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

客户端需要通过设置metadata.max.age刷新此信息。生成器配置中的ms。此标记的默认值为300000 ms

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

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

请通过发件人。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秒。我认为您应该减少这个值,然后观察行为。

 类似资料:
  • 我无法将KafkaProducer使用java从Windows(主机操作系统)上的eclipse发送到运行在Hortonworks沙箱上的kafka主题。我的java代码如下所示 当我运行这个java代码时没有错误,它只是打印消息的索引,在本例中只有0,然后终止,我无法在hortonworks沙箱的cmd接口上的console-consumer中看到0。 这是pom.xml依赖项 我可以从制片人那

  • 我有一个需要使用Kafka Console Producer发送键值消息的用例。那么如何通过命令实现这一点呢?

  • 我正在使用Spring Boot中的。Java 8 我的主要目的是,消费者不应重复使用信息。 1)调用表获取100行并将其发送到kafka 2) 假设我处理了70行(我得到了成功确认),然后Kafka宕机了(Kafka在RETRY机制计时内无法恢复) 因此,当我重新启动Spring启动应用程序时,我如何确保不再发送这70条消息。 一种选择是我可以在数据库表消息 中使用标志。 还有其他有效的方法吗?

  • 我很感激你在这方面的帮助。 我正在构建一个ApacheKafka消费者,以订阅另一个已经运行的Kafka。现在,我的问题是,当我的制作人将消息推送到服务器时。。。我的消费者没有收到。。我在打印的日志中得到以下信息: 我不确定我是否遗漏了任何重要的配置。。。但是,我可以使用WireShark看到一些来自我的服务器的消息,但是我的消费者没有消费这些消息。。。。 我的代码是示例消费者示例的精确副本:ht

  • 我有一个用例“XML文件==>Kafka主题==>Build REST API to Query”来自Kafka主题的数据。我熟悉将数据转换为Avro格式,并编写到kafka主题。 您能建议如何发布XML吗?

  • 冲突Kafka 5.0.0已安装在AWS EC2上,它有公共IP,比如54.XX.XX.XX在EC2机器上打开端口9092,0.0.0.0 在 /etc/kafka/server.properties我有advertised.listeners=PLAINTEXT://54.XX.XX.XX:9092和侦听器=PLAINTEXT://0.0.0.0:9092在 /etc/kafka/produce