Могу ли я игнорировать org.apache.kafka.common.errors.NotLeaderForPartitionExceptions?

Мой производитель 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());
}

Я ловлю NotLeaderForPartitionException в блоке catch (final ExecutionException executionException) {}.

Можно ли игнорировать это конкретное исключение?

Мое сообщение Kafka было успешно отправлено?


person Hector    schedule 28.04.2016    source источник


Ответы (1)


Если вы получили NotLeaderForPartitionException, ваши данные были не успешно записаны.

Каждый раздел темы хранится одним или несколькими посредниками (с одним лидером; остальные посредники называются последователями) в зависимости от вашего коэффициента репликации. Производитель должен отправлять новые сообщения ведущему брокеру (репликация данных на последователей происходит внутри).

Ваш клиент-производитель не подключается к правильному Брокеру, т.е. к ведомому вместо ведущего (или к посреднику, который уже даже не ведомый), и этот посредник отклоняет ваш запрос на отправку. Это может произойти, если лидер изменился, но производитель все еще имеет устаревшие кэшированные метаданные о том, какой брокер является лидером для раздела.

person Matthias J. Sax    schedule 30.04.2016
comment
Каково решение для этого? - person Vinit Gaikwad; 06.08.2018
comment
@VinitGaikwad Производитель сначала попытается повторно отправить данные внутри (и обновит свои метаданные, чтобы узнать о новом лидере, которому должны быть отправлены данные) - таким образом, приложение получит это исключение, только если все попытки исчерпаны. Следовательно, вы можете увеличить параметр конфигурации retries для производителя. Если вы хотите обработать это на уровне приложения (кажется, это второй лучший вариант по сравнению с увеличением повторных попыток производителя), вам нужно будет вызвать Producer.send() для повторной отправки данных. - person Matthias J. Sax; 06.08.2018