什麼是kafka?
kafka是一個分佈式流式平臺,可以經過訂閱-發佈模式在應用之間實時傳遞數據流,同時保證可靠性和容錯性;簡單理解,就是一個分佈式消息隊列。html
kafka涉及的3基本概念
- kafka服務:既能夠以單點方式運行,也能夠經過多個節點組成集羣運行;
- record:kafka中的每條記錄稱爲一個record,由key、value、timestamp 3個部分組成;
- topic:消息能夠分類,每一個類別稱做一個topic;
kafka包含4個核心的API:

- Producer:發佈消息到一個或者多個topic;
- Consumer:從一個或者多個topic中訂閱而且處理消息;
- Stream:將應用程序做爲一個流式處理器,從topic中訂閱消息、並進行處理,而後再發布到其它topic中;
- Connector:能夠幫助創建一個能夠重用的Producer或者Consumer,好比:經過基於關係型數據庫的connector能夠在數據表中保存每次變動;
對topic和partition的理解

- topic能夠看作是對一系列消息的分類,producer會將相同類別的消息發送到同一個topic。一個topic能夠被0個或者多個consumer訂閱。
- 在kafka集羣內部,一個topic的數據會存放到多個分區日誌中,每一個分區稱爲一個partition;
- 在一個partition中,消息序列是有序的(按照寫入的時間順序)、而且不可變的(消息提交,不可改變);partition中會爲每條消息分配一個惟一的id,稱做offset,用來惟一標識分區中的一條消息記錄;
topic中消息的順序並不是全局有序,只是局部有序;
單看每一個partition中的消息都是按照寫入順序排列的,可是從topic的視角來看,因爲是併發處理多個partition中的消息,於是整個處理過程並不是是有序的;數據庫
- kafka集羣會保存全部已經發布的消息,不管消息是否被消費;能夠配置保留消息的時長;kafka中性能隨着數據量的增長是常數級降低,於是保留較長時間段的消息並非問題;
- consumer處理消息的標識,由consumer本身維護,每一個consumer中須要保留offset元數據,用於標識當前讀取消息在日誌中的位置;
消息讀取進度由每一個consumer經過改變offset自行控制;
consumer便可以按照順序讀取每一條消息,也能夠改變offset到以前的位置,重複讀取舊的消息;或者改變offset到以後的位置,用來跳過一部分消息;這種設計使得consumer的接入和斷開變得很是容易,不會影響到集羣中的其它consumer;併發
- partition的設計主要包含2個目的:擴容和併發。首先,一個topic能夠包含多個partition,多個partition能夠分佈在多個機器上,於是能夠處理大規模的數據;同時,多個partition能夠同時被多個consumer消費,於是提升了併發性;
分佈式概念的理解
- 節點:一個kafka集羣中的一個進程。一個topic的partition能夠分佈在集羣中的多個節點;每一個partition能夠經過配置指定副本數量,每一個副本(replication)存放在不一樣的節點上,以此進行容錯;
- partition:每一個partition的副本包含一個leader、0個或者多個follower。leader負責處理當前partition數據的全部讀寫請求,同時全部follower複製同步leader的數據;當leader節點宕掉後,follower中的一個會自動變爲新的leader;集羣中的每一個節點均可以看作是一部分partition的leader,同時又能夠看作是其它partition的follower,於是保證了集羣的負載均衡;
- producer:用於發佈消息到多個topic的一組進程。能夠選擇消息發佈在topic的那個partition上。便可以以輪詢的方式將消息輪流放到每一個partition上,以保證負載均衡。也能夠經過定製分區策略來保證消息落到特定的分區;
- consumer:用於處理消息的一組進程或者多組進程。每組進程劃分爲一個group,對於同一個topic的一個group內,一條消息只會被一個consumer消費。一個group中的一個consumer負責消費一個topic中的一個或者多個partition,不一樣的consumer消費的partition不重合。該設計能夠保證同一個group內消息的負載均衡,又能夠保證消息不被同時消費。consumer和partition經過kafka協議動態維護,當新加入一個consumer,將會把其他consumer負責消費的partition分配給該consumer;相反,當有consumer宕機後,其負責的partition將會被分配給剩餘的consumer。一個group中的consumer數量不該該比partition的數量多。

partition+group 保證按順序讀取消息負載均衡
在一個group中,一個partition只會綁定給一個consumer進程消費,且一個partition中的消息是局部有序的。若是咱們須要保障某一批消息按順序執行,只要保障其可以落入同一個partition中便可(消息設置相同的key)。若是須要保證消息的全局順序,則可使topic僅包含一個partition,從而僅有一個consumer進行消費;分佈式
kafka的應用場景
- 消息隊列
kafka用做message broker(消息代理),適用於高吞吐、內建分區、可複製、可容錯的消息隊列。
- 網站活動追蹤
經過一系列實時的訂閱-發佈數據流,重建用戶活動軌跡。將網站活動(PV,搜索等動做)發佈到kafka的topic中,供下游實時處理,監控或者加載到線下數據倉庫作離線計算和報表。
- 運行數據統計
用於監控運行數據,匯聚以後進行統計。
- 日誌聚合
用於替代Flume、Scribe的等日誌收集工具,提供高性能、持久性、低延遲的日誌收集。
- 流式處理
用做流式處理工具,進行數據的聚合、富集、轉換等操做。相似與Apache Storm等工具。
- 事件源模式實現
用於實現Event Sourcing Pattern
閱讀原文http://click.aliyun.com/m/40005/工具