Apache Kafka 是高吞吐量的分佈式發布-訂閱消息系統。本文記錄 0.10.0.0 版本的關鍵配置與基本使用。
# config/server.properties host.name=192.168.1.30 advertised.host.name=192.168.1.30 # listeners=PLAINTEXT://192.168.1.30:9092 (0.10+ 建議用 listeners 替代上述兩項)
注意:未正確配置 advertised.host.name 會導致外部機器無法連接 Broker。
0.10 版本缺少 Log4j 適配器,需額外引入:
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-log4j-appender</artifactId> <version>0.10.0.0</version> </dependency>
# 啟動 Zookeeper 與 Kafka Broker 後 # 生產者 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-topic # 消費者(從頭消費) bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic my-topic --from-beginning
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("my-topic", "key", "hello kafka 0.10"));
producer.close();
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("my-topic"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
records.forEach(r -> System.out.printf("offset=%d, key=%s, value=%s%n", r.offset(), r.key(), r.value()));
}
Kafka 已高度服務化,學習重點在於:配置調優(網絡、存儲、副本)與 客戶端最佳實踐(冪等、事務、消費組再平衡)。底層原理(如 ISR、Controller 選舉)遇到具體場景再深入。