Кафка: нет сообщения, увиденного на консольном потребителе после сообщения, отправленного производителем 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);