Kafka java api-生產者程式碼
前面做過命令列讓生產者傳送訊息,現在使用java api來進行訊息的生產,以及解釋kafka高效能是如何實現(來源於學習資料)。
使用shell建立topic和傳送訊息如下:
#引數:zookeeper連線地址和埠號,副本數(包括自身),使用幾個partition,topic的名稱
[root@mini1 bin]# ./kafka-topics.sh --create --zookeeper mini1:2181 --replication-factor 2 --partitions 3 --topic orderMq
Created topic "orderMq".
[root@mini1 bin]# kafka-console-producer.sh --broker-list mini1:9092 --topic orderMq
hello tom
hi jerry
spring
hhaah
xixi
nini
下面使用java api來傳送訊息
注:如果topic已經存在那麼肯定就不建立了,但是不存在則會建立。
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.8.2</artifactId>
<version>0.8.1</version>
</dependency>
</dependencies>
public class KafkaProducerSimple {
public static void main(String[] args) {
/**
* 1、指定當前kafka producer生產的資料的目的地
* 建立topic可以輸入以下命令,在kafka叢集的任一節點進行建立。
* bin/kafka-topics.sh --create --zookeeper mini1:2181 --replication-factor 2 --partitions 3 --topic test
*/
String TOPIC = "orderMq";
/**
* 2、讀取配置檔案
*/
Properties props = new Properties();
/*
* key.serializer.class預設為serializer.class key的序列化使用哪個類
*/
props.put("serializer.class", "kafka.serializer.StringEncoder");
/*
* kafka broker對應的主機,格式為host1:port1,host2:port2
*/
props.put("metadata.broker.list", "mini1:9092,mini2:9092,mini3:9092");
/*
* request.required.acks,設定傳送資料是否需要服務端的反饋,有三個值0,1,-1
* 0,意味著producer永遠不會等待一個來自broker的ack,這就是0.7版本的行為。
* 這個選項提供了最低的延遲,但是持久化的保證是最弱的,當server掛掉的時候會丟失一些資料。
* 1,意味著在leader replica已經接收到資料後,producer會得到一個ack。
* 這個選項提供了更好的永續性,因為在server確認請求成功處理後,client才會返回。
* 如果剛寫到leader上,還沒來得及複製leader就掛了,那麼訊息才可能會丟失。
* -1,意味著在所有的ISR都接收到資料後,producer才得到一個ack。
* 這個選項提供了最好的永續性,只要還有一個replica存活,那麼資料就不會丟失
*/
props.put("request.required.acks", "1");
/*
* 可選配置,如果不配置,則使用預設的partitioner partitioner.class
* 預設值:kafka.producer.DefaultPartitioner
* 用來把訊息分到各個partition中,預設行為是對key進行hash。
*/
props.put("partitioner.class", "com.scu.kafka.MyLogPartitioner");
// props.put("partitioner.class", "kafka.producer.DefaultPartitioner");
/**
* 3、通過配置檔案,建立生產者
*/
Producer<String, String> producer = new Producer<String, String>(new ProducerConfig(props));
/**
* 4、通過for迴圈生產資料
*/
for (int messageNo = 1; messageNo < 100000; messageNo++) {
/**
* 5、呼叫producer的send方法傳送資料
* 注意:這裡需要指定 partitionKey,用來配合自定義的MyLogPartitioner進行資料分發
*/
producer.send(new KeyedMessage<String, String>(TOPIC, messageNo + "", "appid" + UUID.randomUUID() + "itcast"));
}
}
}
public class MyLogPartitioner implements Partitioner {
private static Logger logger = Logger.getLogger(MyLogPartitioner.class);
public MyLogPartitioner(VerifiableProperties props) {
}
/**
*
* @param obj 傳來的key 用它來進行hash分到partition
* @param numPartitions 幾個partition 如果叢集中已存在該topic,那麼partition數為原本存在數,否則預設是2
* @return 生產到哪個partition
*/
public int partition(Object obj, int numPartitions) {
//使用下面被註釋掉的程式碼,則類似於hadoop的partition分發方式,hash取模去發到對應序號的partition,這裡使用1則表示傳送到orderMQ-1的topic
// return Integer.parseInt(obj.toString())%numPartitions;
return 1;
}
}
啟動kafka叢集,執行main方法,去叢集中檢視。
[root@mini1 orderMQ-1]# ll
總用量 14296
-rw-r--r--. 1 root root 10485760 11月 22 07:53 00000000000000000000.index
-rw-r--r--. 1 root root 14610099 11月 22 07:53 00000000000000000000.log
[root@mini1 orderMQ-1]# ll
總用量 14696
-rw-r--r--. 1 root root 10485760 11月 22 07:53 00000000000000000000.index
-rw-r--r--. 1 root root 15012813 11月 22 07:53 00000000000000000000.log
[root@mini1 orderMQ-1]# ll
總用量 15184
-rw-r--r--. 1 root root 10485760 11月 22 07:53 00000000000000000000.index
-rw-r--r--. 1 root root 15513339 11月 22 07:53 00000000000000000000.log
[root@mini1 orderMQ-1]# ll
總用量 15448
-rw-r--r--. 1 root root 10485760 11月 22 07:53 00000000000000000000.index
-rw-r--r--. 1 root root 15783297 11月 22 07:53 00000000000000000000.log
[root@mini1 orderMQ-1]# ll
總用量 16288
-rw-r--r--. 1 root root 10485760 11月 22 07:53 00000000000000000000.index
-rw-r--r--. 1 root root 16643559 11月 22 07:53 00000000000000000000.log
[root@mini1 orderMQ-1]# ll
總用量 16600
-rw-r--r--. 1 root root 10485760 11月 22 07:53 00000000000000000000.index
-rw-r--r--. 1 root root 16961019 11月 22 07:53 00000000000000000000.log
看到訊息在不斷增加。
相關文章
- Kafka原始碼分析(二) - 生產者Kafka原始碼
- Kafka 生產者解析Kafka
- java的kafka生產消費JavaKafka
- MySQL-To-JSON的Kafka生產者MySqlJSONKafka
- 從原始碼分析如何優雅的使用 Kafka 生產者原始碼Kafka
- java編寫生產者/消費者模式的程式。Java模式
- 「Kafka應用」PHP實現生產者與消費者KafkaPHP
- Kafka的生產者優秀架構設計Kafka架構
- [Java併發程式設計實戰] 阻塞佇列 BlockingQueue(含程式碼,生產者-消費者模型)Java程式設計佇列BloC模型
- 插曲:Kafka的生產者案例和消費者原理解析Kafka
- SpringBoot整合Kafka(生產者和消費者都是SpringBoot服務)Spring BootKafka
- 生產者消費者問題-C++程式碼實現C++
- Kafka入門(3):Sarama生產者是如何工作的Kafka
- springboot整合整合kafka-生產者監聽器ProducerListenerSpring BootKafka
- kafka生產者和消費者吞吐量測試-kafka 商業環境實戰Kafka
- Java實現生產者和消費者Java
- 深入理解Kafka核心設計及原理(二):生產者Kafka
- 插曲:Kafka的生產者原理及重要引數說明Kafka
- kafka_2.11-0.10.2.1 的生產者 消費者的示例(new producer api)KafkaAPI
- kafka消費者提交方式(程式碼演示)Kafka
- java實現生產者消費者問題Java
- edenhill/kcat:通用命令列非 JVM Apache Kafka 生產者和消費者命令列JVMApacheKafka
- Java多執行緒——生產者消費者示例Java執行緒
- Kafka 架構圖-輕鬆理解 kafka 生產消費Kafka架構
- 以PHP視角探尋Kafka - 實現簡易生產者功能PHPKafka
- python中多程式消費者生產者問題Python
- 《Kafka實戰》之生產者API使用(引數解釋超詳細)KafkaAPI
- Kafka程式碼解析Kafka
- 生產者消費者
- 程式碼生 成器:程式設計師生產力快速提升工具程式設計師
- 【生產者原始碼分析系列第八篇】圖解 Kafka 原始碼之 Sender 執行緒架構設計原始碼圖解Kafka執行緒架構
- golang 併發程式設計之生產者消費者Golang程式設計
- kafka生產環境規劃-kafka 商業環境實戰Kafka
- 生產消費實現-寫程式碼
- LR.Java低程式碼平臺,解放前後端生產力Java後端
- kafka生產者Producer引數設定及引數調優建議-kafka 商業環境實戰Kafka
- 生產者消費者模型模型
- 生產者消費者模式模式