我有多台服务器,从中将生成消息,并且在一台服务器上需要代理和使用者。 如果我在同一台服务器上同时运行了生产者和使用者,那么它可以正常工作,但不确定要进行哪些更改以使生产者保持独立。我不想在生产者服务器上依赖任何Zookeeper和kafka服务器,因为它们会越来越多。 我在设置KafkaProducer时尝试将引导服务器更改为代理服务器/消费者服务器(如192.168.0.1:9092),但仍然无法生成消息。不确定我缺少什么,请在这里帮助我。
producer.props
bootstrap.servers=192.168.0.1:9092
acks=all
retries=0
batch.size=16384
auto.commit.interval.ms=1000
linger.ms=0
key.serializer=org.apache.kafka.common.serialization.StringSerializer
value.serializer=org.apache.kafka.common.serialization.StringSerializer
block.on.buffer.full=true
生产者代码
public class Producer {
public static void main(String[] args) throws IOException {
// set up the producer
KafkaProducer<String, String> producer;
System.out.println("1");
try (InputStream props = Resources.getResource("producer.props").openStream()) {
Properties properties = new Properties();
properties.load(props);
producer = new KafkaProducer<>(properties);
}
try {
for (int i = 0; i < 1000000; i++) {
// send lots of messages
System.out.println("bedore send");
producer.send(new ProducerRecord<String, String>(
"fast-messages",
String.format("{\"type\":\"marker\", \"t\":%.3f, \"k\":%d}", System.nanoTime() * 1e-9, i)));
producer.send(new ProducerRecord<String, String>(
"summary-markers",
String.format("{\"type\":\"other\", \"t\":%.3f, \"k\":%d}", System.nanoTime() * 1e-9, i)));
producer.flush();
System.out.println("Sent msg number " + i);
}
System.out.println("fdone");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.printf("%s", throwable.getStackTrace());
} finally {
producer.close();
}
}
}
答案 0 :(得分:0)
不确定您遇到的问题,但似乎信息不清晰。我将尝试从理论上回答它。 生产者和消费者都是Kafka经纪人的客户。因此,只要在生产者中正确配置了代理,消息就可以毫无问题地发送到kafka服务器。消费者也是如此。通常,分别创建kafka群集(代理)以处理消息。生产者和消费者不需要运行Kafka服务器。因此,您的客户端可以在其中配置代理的情况下在任何地方运行。生产者和消费者之间没有依赖性。它们是独立的程序,负责将消息发布到Kafka集群(生产者)并从kafka集群(消费者)接收消息。生产者不依赖Zookeeper节点。 Zookeeper被Kafka服务器用作对元数据管理的依赖项。您的声明“任何依赖Zookeeper和kafka服务器在生产者服务器上的依赖关系”都是不合理的,因为生产者将使用代理配置连接到kafka服务器(引导)。