● 圖文詳解Kafka的內部原理、設計與實踐
● 全面分析以Kafka為中心的分散式串流資料平台
● Kafka特性詳細解說,包含連接器和流處理
Kafka自LinkedIn開源以來就以高性能、高輸送量、分散式的特性著稱,本書以0.10版本的源碼為基礎,深入分析了Kafka的設計與實現,包括生產者和消費者的消息處理流程,新舊消費者不同的設計方式,存儲層的實現,協調者和控制器如何確保Kafka集群的分散式和容錯特性,兩種同步集群工具MirrorMaker和uReplicator,流處理的兩種API以及Kafka的一些高級特性等。
※ 本書範例程式可至官網下載
作者
鄭奇煌
目前就職於杭州的互聯網風控公司,主要專注於大數據和流計算。對源碼研究有一定的心得體會,樂於分享。
目錄
01 Kafka 入門
1.1 Kafka 流式資料平台
1.2 Kafka 的基本概念
1.3 Kafka 的設計與實現
1.4 快速開始
1.5 環境準備
02 生產者
2.1 新生產者用戶端
2.2 舊生產者用戶端
2.3 服務端網路連接
2.4 小結
03 消費者:進階API和低階API
3.1 消費者啟動和初始化
3.2 消費者再平衡操作
3.3 消費者拉取資料
3.4 消費者消費訊息
3.5 消費者傳送分區偏移量
3.6 消費者低階API 範例
3.7 小結
04 新消費者
4.1 新消費者用戶端
4.2 消費者的網路用戶端端輪詢
4.3 心跳工作
4.4 消費者傳送偏移量
4.5 小結
05 協調者
5.1 消費者加入消費組
5.2 協調者處理請求
5.3 延遲的加入組操作
5.4 消費組狀態機
5.5 小結
06 儲存層
6.1 記錄檔的讀寫
6.2 服務端處理讀寫請求
6.3 延遲操作
6.4 小結
07 控制器
7.1 Kafka 控制器
7.2 服務端處理LeaderAndIsr請求
7.3 中繼資料快取
7.4 Kafka 服務關閉
7.5 小結
08 基於Kafka 建置資料流程管線
8.1 Kafka 叢集同步工具:MirrorMaker
8.2 Uber 叢集同步工具:uReplicator
8.3 Kafka 連接器
8.4 小結
09 Kafka 流處理
9.1 低階Processor API
9.2 進階流式DSL
9.3 小結
10 進階特性介紹
10.1 使用者端配額
10.2 訊息與時間戳記
10.3 交易處理
10.4 小結
序/導讀
前言
Apache Kafka(簡稱Kafka)最早是由LinkedIn開放原始碼出來的分散式訊息系統,現在是Apache旗下的子專案,並且已經成為開放原始碼領域應用最廣泛的訊息系統之一。Kafka社區也非常活躍,從0.9 版本開始,Kafka的標語已經從「一個高傳輸量、分散式的訊息系統」改為「一個分散式的流平台」。
✤ 如何閱讀本書
本書主要以0.10版本的Kafka原始程式為基礎,並透過圖文詳解的方式分析Kafka內部元件的實現細節。對於Kafka流處理的一些新特性,本書也會分析0.11版本的相關原始程式。本書各章的主要內容如下。
■ 第1章首先介紹Kafka作為流式資料平台的3 個組成,包含訊息系統、儲存系統和流處理系統,接著從分區模型、消費模型和分散式模型這三個模型介紹Kafka的幾個基本概念,然後介紹Kafka幾個比較重要的設計想法,最後討論如何在一台機器上模擬單機模式與分散式模式,以及如何架設開發環境。
■ 第2章從一個生產者的範例開始,引出新版本生產者的兩種訊息發送方式。生產者用戶端透過記錄收集器和發送執行緒,對訊息集進行分組和快取,並為目標節點建立生產請求,發送到不同的代理節點。接著介紹與網路相關的Kafka通道、選擇器、輪詢等NIO操作。另外,還介紹Scala版本的舊生產者,它使用阻塞通道的方式發送請求。最後,介紹服務端採用Reactor模式處理用戶端的請求。
■ 第3章首先介紹消費者相關的基礎概念,然後從一個消費者的範例開始,引出以ZooKeeper(後面簡稱ZK)為基礎的進階消費者API。要了解進階API,主要是要了解消費執行緒的模型以及變數的傳遞方式。接著介紹消費者傳送分區偏移量的兩種方式。最後,舉一個低階API的範例。開發者需要自己實現一些比較複雜的邏輯處理,才能保障消費程式的穩固性和穩定性。
■ 第4章介紹新版本的消費者。不同於舊版本的消費者,新版本去除了ZK的依賴,統一舊版本的進階API和低階API,並提供兩種消費方式:訂閱和分配。新版本引用訂閱狀態來管理消費者的訂閱資訊,並使用拉取器拉取訊息。新版本的消費者沒有使用拉取執行緒,而是採用輪詢的方式拉取訊息,它的效能比舊版本的消費者更好。另外,還介紹消費者採用回呼器、處理器、監聽器、介面卡、組合模式和鏈式呼叫等實現不同類型的非同步請求。最後,我們介紹新消費者的心跳工作、消費者傳送偏移量以及3種訊息處理語義的使用方式。
■ 第5章介紹新版本消費者相關的協調者實現,主要包含「加入組」與「同步組」。每個消費者都有一個用戶端的協調者,服務端也有一個消費組等級的協調者負責處理所有消費者用戶端的請求。當消費組觸發再平衡操作時,服務端的協調者會記錄消費組中繼資料的變化,並透過狀態機保障消費組狀態的正常轉換。本章會透過很多不同的範例場景來幫助讀者了解消費組相關的實現。
■ 第6章介紹Kafka的儲存層實現,包含讀寫、管理、壓縮等一些常用的記錄檔操作。服務端透過備份管理員處理用戶端的生產請求和拉取請求。接著介紹備份機制相關的分區、備份、最高水位、複製點等一些概念。最後,介紹延遲操作介面與延遲快取。服務端如果不能立即傳回回應結果給用戶端,會先將延遲操作快取起來,直到請求處理完成或逾時。
■ 第7章介紹作為服務端核心的Kafka控制器,它主要負責管理分區狀態機和備份狀態機,以及多種類型的監聽器,例如代理節點上線和下線、刪除主題、重新分配分區等。控制器的重要職責是選舉分區的主備份。不同代理節點根據控制器下發的請求,決定成為分區的主備份還是拷貝備份。另外,我們還分析本機複本與遠端備份的差別,以及中繼資料快取的作用。
■ 第8章首先介紹兩種叢集的同步工具:Kafka內建的MirrorMaker和Uber開放原始碼的uReplicator。接著,介紹新版本Kafka提供的連接器架構,以及如何開發一個自訂的連接器。最後,介紹連接器的架構模型的實作方式,主要包含資料模型、Connector模型和Worker模型。
■ 第9章介紹Kafka流處理的兩種API:低階Processor API和進階DSL。這一章重點介紹流處理的執行緒模型,主要包含流實例、流執行緒和流工作;還介紹流處理的本機狀態儲存,它主要用來作為備份工作的資料恢復。進階DSL包含兩個元件——KStream與KTable,它們都定義了一些常用的流處理運算元操作,例如無狀態的操作(過濾和對映等)、有狀態的操作(連接和視窗等)。
■ 第10章介紹Kafka的一些進階特性,例如用戶端的配額、新的訊息格式和交易特性。
本書相關的範例程式可以至http://www.deepstone.com.tw/下載,以及在筆者的GitHub首頁https://github.com/zqhxuyuan/kafka-book上亦有提供下載。另外,限於篇幅,附錄部分會放在個人部落格上(http://zqhxuyuan.github.io/)。此外,本書的原始程式碼和附錄部分請至圖靈社區本書首頁(http://www.ituring.com.cn/book/1927)下載。
由於個人能力有限,文中的錯誤在所難免,如果讀者在閱讀的過程中,發現不妥之處,可以私信我的微博:http://weibo.com/xuyuantree,我會定期將勘誤更新到個人部落格上。
✤ 致謝
感謝圖靈的編輯王軍花老師,是您的辛勤工作讓本書的出版成為可能。同時還要感謝許多我不知道名字的後台工作人員為本書付出的努力。
感謝馮嘉、時金魁、吳陽平在百忙之中抽出時間給本撰寫推薦。