Апач Кафка LEADER_NOT_AVAILABLE

2

Я сталкиваюсь с проблемой Apache Kafka, которую я не понимаю. Я подписываюсь на тему в своем брокере под названием "тема-полученная". Это код:

protected String readResponse(final String idMessage) {
    if (props != null) {
        kafkaClient = new KafkaConsumer<>(props);
        logger.debug("Subscribed to topic-received");
        kafkaClient.subscribe(Arrays.asList("topic-received"));
        logger.debug("Waiting for reading : topic-received");
        ConsumerRecords<String, String> records =    
                       kafkaClient.poll(kafkaConfig.getRead_timeout());

        if (records != null) {
            for (ConsumerRecord<String, String> record : records) {
                logger.debug("Resultado devuelto : "+record.value());
                return record.value();
            }
        }
    }
    return null;
}

Поскольку это происходит, я отправляю сообщение в тему, полученную от другого. Код следующий:

private void sendMessageToKafkaBroker(String idTopic, String value) {
    Producer<String, String> producer = null;
    try {
        producer = new KafkaProducer<String, String>(mapProperties());
        ProducerRecord<String, String> producerRecord = new 
                   ProducerRecord<String, String>("topic-received", value);
        producer.send(producerRecord);
        logger.info("Sended value "+value+" to topic-received");
    } catch (ExceptionInInitializerError eix) {
        eix.printStackTrace();
    } catch (KafkaException ke) {
        ke.printStackTrace();
    } finally {
        if (producer != null) {
            producer.close();
        }
    }
}

В первый раз, когда я пытаюсь, с темой "тема-полученная", я получаю предупреждение, подобное этому

"WARN 13164 --- [nio-8085-exec-3] org.apache.kafka.clients.NetworkClient   :  
 Error while fetching metadata with correlation id 1 : {topic-  
 received=LEADER_NOT_AVAILABLE}"

Но если я попробую еще раз, к этой теме "тема-полученная", работает нормально, и никаких предупреждений не представлено. Во всяком случае, это не полезно для меня, потому что я должен слушать из темы и каждый раз отправлять в тему новую тему (на которую ссылается строковый идентификатор ex:.. 12Erw45-2345Saf-234DASDFasd)

Ищете LEADER_NOT_AVAILABLE в Google, некоторые ребята говорят о добавлении в server.properties следующих строк:

host.name=127.0.0.1
advertised.port=9092
advertised.host.name=127.0.0.1

Но это не работает для меня (не знаю почему).

Я попытался создать тему перед всем этим процессом с помощью следующего кода:

 private void createTopic(String idTopic) {
    String zookeeperConnect = "localhost:2181";
    ZkClient zkClient = new ZkClient(zookeeperConnect,10000,10000, 
    ZKStringSerializer$.MODULE$);
    ZkUtils zkUtils = new ZkUtils(zkClient, new 
    ZkConnection(zookeeperConnect),false);
    if(!AdminUtils.topicExists(zkUtils,idTopic)) {
        AdminUtils.createTopic(zkUtils, idTopic, 2, 1, new Properties(), 
    null);
        logger.debug("Created topic "+idTopic+" by super user");
    }
    else{
        logger.debug("topic "+idTopic+" already exists");
    }
  }

Никакой ошибки, но все же, он остается при прослушивании до таймаута.

Я просмотрел свойства брокера, чтобы проверить, есть ли какая-либо помощь, но я не нашел ничего достаточно ясного. Реквизиты, которые я использовал для чтения:

    props = new Properties();
    props.put("bootstrap.servers", kafkaConfig.getBootstrap_servers());
    props.put("key.deserializer", kafkaConfig.getKey_deserializer());
    props.put("value.deserializer", kafkaConfig.getValue_deserializer());
    props.put("key.serializer", kafkaConfig.getKey_serializer());
    props.put("value.serializer", kafkaConfig.getValue_serializer());
    props.put("group.id",kafkaConfig.getGroupId());

и, для отправки...

   Properties props = new Properties();
    props.put("bootstrap.servers", kafkaConfig.getHost() + ":" + 
    kafkaConfig.getPort());
    props.put("group.id", kafkaConfig.getGroup_id());
    props.put("enable.auto.commit", kafkaConfig.getEnable_auto_commit());
    props.put("auto.commit.interval.ms", 
    kafkaConfig.getAuto_commit_interval_ms());
    props.put("session.timeout.ms", kafkaConfig.getSession_timeout_ms());
    props.put("key.deserializer", kafkaConfig.getKey_deserializer());
    props.put("value.deserializer", kafkaConfig.getValue_deserializer());
    props.put("key.serializer", kafkaConfig.getKey_serializer());
    props.put("value.serializer", kafkaConfig.getValue_serializer());

Любая подсказка? Почему, единственный способ, которым я должен потреблять сообщения от брокера и темы, повторяет запрос после ошибки?

заранее спасибо

  • 0
    Получая сообщение из консоли Windows, я получаю исключение kafka.common.NotLeaderForPartitionException
  • 0
    Я не уверен, в чем именно заключается проблема ... Кроме того, я думаю, что это не ошибка, а просто предупреждение: WARN 13164 , верно?
Показать ещё 2 комментария
Теги:
apache-kafka
queue

1 ответ

0

Это происходит при попытке создания сообщений для темы, которая не существует

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: В некоторых установках Kafka инфраструктура может автоматически создавать тему, когда она не существует, что объясняет, почему вы видите проблему только один раз в самом начале.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню