本書以Kafka 0.10.0版本源碼為基礎(chǔ),針對Kafka的架構(gòu)設(shè)計到實現(xiàn)細(xì)節(jié)進(jìn)行詳細(xì)闡述。本書共5章,從Kafka的應(yīng)用場景、源碼環(huán)境搭建開始逐步深入,對Kafka的核心概念進(jìn)行分析介紹,對Kafka生產(chǎn)者、消費者、服務(wù)端的源碼進(jìn)行深入的剖析,最后介紹Kafka常用的管理腳本實現(xiàn),讓讀者不僅從宏觀設(shè)計上了解Kafka,而且能夠深入到Kafka的細(xì)節(jié)設(shè)計之中。在源碼分析的過程中,還穿插了筆者工作積累的經(jīng)驗分析和對Kafka設(shè)計的理解,希望能夠讓讀者可以舉一反三,不僅知其然,而且知其所以然。本書旨在為讀者閱讀Kafka源碼提供幫助和指導(dǎo),讓讀者更加深入地了解Kafka的運(yùn)行原理、設(shè)計理念,讓讀者在設(shè)計分布式系統(tǒng)時可以參考Kafka的優(yōu)秀設(shè)計。本書的內(nèi)容對于讀者全面提升自己的技術(shù)能力有很大幫助。
適讀人群 :本書適合有一定Java基礎(chǔ),希望了解Kafka源碼以及對分布式系統(tǒng)感興趣的讀者。
Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),,本書以Kafka 0.10.0版本源碼為基礎(chǔ),深入剖析了Kafka的各個模塊的實現(xiàn),包括Kafka的生產(chǎn)者客戶端、消費者客戶端、服務(wù)端的各個模塊以及常用的管理腳本。作者對Kafka設(shè)計的理解和經(jīng)驗分享也穿插在了剖析源碼的過程中,可以幫助讀者學(xué)習(xí)Kafka中優(yōu)秀的設(shè)計思想以及Java和Scala的編程技巧和規(guī)范。
這是一個數(shù)據(jù)大爆炸的時代,互聯(lián)網(wǎng)成為了數(shù)據(jù)傳播的主要載體。大數(shù)據(jù)處理平臺在現(xiàn)代化的互聯(lián)網(wǎng)公司進(jìn)行商業(yè)決策、規(guī)劃發(fā)展、市場拓展等方面扮演著越來越重要的角色。Kafka作為大數(shù)據(jù)平臺的重要組件之一,受到越來越多的設(shè)計人員和開發(fā)人員的 青睞,Kafka的社區(qū)也變得越來越活躍,Kafka本身的架構(gòu)設(shè)計、應(yīng)用場景也得到了長足的發(fā)展。
Kafka最開始由LinkedIn設(shè)計開發(fā),并于2011年年初開源,2012年10月成為Apache基金會的頂級項目。目前Kafka為越來越多的分布式大數(shù)據(jù)處理系統(tǒng)提供支持,其中也包括著名的Apache Spark,LinkedIn、Netflix、Uber、Verizon、網(wǎng)易、美團(tuán)等互聯(lián)網(wǎng)公司也選擇以Kafka為基礎(chǔ)搭建其大數(shù)據(jù)處理平臺或消息中間件系統(tǒng)。隨著Kafka的應(yīng)用場景越來越豐富,用戶對Kafka的吞吐量、可擴(kuò)展性、穩(wěn)定性和可維護(hù)性等有了更多的期許,也有很多開發(fā)人員參與到Kafka的開發(fā)建議制定和代碼提交中。在Kafka 0.10.X版本中出現(xiàn)了很多令人欣喜的新功能,本書深入剖析了Kafka 0.10.X的內(nèi)部設(shè)計和實現(xiàn)細(xì)節(jié)。
本書以Kafka 0.10.0版本源碼為基礎(chǔ),深入剖析了Kafka的各個模塊的實現(xiàn),包括Kafka的生產(chǎn)者客戶端、消費者客戶端、服務(wù)端的各個模塊以及常用的管理腳本。筆者對Kafka設(shè)計的理解和經(jīng)驗分享也穿插在了剖析源碼的過程中,希望讀者能夠通過本書理解Kafka的設(shè)計原理和源碼實現(xiàn),同時也學(xué)習(xí)到Kafka中優(yōu)秀的設(shè)計思想以及Java和Scala的編程技巧和規(guī)范。
如何閱讀本書
由于本書的篇幅限制,本書并沒有詳細(xì)介紹Kafka源碼中涉及的所有基礎(chǔ)知識,例如Java NIO、J.U.C包中工具類的使用、命令行參數(shù)解析器的使用等,為方便讀者閱讀,筆者僅介紹了一些必須且重要的基礎(chǔ)知識。在開始源碼分析之前,希望讀者按照第1章的相關(guān)介紹完成Kafka源碼環(huán)境的搭建,并了解Kafka的核心概念,這樣也可以有更好的學(xué)習(xí)效果。
本書共五章,它們互相之間的聯(lián)系并不是很強(qiáng),讀者可以從頭開始閱讀,也可以選擇自己感興趣的章節(jié)進(jìn)行學(xué)習(xí)。
第1章是Kafka的快速入門,其中介紹了Kafka的背景、特性以及應(yīng)用場景。之后介紹了筆者在實踐中遇到的一個以Kafka為中心的案例,并分析了在此案例中選擇使用Kafka的具體原因和Kafka起到的關(guān)鍵作用。最后介紹了Kafka中的核心概念和Kafka源碼調(diào)試環(huán)境的搭建。
第2章介紹了生產(chǎn)者客戶端的設(shè)計特點和實現(xiàn)細(xì)節(jié),剖析了KafkaProducer攔截消息、序列化消息、路由消息等功能的源碼實現(xiàn),介紹了RecordAccumulator的結(jié)構(gòu)和實現(xiàn)。最后剖析了KafkaProducer中Sender線程的源碼。
第3章介紹了Kafka的消息傳遞保證語義并給出了相關(guān)的實踐建議,還介紹了Consumer Group Rebalance操作各個版本方案的原理和弊端。最后詳細(xì)剖析了KafkaConsumer相關(guān)組件的運(yùn)行原理和實現(xiàn)細(xì)節(jié)。
第4章介紹了構(gòu)成Kafka服務(wù)端的各個組件,依次分析了Kafka網(wǎng)絡(luò)層、API層、日志存儲、DelayedOperationPurgatory組件、Kafka的副本機(jī)制、KafkaController、GroupCoordinator、Kafka的身份認(rèn)證與權(quán)限控制以及Kafka監(jiān)控相關(guān)的實現(xiàn)。本章是Kafka的核心內(nèi)容,涉及較多的設(shè)計細(xì)節(jié)和編程技巧,希望讀者閱讀之后有所收獲。
第5章介紹了Kafka提供的多個腳本工具的使用以及具體實現(xiàn)原理,了解這些腳本可以幫助管理人員快速完成一些常見的管理、運(yùn)維、測試功能。
如果讀者在閱讀本書的過程中,發(fā)現(xiàn)任何不妥之處,請將您寶貴的意見和建議發(fā)送到郵箱xxxlxy2008@163.com,也歡迎讀者朋友通過此郵箱與筆者進(jìn)行交流。
致謝
感謝電子工業(yè)出版社博文視點的陳曉猛老師,是您的辛勤工作讓本書的出版成為可能。同時還要感謝許多我不知道名字的幕后工作人員為本書付出的努力。
感謝張占龍、張亞森、楊威、劉克剛、劉思等朋友在百忙之中抽出時間對本書進(jìn)行審閱和推薦。感謝林放、米秀明、星亮亮、王松洋、褚洪洋、曾天寧、葛彬、趙美凱、顧聰慧、孫向川、段鑫冬、彭海蛟、趙仁偉等同事,幫助我解決工作中的困難。
感謝馮玉玉、李成偉,是你們讓寫作的過程變得妙趣橫生,是你們讓我更加積極、自信,也是你們的鼓勵讓我完成了本書的寫作。
最后,特別感謝我的母親大人,謝謝您默默為我做出的犧牲和付出,您是我永遠(yuǎn)的女神。
徐郡明
徐郡明,武漢大學(xué)碩士,目前就職于航天科技集團(tuán)旗下某研究所,主要負(fù)責(zé)政企云平臺基礎(chǔ)架構(gòu)的設(shè)計和研發(fā)工作,有多年Kafka應(yīng)用和設(shè)計經(jīng)驗。長期關(guān)注大數(shù)據(jù)處理相關(guān)技術(shù)以及Kafka的發(fā)展。
目?錄
第1章 快速入門
1.1 Kafka簡介
1.2 以Kafka為中心的解決方案
1.3 Kafka核心概念
1.4 搭建Kafka源碼環(huán)境
本章小結(jié)
第2章 生產(chǎn)者
2.1 KafkaProducer使用示例
2.2 KafkaProducer分析
2.2.1 ProducerInterceptors&ProducerInterceptor
2.2.2 Kafka集群元數(shù)據(jù)
2.2.3 Serializer&Deserializer
2.2.4 Partitioner
2.3 RecordAccumulator分析
2.3.1 MemoryRecords
2.3.2 RecordBatch
2.3.3 BufferPool
2.3.4 RecordAccumulator
2.4 Sender分析
2.4.1 創(chuàng)建請求
2.4.2 KSelector
2.4.3 InFlightRequests
2.4.4 MetadataUpdater
2.4.5 NetworkClient
本章小結(jié)
第3章 消費者
3.1 KafkaConsumer使用示例
3.2 傳遞保證語義(Delivery guarantee semantic)
3.3 Consumer Group Rebalance設(shè)計
3.4 KafkaConsumer分析
3.4.1 ConsumerNetworkClient
3.4.2 SubscriptionState
3.4.3 ConsumerCoordinator
3.4.4 PartitionAssignor分析
3.4.5 Heartbeat分析
3.4.6 Rebalance實現(xiàn)
3.4.7 offset操作
3.4.8 Fetcher
3.4.9 KafkaConsumer分析總結(jié)
本章小結(jié)
第4章 Kafka服務(wù)端
4.1 網(wǎng)絡(luò)層
4.1.1 Reactor模式
4.1.2 SocketServer
4.1.3 AbstractServerThread
4.1.4 Acceptor
4.1.5 Processor
4.1.6 RequestChannel
4.2 API層
4.2.1 KafkaRequestHandler
4.2.2 KafkaApis
4.3 日志存儲
4.3.1 基本概念
4.3.2 FileMessageSet
4.3.3 ByteBufferMessageSet
4.3.4 OffsetIndex
4.3.5 LogSegment
4.3.6 Log
4.3.7 LogManager
4.4 DelayedOperationPurgatory組件
4.4.1 TimingWheel
4.4.2 SystemTimer
4.4.3 DelayedOperation
4.4.4 DelayedOperationPurgatory
4.4.5 DelayedProduce
4.4.6 DelayedFetch
4.5 副本機(jī)制
4.5.1 副本
4.5.2 分區(qū)
4.5.3 ReplicaManager
4.6 KafkaController
4.6.1 ControllerChannelManager
4.6.2 ControllerContext
4.6.3 ControllerBrokerRequestBatch
4.6.4 PartitionStateMachine
4.6.5 PartitionLeaderSelector
4.6.6 ReplicaStateMachine
4.6.7 ZooKeeper Listener
4.6.8 KafkaController初始化與故障轉(zhuǎn)移
4.6.9 處理ControlledShutdownRequest
4.7 GroupCoordinator
4.7.1 GroupMetadataManager
4.7.2 GroupCoordinator分析
4.8 身份認(rèn)證與權(quán)限控制
4.8.1 配置SASL/PLAIN認(rèn)證
4.8.2 身份認(rèn)證
4.8.3 權(quán)限控制
4.9 Kafka監(jiān)控
4.9.1 JMX簡介
4.9.2 Metrics簡介
4.9.3 Kafka中的Metrics
4.9.4 Kafka的監(jiān)控功能
4.9.5 監(jiān)控KSelector的指標(biāo)
第5章 Kafka Tool
5.1 kafka-server-start腳本
5.2 kafka-topics腳本
5.2.1 創(chuàng)建Topic
5.2.2 修改Topic
5.3 kafka-preferred-replica-election腳本
5.4 kafka-reassign-partitions腳本
5.5 kafka-console-producer腳本
5.6 kafka-console-consumer腳本
5.7 kafka-consumer-groups腳本
5.8 DumpLogSegments
5.9 kafka-producer-perf-test腳本
5.10 kafka-consumer-perf-test腳本
5.11 kafka-mirror-maker腳本
本章小結(jié)