Kafka java api-生產者程式碼

weixin_33830216發表於2018-10-05

前面做過命令列讓生產者傳送訊息,現在使用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

看到訊息在不斷增加。

相關文章