kafka做爲一個集羣運行在一個或多個服務器上。kafka集羣存儲的消息是以topic爲類別記錄的。每一個消息(也叫記錄record,我習慣叫消息)是由一個key,一個value和時間戳構成。算法
不管是kafka集羣,仍是producer和consumer都依賴於zookeeper來保證系統可用性集羣保存一些meta信息。數據庫
Client和Server之間的通信,是經過一條簡單、高性能而且和開發語言無關的TCP協議服務器
Topic併發
Producerapp
Consumer分佈式
Broker性能
一個Topic能夠認爲是一類消息,每一個topic將被分紅多個partition(區),每一個partition在存儲層面是append log文件。任何發佈到此partition的消息都會被直接追加到log文件的尾部,每條消息在文件中的位置稱爲offset(偏移量),offset爲一個long型數字,它是惟一標記一條消息。它惟一的標記一條消息。kafka並無提供其餘額外的索引機制來存儲offset,由於在kafka中幾乎不容許對消息進行「隨機讀寫」。每個分區都是一個順序的、不可變的消息隊列.設計
Kafka集羣保持全部的消息,直到它們過時, 不管消息是否被消費了。日誌文件將會根據broker中的配置要求,保留必定的時間以後刪除, 實際上消費者所持有的僅有的元數據就是這個偏移量,也就是消費者在這個log中的位置。 這個偏移量由消費者控制:正常狀況當消費者消費消息的時候,偏移量也線性的的增長。可是實際偏移量由消費者控制,消費者能夠將偏移量重置爲更老的一個偏移量,從新讀取消息。 能夠看到這種設計對消費者來講操做自如, 一個消費者的操做不會影響其它消費者對此log的處理。3d
partitions的設計目的有多個.最根本緣由是kafka基於文件存儲.經過分區,能夠將日誌內容分散到多個server上,來避免文件尺寸達到單機磁盤的上限,每一個partiton都會被當前server(kafka實例)保存;能夠將一個topic切分多任意多個partitions,來消息保存/消費的效率.此外越多的partitions意味着能夠容納更多的consumer,有效提高併發消費的能力代理
一個Topic的多個partitions,被分佈在kafka集羣中的多個server上;每一個server(kafka實例)負責partitions中消息的讀寫操做;此外kafka還能夠配置partitions須要備份的個數(replicas),每一個partition將會被備份到多臺機器上,以提升可用性.
基於replicated方案,那麼就意味着須要對多個備份進行調度;每一個partition都有一個server爲"leader";leader負責全部的讀寫操做,若是leader失效,那麼將會有其餘follower來接管(成爲新的leader);follower只是單調的和leader跟進,同步消息便可..因而可知做爲leader的server承載了所有的請求壓力,所以從集羣的總體考慮,有多少個partitions就意味着有多少個"leader",kafka會將"leader"均衡的分散在每一個實例上,來確保總體的性能穩定.
生產者往某個Topic上發佈消息。生產者也負責選擇發佈到Topic上的哪個分區。最簡單的方式從分區列表中輪流選擇。也能夠根據某種算法依照權重選擇分區。開發者負責如何選擇分區的算法。
一般來說,消息模型能夠分爲兩種, 隊列和發佈-訂閱式。
消費者組
更通用的, 咱們能夠建立一些消費者組做爲邏輯上的訂閱者。每一個組包含數目不等的消費者, 一個組內多個消費者能夠用來擴展性能和容錯。正以下圖所
Kafka採用了一種分而治之的策略:分區。 由於Topic分區中消息只能由消費者組中的惟一一個消費者處理 ,因此消息確定是按照前後順序進行處理的。可是它也僅僅是保證Topic的一個分區順序處理,不能保證跨分區的消息前後處理順序。
如上圖所示
2個kafka集羣託管4個分區(P0-P3)
2個消費者組,消費組A有2個消費者實例,消費組B有4個
按照以上說法,同一個組中的消費者不能消費同一個分區
全部發布消息到消息隊列和消費分離的系統,實際上都充當了一個存儲系統(發佈的消息先存儲起來)。Kafka比別的系統的優點是它是一個很是高性能的存儲系統。寫入到kafka的數據將寫到磁盤並複製到集羣中保證容錯性。並容許生產者等待消息應答,直到消息徹底寫入。kafka的磁盤結構 - 不管你服務器上有50KB或50TB,執行是相同的。client來控制讀取數據的位置。你還能夠認爲kafka是一種專用於高性能,低延遲,提交日誌存儲,複製,和傳播特殊用途的分佈式文件系統。