Кафка: нет сообщения, увиденного на консольном потребителе после сообщения, отправленного производителем Java

Я новичок в Кафку. Я создал производителя java на своей локальной машине и настроил брокера Kafka на другой машине, скажем M2, в сети(я могу пинговать,SSH, подключаться к этой машине). На стороне производителя в консоли Eclipse, я получаю "сообщение отправлено". Но когда я проверяю потребителя консоли на машине M2, я не вижу этих сообщений.

мой код производителя java:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;


import java.util.HashMap;
import java.util.Map;

public class KafkaMessageProducer  {

    /**
     * @param args
     */
    public static void main(String[] args) {

        KafkaMessageProducer reportObj = new KafkaMessageProducer();
        reportObj.send();

    }

    public void send(){

        Map<String, Object> config = new HashMap<String, Object>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "135.113.133.60:9092");
        config.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        config.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(config);
        int maxMessages = 5;
        int count = 0;
        while(count < maxMessages){
            producer.send(new ProducerRecord<String, String>("test", "msg", "message --- #"+count++));
            System.out.println("Message send.."+count);
        }
        producer.close();
    }

}

пожалуйста, дайте мне знать, где я иду не так? Я могу отправлять сообщения локально на машине M2 от производителя консоли. Примечание: даже когда я меняю IP-адрес на полное имя хоста брокера Kafka, у него все еще есть та же проблема.

Update: я также думаю, что производитель может подключиться к брокеру Kafka и отправлять сообщения, но Брокер Kafka не передает эти сообщения потребителю. Если я изменяю IP-адрес или порт на Zookeeper(который работает на том же узле, что и брокер Kafka), и вижу журнал Zookeeper, он получает пинг производителя, а затем отклоняет сессия.

Update2: я создал банку производителя и запустил эту банку на машине M2, и она работала. Таким образом, кажется, что есть что-то неправильное в том, как продюсер пытается подключиться к брокеру Кафки. Пока не знаю, в чем проблема.

3 ответов


Я, наконец, нашел ответ, и я публикую здесь, Если у кого-то еще есть такая же проблема. Используйте объявленный параметр брокера Kafka.имя хоста при попытке удаленного подключения. Это сработало для меня.


просто как идея для отладки - попробовать producer.send(/* record */).get(); То есть дождитесь результата от Future вернулся из send() метод. Может быть, на стороне производителя есть исключение, и оно просто игнорируется в фоновом режиме.


вы можете попробовать использовать код следующим образом, чтобы прочитать информацию метаданных для раздела Кафка, чтобы увидеть, получил ли брокер сообщения. Это может помочь отладке.

SimpleConsumer consumer = new SimpleConsumer(broker.host(), broker.port(), 100000,
      64 * 1024, "your_group_id");
List<String> topics = new ArrayList<>();
topics.add(topic);
TopicMetadataRequest req = new TopicMetadataRequest(topics);

TopicMetadataResponse resp = simpleConsumer.send(req);
if (resp.topicsMetadata().size() != 1) {
  throw new RuntimeException("Expected one metadata for topic "
      + topic + " found " + resp.topicsMetadata().size());
}

TopicMetadata topicMetaData = resp.topicsMetadata().get(0);