天天看點

Kafka(分布式釋出訂閱消息系統)1.元件2.常用類3.消息傳遞特點4. partition 的個數考慮5.帶弄懂

http://kafka.apache.org/

目前越來越多的開源分布式處理系統如apache storm、spark都支援與kafka內建。

Kafka(分布式釋出訂閱消息系統)1.元件2.常用類3.消息傳遞特點4. partition 的個數考慮5.帶弄懂

使用場景:設想這樣一個情景:想分析使用者在網站上的的浏覽行為。這些浏覽日志,存資料庫浪費,直接存硬碟又怕到時候操作效率低。

此時,消息系統就是一個選擇。

broker

['brəʊkə] n.經紀人

kafka叢集包含一個或多個伺服器,這種伺服器被稱為broker。

topic

每條釋出到kafka叢集的消息都有一個類别,這個類别被稱為topic。

partition

每個topic包含一個或多個partition。

producer

生産者,負責釋出消息到kafka broker。

consumer

消費者,從kafka broker讀取消息的用戶端。

consumer group

每個consumer屬于一個特定的consumer group。

kafka.javaapi.consumer.consumerconnector

kafka消費者的連接配接資訊。

consumerconnector kafka.consumer.consumer.createjavaconsumerconnector(consumerconfig arg0)

建立consumerconnector。

map<string, list<kafkastream<byte[], byte[]>>> kafka.javaapi.consumer.consumerconnector.createmessagestreams(map<string, integer> topiccountmap)

根據制定的map建立

kafka.consumer.kafkastream<byte[], byte[]>

kafka消息流。

kafka.consumer.consumeriterator<byte[], byte[]>

kafka消費者的疊代器。

messageandmetadata<byte[], byte[]>

kafka消息。

byte[] kafka.message.messageandmetadata.message()

得到messageandmetadata中的資訊。

kafka.javaapi.producer.producer<integer, string>

kafka生産者。

kafka.javaapi.producer.producer.producer<integer, string>(producerconfig arg0)

producer的構造函數。

kafka.producer.producerconfig

producer配置。

kafka.producer.producerconfig.producerconfig(properties arg0)

producerconfig的構造函數。

void kafka.javaapi.producer.producer.send(keyedmessage<integer, string> arg0)

kafka生産者發送消息。

1. kafka對消息的重複、丢失、錯誤以及順序沒有嚴格的要求。

2. kafka提供at-least-once delivery,即當consumer當機後,有些消息可能會被重複delivery。

3. 因每個partition隻會被同一consumer group内的一個consumer消費,故kafka保證每個partition内的消息會被順序的訂閱。

4. kafka為每條消息為每條消息計算crc校驗,用于錯誤檢測,crc校驗不通過的消息會直接被丢棄掉。

5.增減consumer,broker,partition會導緻rebalance,是以rebalance後consumer對應的partition會發生變化。

a) 如果consumer比partition多,是浪費,因為kafka的設計是在一個partition上是不允許并發的,是以consumer數不要大于partition數。

b) 如果consumer比partition少,一個consumer會對應于多個partitions,這裡主要合理配置設定consumer數和partition數,否則會導緻partition裡面的資料被取的不均勻。

a)server怎麼辨別不同的consumer?是zk自己配置設定編号,還是consumer構造函數的參數指定?

b) 何為一個consumer?程序還是線程還是别的什麼?

c)consumer所在機器性能低,個數與partition個數一緻還是消費不充分怎麼辦?