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

使用場景:設想這樣一個情景:想分析使用者在網站上的的浏覽行為。這些浏覽日志,存資料庫浪費,直接存硬碟又怕到時候操作效率低。
此時,消息系統就是一個選擇。
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個數一緻還是消費不充分怎麼辦?