【问题标题】:Can I ignore org.apache.kafka.common.errors.NotLeaderForPartitionExceptions?我可以忽略 org.apache.kafka.common.errors.NotLeaderForPartitionExceptions 吗?
【发布时间】:2016-08-23 09:18:48
【问题描述】:

我的 Apache Kafka 生产者 (0.9.0.1) 间歇性地抛出一个

org.apache.kafka.common.errors.NotLeaderForPartitionException

我执行 Kafka 发送的代码类似于此

final Future<RecordMetadata> futureRecordMetadata = KAFKA_PRODUCER.send(new ProducerRecord<String, String>(kafkaTopic, UUID.randomUUID().toString(), jsonMessage));

try {
    futureRecordMetadata.get();
} catch (final InterruptedException interruptedException) {
    interruptedException.printStackTrace();
    throw new RuntimeException("sendKafkaMessage(): Failed due to InterruptedException(): " + sourceTableName + " " + interruptedException.getMessage());
} catch (final ExecutionException executionException) {
    executionException.printStackTrace();
    throw new RuntimeException("sendKafkaMessage(): Failed due to ExecutionException(): " + sourceTableName + " " + executionException.getMessage());
}

我在catch (final ExecutionException executionException) {} 块中捕获了NotLeaderForPartitionException

是否可以忽略此特定异常?

我的Kafka消息发送成功了吗?

【问题讨论】:

    标签: exception-handling apache-kafka kafka-producer-api


    【解决方案1】:

    如果您收到NotLeaderForPartitionException,则您的数据写入成功。

    每个主题分区由一个或多个 Broker 存储(有一个领导者;其余的代理称为追随者),具体取决于您的复制因子。生产者需要向领导者代理发送新消息(向追随者的数据复制发生在内部)。

    您的生产者客户端未连接到正确的代理,即连接到追随者而不是领导者(或连接到甚至不再是追随者的代理),并且该代理拒绝您的发送请求。如果领导者发生了变化,但生产者仍然有关于哪个代理是分区领导者的过时缓存元数据,则可能会发生这种情况。

    【讨论】:

    • 解决办法是什么?
    • @VinitGaikwad 生产者将首先在内部重试发送数据(并将刷新它的元数据以了解数据必须发送到的新领导者)——因此,只有当所有重试已用尽。因此,您可能希望增加生产者的 retries 配置参数。如果您想在应用程序级别处理它(与增加生产者重试次数相比,它似乎是第二好的选择),您需要调用 Producer.send() 重新发送数据。
    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 2019-03-21
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多