Kafka 原始碼剖析

哥不是小蘿莉發表於2017-05-06

1.概述

  在對Kafka使用層面掌握後,進一步提升分析其原始碼是極有必要的。縱觀Kafka原始碼工程結構,不算太複雜,程式碼量也不算大。分析研究其實現細節難度不算太大。今天筆者給大家分析的是其核心處理模組,core模組。

2.內容

  首先,我們需要對Kafka的工程結構有一個整體的認知度,Kafka 大家最為熟悉的就是其消費者與生產者。然其,底層的儲存機制,選舉機制,備份機制等實現細節,需要我們對其原始碼仔細閱讀學習,思考與分析其設計之初的初衷。下面,我們首先來看看Kafka原始碼工程模組分佈,截止當天日期,官方託管在 Github 上的 Kafka 原始碼版本為:0.10.2.1,其工程分佈結構如下圖所示:

  這裡筆記只針對core模組進行說明,其他模組均是啟動指令碼,文件說明,測試類或是Java客戶端的相關程式碼,本篇部落格就不多做贅述了。

模組名 說明
admin kafka的管理員模組,操作和管理其topic,partition相關,包含建立,刪除topic,或者擴充分割槽等。
api 主要負責資料互動,客戶端與服務端互動資料的編碼與解碼。
client 該模組下就一個類,producer讀取kafka broker後設資料資訊,topic和分割槽,以及leader。
cluster 這裡包含多個實體類,有Broker,Cluster,Partition,Replica。其中一個Cluster由多個Broker組成,一個Broker包含多個Partition,一個Topic的所有Partition分佈在不同的Broker中,一個Replica包含都個Partition。
common 這是一個通用模組,其只包含各種異常類以及錯誤驗證。
consumer 消費者處理模組,負責所有的客戶端消費者資料和邏輯處理。
controller 此模組負責中央控制器的選舉,分割槽的Leader選舉,Replica的分配或其重新分配,分割槽和副本的擴容等。
coordinator 負責管理部分consumer group和他們的offset。
javaapi 提供Java語言的producer和consumer的API介面。
log 這是一個負責Kafka檔案儲存模組,負責讀寫所有的Kafka的Topic訊息資料。
message 封裝多條資料組成一個資料集或者壓縮資料集。
metrics 負責內部狀態的監控模組。
network 該模組負責處理和接收客戶端連線,處理網路時間模組。
producer 生產者的細節實現模組,包括的內容有同步和非同步的訊息傳送。
security 負責Kafka的安全驗證和管理模組。
serializer 序列化和反序列化當前訊息內容。
server 該模組涉及的內容較多,有Leader和Offset的checkpoint,動態配置,延時建立和刪除Topic,Leader的選舉,Admin和Replica的管理,以及各種後設資料的快取等內容。
tools 閱讀該模組,就是一個工具模組,涉及的內容也比較多。有匯出對應consumer的offset值;匯出LogSegments資訊,以及當前Topic的log寫的Location資訊;匯出Zookeeper上的offset值等內容。
utils 各種工具類,比如Json,ZkUtils,執行緒池工具類,KafkaScheduler公共排程器類,Mx4jLoader監控載入器,ReplicationUtils複製集工具類,CommandLineUtils命令列工具類,以及公共日誌類等內容。

3.原始碼環境

  閱讀Kafka原始碼需要準備以下環境:

  • JDK
  • IDE(Eclipse,IDEA或者其他)
  • gradle

  關於環境的搭建,大家可以利用搜尋引擎去完成,比較基礎,這裡就不多贅述了。然後在原始碼工程目錄下執行以下命令:

  • gradle idea(編輯器為IDEA)
  • gradle eclipse(編輯器為Eclipse)

  如何選擇,可按照自己所使用的編輯器即可。這裡筆者所使用的是IDEA,執行命令後,會在原始碼目錄生成以下檔案,如下圖所示:

  然後,在編輯器中匯入該原始碼專案工程即可,如下圖所示:

4.執行原始碼

  這裡,我們先在config模組下設定server.properties檔案,按照自己的需要設定,比如分割槽數,log的儲存路徑,zookeeper的地址設定等等。然後,我們在編輯器中的執行中設定相關的啟動引數,如下圖所示:

  啟動類Kafka.scala在core模組下,需要注意的是,這裡在啟動Kafka之前,確保我們之前在server.properties檔案中所配置的Zookeeper叢集已正常執行,然後我們在編輯器中執行Kafka原始碼,如下圖所示:

5.預覽結果

  這裡,我們做一下簡單的修改,在啟動類的開頭列印一句啟動日誌和啟動時間,部分執行日誌和執行結果截圖如下所示:

Start Kafka,DateTime[1494065094606]
[2017-05-06 18:04:54,830] INFO KafkaConfig values: 
    advertised.host.name = null
    advertised.listeners = null
    advertised.port = null
    authorizer.class.name = 
    auto.create.topics.enable = true
    auto.leader.rebalance.enable = true
    background.threads = 10
    broker.id = 0
    broker.id.generation.enable = true
    broker.rack = null
    compression.type = producer
    connections.max.idle.ms = 600000
    controlled.shutdown.enable = true

  如上圖,紅色框即是我們簡單的新增的一句程式碼。

6.總結

  本篇部落格給大家介紹了Kafka原始碼的core模組下各個子模組所負責的內容,以及如何便捷的去閱讀原始碼,以及在編輯器中執行Kafka原始碼。後續,再為大家分析Kafka的儲存機制,選舉機制,備份機制等內容的實現細節。最後,歡迎大家使用Kafka-Eagle監控工具。

7.結束語

  這篇部落格就和大家分享到這裡,如果大家在研究學習的過程當中有什麼問題,可以加群進行討論或傳送郵件給我,我會盡我所能為您解答,與君共勉!

相關文章