Kafka 连接什么时候需要 ZooKeeper 配置?
When does Kafka connection require ZooKeeper config?
Kafka console consumer 似乎需要您指定要连接的 ZooKeeper 实例:
./kafka-console-consumer.sh --zookeeper myzk.example.com:2181 --topic mytopic
但显然可以通过 Java API:
直接连接到 Kafka 代理
public class KafkaClient {
public static void main(String[] args) {
String topic = "mytopic";
Properties props = new Properties();
props.put("bootstrap.servers", "kafka.example.com:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);
Callback cb = new Callback() {
@Override
void onCompletion(RecordMetadata rdata, Exception exc) {
if(exc) {
throw exc;
}
}
}
producer.send(new ProducerRecord<String, String>(topic, 'somekey', 'someval'), cb);
producer.close();
}
}
有没有办法在不指定 ZK 节点的情况下 运行 消费者?如果不是,为什么?
这取决于使用的是哪个版本的消费者 API。从最新的 Kafka 版本 0.10.1 开始,直接针对代理的新 API 是控制台消费者使用的默认值。 0.10.1 之前的版本默认为旧的 API 目标 Zookeeper,但可以通过指定参数设置为使用新的消费者 API 作为控制台消费者,例如:--new-consumer
和 --bootstrap-server someBroker:9092
使用命令。
Kafka console consumer 似乎需要您指定要连接的 ZooKeeper 实例:
./kafka-console-consumer.sh --zookeeper myzk.example.com:2181 --topic mytopic
但显然可以通过 Java API:
直接连接到 Kafka 代理public class KafkaClient {
public static void main(String[] args) {
String topic = "mytopic";
Properties props = new Properties();
props.put("bootstrap.servers", "kafka.example.com:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);
Callback cb = new Callback() {
@Override
void onCompletion(RecordMetadata rdata, Exception exc) {
if(exc) {
throw exc;
}
}
}
producer.send(new ProducerRecord<String, String>(topic, 'somekey', 'someval'), cb);
producer.close();
}
}
有没有办法在不指定 ZK 节点的情况下 运行 消费者?如果不是,为什么?
这取决于使用的是哪个版本的消费者 API。从最新的 Kafka 版本 0.10.1 开始,直接针对代理的新 API 是控制台消费者使用的默认值。 0.10.1 之前的版本默认为旧的 API 目标 Zookeeper,但可以通过指定参数设置为使用新的消费者 API 作为控制台消费者,例如:--new-consumer
和 --bootstrap-server someBroker:9092
使用命令。