上一篇文章簡單的講了搭建kafka的環境以及如何啓動。
現在來講講kafka的簡單使用,然後使用java寫個小的測試程序。
首先假設你已經啓動了kafka集羣,我們來創建一個topic,使用如下命令:
bin/kafka-topics.sh --create --zookeeper 192.168.1.3:2181,192.168.1.128:2181,192.168.130:2181 --replication-factor 3 --partitions 1 --topic mr-yang
192.168.1.3:2181,192.168.1.128:2181,192.168.130:2181
是我的zk集羣IP,mr-yang
爲topic名稱。
然後我們使用如下命令查看topic的一些信息:
bin/kafka-topics.sh --describe --zookeeper 192.168.1.3:2181,192.168.1.128:2181,192.168.130:2181 --topic mr-yang
結果如下:
以下是輸出內容的解釋,第一行是所有分區的概要信息,之後的每一行表示每一個partition的信息。因爲目前我們只有一個partition,因此關於partition的信息只有一行。
leader節點負責給定partition的所有讀寫請求。如果一個topic有多個partitions,那麼每個節點都會其中一部分partition的leader。
replicas 表示某個partition在哪幾個broker上存在備份。不管這個幾點是不是”leader“,甚至這個節點掛了,也會列出。
isr 是replicas的一個子集,它只列出當前還存活着的,並且備份了該partition的節點。
現在開始使用java編寫測試程序,首先引入maven依賴。
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
程序分爲兩部分,一個是生產,一個是消費者,請先啓動消費者程序,如下:
生產者代碼:
/**
* kafka生產者
* @author yangyaming
*/
public class MyProducer {
public static void main(String args[]){
Properties props = new Properties();
props.put("bootstrap.servers", "192.168.1.3:9092,192.168.1.128:9092,192.168.1.130: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);
for (int i = 0; i < 100; i++){
/**
* ProducerRecord 參數解析
* 第一個:mr-yang爲生產者 topic名稱,
* 第二個:對於生產者kafka2.0需要你指定一個key,在企業應用中,我們一般會把他當做businessId來用,比如訂單ID,用戶ID等等。
* 第三個:消息的主要信息
*/
producer.send(new ProducerRecord<String, String>("mr-yang", Integer.toString(i), Integer.toString(i)));
}
producer.close();
}
}
消費者代碼如下,具體詳細註釋見代碼註釋
/**
* kafka消費者
*/
public class MyConsumer {
public static void main(String args[]){
Properties props = new Properties();
/** kafka集羣ip **/
props.put("bootstrap.servers", "192.168.1.3:9092,192.168.1.128:9092,192.168.1.130:9092");
/** 由於kafka有消費組的概念,每個消費者要制定一個group **/
props.put("group.id", "test");
/** 我們這裏使用kafka high level模式,自動提交offset**/
props.put("enable.auto.commit", "true");
/** 自動提交的時間間隔 **/
props.put("auto.commit.interval.ms", "1000");
/** 制定key合value的序列化方式,這裏制定的是kafka的字符串序列化 **/
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("mr-yang"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
}
}
程序運行結果:
具體的java文檔如下:
kafka2.0 producer javadoc
http://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html
kafka2.0 consumer javadoc
http://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html