1. 程式人生 > >Kafka(分散式釋出訂閱訊息系統)

Kafka(分散式釋出訂閱訊息系統)

http://kafka.apache.org/

目前越來越多的開源分散式處理系統如Apache Storm、Spark都支援與Kafka整合。

微笑使用場景:設想這樣一個情景:想分析使用者在網站上的的瀏覽行為。這些瀏覽日誌,存資料庫浪費,直接存硬碟又怕到時候操作效率低。
此時,訊息系統就是一個選擇。


1.元件

Broker
['brəʊkə] n.經紀人
Kafka叢集包含一個或多個伺服器,這種伺服器被稱為broker。
Topic
每條釋出到Kafka叢集的訊息都有一個類別,這個類別被稱為Topic。
Partition
每個Topic包含一個或多個Partition。
Producer
生產者,負責釋出訊息到Kafka broker。
Consumer

消費者,從Kafka broker讀取訊息的客戶端。
Consumer Group

每個Consumer屬於一個特定的Consumer Group。

2.常用類

2.1消費者

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中的資訊。

2.2生產者

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生產者傳送訊息。

3.訊息交付特點

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會發生變化。

4. partition 的個數考慮

a) 如果consumer比partition多,是浪費,因為kafka的設計是在一個partition上是不允許併發的,所以consumer數不要大於partition數。
b) 如果consumer比partition少,一個consumer會對應於多個partitions,這裡主要合理分配consumer數和partition數,否則會導致partition裡面的資料被取的不均勻。

5.帶弄懂

a)server怎麼標識不同的consumer?是zk自己分配編號,還是consumer建構函式的引數指定? b) 何為一個consumer?程序還是執行緒還是別的什麼? c)consumer所在機器效能低,個數與partition個數一致還是消費不充分怎麼辦?