【问题标题】:Kafka: Exception while producing records on Kafka topicKafka:在 Kafka 主题上生成记录时出现异常
【发布时间】:2017-03-14 15:41:21
【问题描述】:

我在 Kafka 主题上生成记录时遇到异常:

java.lang.RuntimeException: This server is not the leader for that topic-partition.

下面是发送记录到 Kafka 主题的代码。

AtomicReference<Exception> exRef = new AtomicReference<>();
while([some condition]) {
    producer.send(new ProducerRecord<>(topic, message), (metadata, exception) -> {
        if (exception != null) {
            exRef.set(exception);
        }
    });
    if (exRef.get() != null) {
        throw new RuntimeException(exRef.get().getMessage(), exRef.get().getCause());
    }
}

我只需要知道这个异常的原因是什么?如何预防?

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    每个主题分区都有一个领导代理,负责为来自客户端的所有读/写请求提供服务(如果复制大于一个,则多个跟随代理仅从领导代理复制此分区的数据,但不服务来自客户端的任何读/写请求)。在客户端启动时,客户端会查询集群以获取它需要读取/写入的每个分区的领导者,并缓存此元数据。

    由于不同的原因(例如,broker 宕机——恢复后它可能不是不再是领导者,而是成为追随者,因为不需要将领导权转移回来——或者如果发出管理员命令,则将分区移动到不同的代理。

    如果发生这种情况,客户端的元数据将不再正确,您会得到相应的异常。因此,从客户的角度来看,您无法阻止这种情况发生。但是,您可以简单地创建一个新的客户端实例,该实例将重新发现新的领导者,您的应用可以从那里恢复。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 2018-11-18
      • 2018-06-15
      • 1970-01-01
      相关资源
      最近更新 更多