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.ituring.com.cn/book/1927)下載。
由於個人能力有限,文中的錯誤在所難免,如果讀者在閱讀的過程中,發現不妥之處,可以私信我的微博:http://weibo.com/xuyuantree,我會定期將勘誤更新到個人部落格上。
✤ 致謝
感謝圖靈的編輯王軍花老師,是您的辛勤工作讓本書的出版成為可能。同時還要感謝許多我不知道名字的後台工作人員為本書付出的努力。
感謝馮嘉、時金魁、吳陽平在百忙之中抽出時間給本撰寫推薦。