Kafka 簡介
準(zhǔn)備寫一個Kafka系列,用于了解分布式消息系統(tǒng)的架構(gòu)。
在大數(shù)據(jù)的時代, 所有的信息都是有用的(用戶行為data, 應(yīng)用性能記錄,日志文件,事件消息等等),所以相應(yīng)的對于消息中間件也產(chǎn)生其他的需求:
a. 基本保證,需要持續(xù)化消息,任何消息都不能丟失,并且可以存儲大量的消息。
b. 面對大量的client,可以支持相當(dāng)高的并發(fā)查詢和寫入
c. 分布式部署,可以橫向擴(kuò)展
d. 實(shí)時性,producer產(chǎn)生了消息,consumer必須立刻可以查看。
針對這樣的一些需求,Kafka就孕育而生了。下面kafka簡單消費(fèi)者生產(chǎn)者的圖

Kafka Architecture
首先簡單介紹Kafka幾個關(guān)鍵的組件:
Topic: topic可以簡單理解消息的一個分類, producer發(fā)送消息和consumer消費(fèi)消息都會依賴這個topic, topic可以分為多個partition, partition可以理解一個topic消息的量太大,對它進(jìn)行拆分,這樣就可以提高并發(fā)消費(fèi)的能力。
Broker: 一個kafka的集群含有多個server, 每個server就含有一個或者多個broker, 每次topic的創(chuàng)建都會有與broker相關(guān),每次produer發(fā)布消息和consumer消費(fèi)消息都會跟broker打交道。
Producer: Produer發(fā)布消息針對某個topic,會選擇這個topic里面的一個合適的partition,進(jìn)行發(fā)送。
Consumer: Consumer就是注冊某個topic, 然后接受發(fā)布的消息
ZooKeeper: ZooKeeper用來協(xié)調(diào)Broker和consumers, 并且管理broker和consumer存活。
kafka可以部署多種cluster模式:
單個節(jié)點(diǎn) —> 單個broker cluster
單個節(jié)點(diǎn) —> 多個broker cluster
多個節(jié)點(diǎn) —> 多個broker cluster

Kafka 重要模塊簡介
Partition
首先來看看重要的Partition,
針對Kafka的topic, Partition就是map到的一個邏輯log,這個log由多個segment file組成的,每個partition都含有有序的,一組不可變的消息。當(dāng)一個消息從producer發(fā)送到partition的時候,broker就會把這個message加到最后一個segment里面。當(dāng)達(dá)到了一定message的時候或者一定的時間,就會把segment flush到磁盤,一旦segment被flush了,這時候consumer就可以去消費(fèi)了。
所有Partition里面的message, 都被賦值了一個offset, 用來唯一標(biāo)識一個message在partition里面.
每個Partion可以配置多個replicated在多個server間用來做fault tolerance.
每個Partition要么充當(dāng)著 leader, 或者 充當(dāng)著 follwers的角色,leader就全心全意地負(fù)責(zé)讀寫請求,然而follower則是異步地從leader那邊同步信息過來。
Kafka動態(tài)維護(hù)一個ISR(in-sync replicas)的集合,這種ISR里面partition幾乎都是和leader同步,如果follower掛掉了或者沒有跟leader及時同步,則會從in-sync里面移除。
當(dāng)一條消息提交,意味著所有in-sync里面的follwoer都同步了,這意味著無需擔(dān)心leader掛掉,數(shù)據(jù)丟失的情況。當(dāng)然producer是可以選擇是否等待消息提交。
當(dāng)leader當(dāng)?shù)舻臅r候,在ISR里面的follower就會自動變成新的leader,這個ISR的信息就是維護(hù)在zookeeper里面的,zookeeper隨時監(jiān)控著這些partition的生存情況。
Consumer
Kafka Consumer的設(shè)計(jì)根據(jù)傳統(tǒng)的消息平臺consumer, consumer group都一樣。
每個topic的消息都會被一個consumer groups里面的consumer消費(fèi),意識說一個consumer group里面有多的consumer的時候,只會有一個consumer接受到一個topic消息。如果想要一個topic的消息被多個consumer消費(fèi),那么這個consumer需要在不同的consumer group里面。
consumer總是從一個特定的partition里面順序的消費(fèi),然后保存一個offset,來顯示這個consumer消費(fèi)了多少的消息。根據(jù)Kafka的設(shè)計(jì),broker是無狀態(tài)的,所以任何消費(fèi)的信息都是保存在consumer端的,broker并不保存這條記錄被誰消費(fèi)。
所以Kafka有以下三種消息保證:
消息不會被重發(fā),但是可能丟失
消息可以能被重發(fā),但是絕不丟失
消息且只會被發(fā)送一次
假設(shè)consumer處理消息分為三個階段,讀取消息,處理消息,然后保存更新offset,