我是卡夫卡的新手。我在我的本地机器上创建了一个java生成器,并在另一台机器上设置了一个Kafka代理,比如M2,在网络上(我可以ping,SSH,连接到这台机器)。在Eclipse控制台的Producer端,我得到" Message sent"。但是,当我检查机器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代理的完整主机名,它仍然存在同样的问题。
更新:我还认为Producer能够连接到Kafka代理并发送消息,但Kafka Broker不会将这些消息传递给消费者。如果我将IP地址或端口更改为Zookeeper(与Kafka Broker在同一节点上运行),并查看Zookeeper的日志,它将获取Producer ping,然后拒绝该会话。
Update2:我创建了一个Producer jar并在Machine M2上运行了这个jar,它运行起来了。因此,生产者尝试连接到Kafka代理的方式似乎有问题。还不确定是什么问题。
答案 0 :(得分:4)
我终于找到了答案,我在这里张贴以防其他人有同样的问题。在尝试远程连接时,请使用Kafka代理设置advertised.hostname。这对我有用。
答案 1 :(得分:2)
就像调试一样 - 尝试producer.send(/* record */).get();
也就是说,等待Future
方法返回的send()
的结果。可能是生产者方面有例外,它在后台被忽略了。
答案 2 :(得分:1)
您可以尝试使用以下代码来读取kafka主题的元数据信息,以查看代理是否收到了消息。这可以帮助调试。
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);