1. 程式人生 > >Kafka知識點匯總

Kafka知識點匯總

net all 1.5 try 安全 決定 keep 獨立 文件

整體結構

技術分享


Producer

producer依據用戶指定的算法,將消息發送到指定的partition

Part

技術分享
  1. kafka以topic來進行消息管理,每一個topic包括多個part(ition),每一個part相應一個邏輯log,有多個segment組成。
  2. 每一個segment中存儲多條消息(見下圖),消息id由其邏輯位置決定。即從消息id可直接定位到消息的存儲位置。避免id到位置的額外映射。
  3. 每一個part在內存中相應一個index,記錄每一個segment中的第一條消息偏移。
  4. 公布者發到某個topic的消息會被均勻的分布到多個part上(隨機或依據用戶指定的回調函數進行分布)。broker收到公布消息往相應part的最後一個segment上加入該消息,
  5. 當某個segment上的消息條數達到配置值或消息公布時間超過閾值時。segment上的消息會被flush到磁盤。僅僅有flush到磁盤上的消息訂閱者才幹訂閱到。
  6. segment達到一定的大小後將不會再往該segment寫數據。broker會創建新的segment。

Broke

  1. 消息不在內存中cache,直接寫入到磁盤,充分利用磁盤的順序讀寫性能
  2. 直接使用linux 文件系統的cache,來高效緩存數據。
  3. 即使消息被消費,消息仍然不會被馬上刪除.日誌文件將會依據broker中的配置要求,保留一定的時間之後刪除
  4. 採用linux Zero-Copy提高發送性能。

  5. Topic劃分為多個partition,提高parallelism
  6. 能夠通過實現Partitioner接口來定制Partition的分區規則
  7. At least one 消息絕不會丟。但可能會反復傳輸
  8. 通過冗余機制來保證信息的安全
  9. 一個Broke能夠包括多個Topic的Part,一個Topic也能夠將多個Part分布到不同的不同的Broke上
  10. 數據壓縮:支持GZIP和Snappy壓縮協議

Consumer 公共特性

  1. Consumer依據消費能力自主控制消息拉取速度
  2. Consumer依據自身情況自主選擇消費模式,比如批量,反復消費,從尾端開始消費等

Lower Level Consumer

  1. Consumer從kafka集群pull數據
  2. Consumer負責維護消息的消費記錄,控制獲取消息的offset
  3. Consumer可將offset設成一個較小的值,又一次消費一些消息
  4. 必須找出指定Topic Partition中的lead broker
  5. 加入事務管理機制以保證消息被處理且僅被處理一次
  6. 在一個處理過程中僅僅消費Partition當中的一部分消息

High Level Consumer

  1. High Level模式下的Group Name 是整個Kafka集群的全局變量
  2. 消息消費以Consumer Group為單位,每一個Consumer Group中能夠有多個consumer,每一個consumer是一個線程。topic的每一個partition同一時候僅僅能被某一個consumer讀 取。Consumer Group相應的每一個partition都有一個最新的offset的值,存儲在zookeeper上的。

    所以在正常情況下不會出現反復消費的情況。

  3. 由於consumer的offerset並非實時的傳送到zookeeper(通過配置來制定更新周期)。所以Consumer假設突然Crash,有可能會讀取反復的信息
  4. High Level Consumer 能夠而且應該被使用在多線程的環境,線程模型中線程的數量(也代表group中consumer的數量)和topic的partition數量有關,以下列舉一些規則:

    1. 當提供的線程數量多於partition的數量。則部分線程將不會接收到消息;
    2. 當提供的線程數量少於partition的數量,則部分線程將從多個partition接收消息;
    3. 當某個線程從多個partition接收消息時,不保證接收消息的順序;可能出現從partition3接收5條消息,從partition4接收6條消息。接著又從partition3接收10條消息。
    4. 當加入很多其它線程時,會引起kafka做re-balance, 可能改變partition和線程的相應關系。


Consumer Group

  1. 同意consumer group(包括多個consumer。如一個集群同一時候消費)對一個topic進行消費。不同的consumer group之間獨立訂閱。互不幹擾。

  2. brokerconsumer增加或離開時會觸發負載均衡算法,使得一consumer group內的多個consumer的訂閱負載平衡
  3. 每一個partition僅僅會被consumer group內的一個consumer消費,故kafka保證每一個partition內的消息會被順序的訂閱,但多個Consumer Group可同一時候消費這一消息。
  4. 每一個Consumer屬於一個特定的Consumer Group(可為每一個Consumer指定group name,若不指定group name則屬於默認的group
  5. 假設須要實現廣播,僅僅要每一個Consumer有一個獨立的Group
  6. 要實現單播僅僅要全部的Consumer在同一個Group裏

Zookeeper

  1. 每一個broker啟動後會在zookeeper上註冊一個暫時的broker registry,包括brokerip地址和port號。所存儲的topicspartitions信息。

  2. 每一個consumer啟動後會在zookeeper上註冊一個暫時的consumer registry:包括consumer所屬的consumer group以及訂閱的topics
  3. 每一個consumer group關聯一個暫時的owner registry和一個持久的offset registry。對於被訂閱的每一個partition包括一個owner registry。內容為訂閱這個partitionconsumer id;同一時候包括一個offset registry。內容為上一次訂閱的offset



Kafka知識點匯總