這是一本指導(dǎo)讀者如何在實(shí)踐中讓RocketMQ實(shí)現(xiàn)高性能、高可用、高吞吐量和低延遲的著作。
作者是RocketMQ官方認(rèn)定的優(yōu) 秀布道師和技術(shù)專家,持續(xù)在RocketMQ領(lǐng)域深耕。本書從源碼的角度分析了RocketMQ的技術(shù)架構(gòu)和實(shí)現(xiàn)原理,第1版獲得了良好的口碑,是RocketMQ領(lǐng)域的標(biāo)志性作品,第2版做了較大幅度的更新。
Apache RocketMQ創(chuàng)始人/Linux OpenMessaging創(chuàng)始人兼主席/Alibaba Messaging開放技術(shù)負(fù)責(zé)人馮嘉高度評價并作序推薦。
全書一共11章,分為3個部分:
第1部分(第1章):
簡單介紹了RocketMQ的設(shè)計理念與目標(biāo),以及閱讀RocketMQ源碼的方法與技巧;
第二部分(第2~9章):
從源碼角度對RocketMQ的技術(shù)架構(gòu)以及消息發(fā)送、消息存儲、消息消費(fèi)、消息過濾、順序消息、主從同步、事務(wù)消息等主要功能模塊的實(shí)現(xiàn)原理進(jìn)行了深入分析。
第三部分(第10~11章):
首先從實(shí)戰(zhàn)的角度講了RocketMQ監(jiān)控的原理、實(shí)現(xiàn)和應(yīng)用,然后通過各種類型的大量示例展示了RocketMQ的使用技巧。
(1)作者經(jīng)驗(yàn)豐富:
作者是RocketMQ社區(qū)的早期布道師和RocketMQ官方評選的優(yōu)秀布道師,有大量實(shí)戰(zhàn)經(jīng)驗(yàn)的中通和圓通的資深架構(gòu)專家。
(2)RocketMQ官方推薦:
RocketMQ創(chuàng)始人/Alibaba Messaging開源技術(shù)負(fù)責(zé)人/Linux OpenMessaging創(chuàng)始人高度評價并作序推薦。
(3)暢銷書全新升級:
第1版廣獲好評,成為RocketMQ領(lǐng)域標(biāo)志性作品,第2版在源碼分析的基礎(chǔ)上增加了豐富的圖文總結(jié),同時在核心功能解讀及使用技巧方面做了重大更新。
(4)全方位剖析源碼:
從源碼角度分析RocketMQ的技術(shù)架構(gòu)以及消息發(fā)送、消息存儲、消息消費(fèi)、消息過濾、順序消息、主從同步、事務(wù)消息等的實(shí)現(xiàn)原理。
(5)以用好RocketMQ為導(dǎo)向:
揭示RocketMQ高性能、高可用、高吞吐量、低延遲的秘密。
【為什么要寫這本書】
隨著互聯(lián)網(wǎng)技術(shù)的蓬勃發(fā)展和微服務(wù)架構(gòu)的普遍應(yīng)用,加上大數(shù)據(jù)分析及高并發(fā)流量場景的復(fù)雜度越來越高,系統(tǒng)架構(gòu)開始追求小型化、輕量化,為此我們也需要擁有高性能、高可用、低延遲、支持順序、支持容錯、支持事務(wù)等功能的消息中間件來支撐互聯(lián)網(wǎng)高速發(fā)展。目前,RPC、服務(wù)治理、分布式、消息中間件已經(jīng)成為互聯(lián)網(wǎng)架構(gòu)的標(biāo)配。
引入消息中間件后,服務(wù)之間就可以通過可靠的異步調(diào)用來降低系統(tǒng)之間的耦合度,提高系統(tǒng)的可用性。消息中間件具有高效的消息處理能力,可以讓系統(tǒng)承接大數(shù)據(jù)量的并發(fā)及流量脈沖而不被擊垮,在保證性能的同時改善了用戶體驗(yàn)。此外,消息中間件還可以解決系統(tǒng)之間數(shù)據(jù)的一致性(終一致性)問題。
RocketMQ作為阿里開源的一款高性能、高吞吐量的消息中間件,承載了阿里雙11的大部分業(yè)務(wù),可以說是一名久經(jīng)戰(zhàn)場的精英、值得信任的伙伴。它采用 Java作為開發(fā)語言,自然而然得到了廣大互聯(lián)網(wǎng)架構(gòu)師的青睞,并成為互聯(lián)網(wǎng)行業(yè)的消息中間件。
初次接觸RocketMQ是在聽到它被阿里巴巴正式捐獻(xiàn)給Apache基金會,成為Apache的開源項目時。這意味著承載阿里雙11巨大流量的消息中間件完全開源,對廣大Java開發(fā)者來說無疑是一個巨大的利好,讓我們有機(jī)會一睹高性能消息中間件RocketMQ的真容。作為一名阿里技術(shù)崇拜者,我內(nèi)心異常激動,于是不假思索地在CSDN上開通了專欄源碼研究RocketMQ,并受到了廣大技術(shù)愛好者的支持。
RocketMQ作為一款高性能消息中間件,其核心優(yōu)勢是可靠的消息存儲、高性能且低延遲的消息發(fā)送、強(qiáng)大的消息堆積能力與消息處理能力、嚴(yán)格的順序消息模式等。RocketMQ的另一個核心優(yōu)勢是懂得取舍。軟件設(shè)計不可能做到面面俱到,消息中間件的理想狀態(tài)是一條消息能且只能被消費(fèi)一次,要做到這一點(diǎn),必然需要犧牲性能。RocketMQ的設(shè)計者解決這一難題的辦法是不去解決,即保證消息至少被消費(fèi)一次,但不承諾消息不會被消費(fèi)者多次消費(fèi),其消費(fèi)的冪等由消費(fèi)者實(shí)現(xiàn),從而極大地簡化了實(shí)現(xiàn)內(nèi)核,提高了RocketMQ的整體性能。
RocketMQ被捐獻(xiàn)給Apache基金會后一直在快速發(fā)展,相關(guān)OpenMessaging 的標(biāo)準(zhǔn)也已經(jīng)發(fā)布。本書的寫作目的是與各位讀者探討RocketMQ的實(shí)現(xiàn)原理,幫助讀者更好地在實(shí)際項目中應(yīng)用 RocketMQ。
讀者對象
本書的讀者對象如下:
RocketMQ的用戶和愛好者;
RocketMQ代碼開發(fā)志愿者;
Java中高級開發(fā)工程師;
Java架構(gòu)師;
Java開源相關(guān)技術(shù)人員。
【本書特色 】
本書從源碼的角度對RocketMQ的實(shí)現(xiàn)原理進(jìn)行詳細(xì)剖析。作為一本源碼閱讀類圖書,本書的講解切入點(diǎn)并不是組成RocketMQ的一個個源碼包,而是功能模塊(如topic路由中心、消息發(fā)送、消息存儲、消息消費(fèi)、事務(wù)消息),這樣更加貼近實(shí)戰(zhàn)需求。
【如何閱讀本書】
本書從邏輯上分為三部分。
部分為準(zhǔn)備篇(第1章),簡單介紹了RocketMQ的設(shè)計理念與目標(biāo),并介紹了在開發(fā)工具中如何對RocketMQ進(jìn)行代碼調(diào)試。
第二部分為實(shí)現(xiàn)篇(第2~9章),重點(diǎn)講解了RocketMQ各個功能模塊的實(shí)現(xiàn)原理,包括NameServer、消息發(fā)送、消息存儲、消息消費(fèi)、ACL功能、主從同步、消息軌跡、主從切換等。
第三部分為實(shí)例篇(第10~11章),先介紹了RocketMQ監(jiān)控,然后通過示例展示了RocketMQ的使用技巧。
本書在后的附錄中給出了RocketMQ的主要參數(shù)列表及含義,增加了各版本概述和升級建議,供讀者參考。
本書的行文思路主要是根據(jù)消息發(fā)送的全流程進(jìn)行展開,從路由管理到消息發(fā)送、消息存儲、消息消費(fèi),再到順序消息、事務(wù)消息,從而實(shí)現(xiàn)消息鏈路的閉環(huán)。建議讀者按照該思路帶著問題來閱讀,這樣或許會事半功倍。
勘誤和支持
由于作者水平有限,編寫時間倉促,書中難免會出現(xiàn)一些錯誤或者不準(zhǔn)確的地方,懇請讀者批評指正。大家可以在CSDN博客專欄(https://blog.csdn.net/prestigeding/article/details/85233529)中留言反饋。書中的全部源文件可以從GitHub RocketMQ官方倉庫中下載,我們也會將相應(yīng)的功能及時進(jìn)行更新。如果你有更多的寶貴意見,請通過如下渠道向我們反饋:(1)發(fā)送郵件至dw19871218pmz@126.com;(2)添加作者微信號dingwpmz進(jìn)行交流;(3)關(guān)注微信公眾號中間件興趣圈并給作者留言。我們在公眾號中分享了本書的學(xué)習(xí)指南,回復(fù)學(xué)習(xí)指南即可獲取。期待能夠得到你的真摯反饋。
丁威
中間件技術(shù)專家,資深RocketMQ技術(shù)專家,曾獲RocketMQ官方頒發(fā)的優(yōu)秀布道師稱號。
現(xiàn)擔(dān)任中通快遞技術(shù)平臺部資深架構(gòu)師,主要負(fù)責(zé)全鏈路壓測、消息中間件、數(shù)據(jù)同步等產(chǎn)品的研發(fā)與落地,擁有千億級消息集群的運(yùn)維經(jīng)驗(yàn),不僅實(shí)踐經(jīng)驗(yàn)豐富,而且對RocketMQ的源碼有深入、系統(tǒng)的研究。
熱衷于中間件領(lǐng)域的技術(shù)分享,榮獲CSDN 2020博客之星等榮譽(yù)稱號,中間件興趣圈公眾號維護(hù)者。
張登
專家級架構(gòu)師,資深RocketMQ技術(shù)專家,在分布式系統(tǒng)架構(gòu)領(lǐng)域有豐富的實(shí)戰(zhàn)經(jīng)驗(yàn),擅長高并發(fā)系統(tǒng)的架構(gòu)設(shè)計與調(diào)優(yōu),主導(dǎo)過多家快遞公司EA規(guī)劃。
曾就職于德邦等公司,現(xiàn)任圓通科技公司技術(shù)平臺部架構(gòu)負(fù)責(zé)人,負(fù)責(zé)開發(fā)框架的搭建、中間件及混合云相關(guān)技術(shù)的平臺化建設(shè)。主導(dǎo)設(shè)計過消息分發(fā)、API網(wǎng)關(guān)、全鏈路監(jiān)控、分布式文件存儲等多個涉及百億級規(guī)模的基礎(chǔ)服務(wù)平臺。ITWorld1公眾號維護(hù)者,RocketMQ上海社區(qū)聯(lián)合創(chuàng)始人。
周繼鋒
資深RocketMQ技術(shù)專家,知名開源分布式數(shù)據(jù)庫中間件Mycat負(fù)責(zé)人。
擁有10余年大型項目架構(gòu)設(shè)計及實(shí)戰(zhàn)經(jīng)驗(yàn),曾主導(dǎo)過大量分布式、微服務(wù)、大數(shù)據(jù)相關(guān)的項目。在高并發(fā)、高可用、高可擴(kuò)展性、高可維護(hù)性等領(lǐng)域有豐富經(jīng)驗(yàn),對Hadoop、Spark的源碼進(jìn)行過深度分析并具有豐富的實(shí)戰(zhàn)經(jīng)驗(yàn)。
曾在醫(yī)學(xué)、互聯(lián)網(wǎng),SAAS行業(yè)擔(dān)任資深架構(gòu)師、技術(shù)總監(jiān)等職務(wù)。現(xiàn)任煉數(shù)成金高級講師,廣州鼎牛網(wǎng)絡(luò)、金石數(shù)字創(chuàng)始人。
第1章 閱讀源碼前的準(zhǔn)備1
1.1 獲取和調(diào)試RocketMQ的源碼1
1.1.1 Eclipse獲取RocketMQ源碼1
1.1.2 Eclipse調(diào)試RocketMQ源碼8
1.1.3 IntelliJ IDEA獲取RocketMQ源碼14
1.1.4 IntelliJ IDEA調(diào)試RocketMQ源碼16
1.2 RocketMQ源碼的目錄結(jié)構(gòu)23
1.3 RocketMQ的設(shè)計理念和設(shè)計目標(biāo)23
1.3.1 設(shè)計理念23
1.3.2 設(shè)計目標(biāo)24
1.4 本章小結(jié)26
第2章 RocketMQ路由中心NameServer27
2.1 NameServer架構(gòu)設(shè)計27
2.2 NameServer啟動流程29
2.3 NameServer路由注冊、故障剔除32
2.3.1 路由元信息32
2.3.2 路由注冊35
2.3.3 路由刪除40
2.3.4 路由發(fā)現(xiàn)43
2.4 本章小結(jié)44
第3章 RocketMQ消息發(fā)送46
3.1 漫談RocketMQ消息發(fā)送46
3.1.1 topic路由機(jī)制47
3.1.2 消息發(fā)送高可用設(shè)計48
3.2 認(rèn)識RocketMQ消息50
3.3 生產(chǎn)者啟動流程51
3.3.1 初識DefaultMQProducer51
3.3.2 消息生產(chǎn)者啟動流程54
3.4 消息發(fā)送基本流程55
3.4.1 消息長度驗(yàn)證56
3.4.2 查找主題路由信息57
3.4.3 選擇消息隊列60
3.4.4 消息發(fā)送65
3.5 批量消息發(fā)送72
3.6 本章小結(jié)74
第4章 RocketMQ消息存儲75
4.1 存儲概要設(shè)計75
4.1.1 RocketMQ存儲文件的組織方式76
4.1.2 內(nèi)存映射80
4.1.3 靈活多變的刷盤策略81
4.1.4 transientStorePoolEnable機(jī)制82
4.1.5 文件恢復(fù)機(jī)制82
4.2 初識消息存儲83
4.3 消息發(fā)送存儲流程84
4.4 存儲文件組織與內(nèi)存映射90
4.4.1 MappedFileQueue映射文件隊列 90
4.4.2 MappedFile內(nèi)存映射文件92
4.4.3 TransientStorePool99
4.5 RocketMQ存儲文件100
4.5.1 CommitLog文件101
4.5.2 ConsumeQueue文件102
4.5.3 Index文件106
4.5.4 checkpoint文件110
4.6 實(shí)時更新ConsumeQueue與Index文件111
4.6.1 根據(jù)消息更新ConsumeQueue文件113
4.6.2 根據(jù)消息更新Index文件114
4.7 ConsumeQueue與Index文件恢復(fù)115
4.7.1 Broker正常停止文件恢復(fù)118
4.7.2 Broker異常停止文件恢復(fù)120
4.8 文件刷盤機(jī)制121
4.8.1 Broker同步刷盤122
4.8.2 Broker異步刷盤125
4.9 過期文件刪除機(jī)制128
4.10 同步雙寫132
4.11 本章小結(jié)136
第5章 RocketMQ消息消費(fèi)137
5.1 RocketMQ消息消費(fèi)概述137
5.1.1 消費(fèi)隊列負(fù)載機(jī)制與重平衡138
5.1.2 并發(fā)消費(fèi)模型139
5.1.3 消息消費(fèi)進(jìn)度反饋機(jī)制139
5.2 消息消費(fèi)者初探141
5.3 消費(fèi)者啟動流程143
5.4 消息拉取146
5.4.1 PullMessageService實(shí)現(xiàn)機(jī)制147
5.4.2 ProcessQueue實(shí)現(xiàn)機(jī)制149
5.4.3 消息拉取基本流程150
5.5 消息隊列負(fù)載與重新分布機(jī)制167
5.6 消息消費(fèi)過程175
5.6.1 消息消費(fèi)176
5.6.2 消息確認(rèn)180
5.6.3 消費(fèi)進(jìn)度管理184
5.7 定時消息機(jī)制189
5.7.1 load()方法190
5.7.2 start()方法190
5.7.3 定時調(diào)度邏輯192
5.8 消息過濾機(jī)制194
5.9 順序消息199
5.9.1 消息隊列負(fù)載199
5.9.2 消息拉取200
5.9.3 消息消費(fèi)201
5.9.4 消息隊列鎖實(shí)現(xiàn)208
5.10 本章小結(jié)209
第6章 RocketMQ的ACL210
6.1 什么是ACL210
6.2 如何使用ACL211
6.2.1 Broker端開啟ACL211
6.2.2 客戶端使用ACL212
6.3 ACL實(shí)現(xiàn)原理214
6.3.1 Broker端ACL核心入口214
6.3.2 PlainAccessValidator詳解216
6.3.3 PlainPermissionManager詳解220
6.3.4 AclClientRPCHook詳解228
6.4 本章小結(jié)231
第7章 RocketMQ主從同步機(jī)制232
7.1 RocketMQ主從同步原理232
7.1.1 HAService整體工作機(jī)制233
7.1.2 AcceptSocketService實(shí)現(xiàn)原理233
7.1.3 GroupTransferService實(shí)現(xiàn)原理235
7.1.4 HAClient實(shí)現(xiàn)原理236
7.1.5 HAConnection實(shí)現(xiàn)原理239
7.2 RocketMQ讀寫分離機(jī)制245
7.3 RocketMQ元數(shù)據(jù)同步248
7.3.1 從節(jié)點(diǎn)主動同步元數(shù)據(jù)249
7.3.2 主節(jié)點(diǎn)消息拉取主動同步消費(fèi)進(jìn)度250
7.4 本章小結(jié)251
第8章 RocketMQ消息軌跡252
8.1 消息軌跡的引入目的和使用方法252
8.2 消息軌跡設(shè)計原理255
8.2.1 消息軌跡數(shù)據(jù)格式255
8.2.2 如何采集軌跡數(shù)據(jù)256
8.2.3 如何存儲消息軌跡數(shù)據(jù)257
8.3 消息軌跡實(shí)現(xiàn)原理257
8.3.1 尋找消息軌跡入口257
8.3.2 消息發(fā)送軌跡數(shù)據(jù)259
8.3.3 消息軌跡異步轉(zhuǎn)發(fā)實(shí)現(xiàn)機(jī)制261
8.4 本章小結(jié)265
第9章 RocketMQ主從切換266
9.1 主從切換引入目的266
9.2 Raft協(xié)議簡介267
9.2.1 Leader選舉267
9.2.2 日志復(fù)制268
9.3 RocketMQ DLedger主從切換之Leader選主269
9.3.1 DLedgerLeaderElector核心類及核心屬性270
9.3.2 選舉狀態(tài)管理器初始化271
9.3.3 選舉狀態(tài)機(jī)狀態(tài)流轉(zhuǎn)273
9.3.4 發(fā)送投票請求與處理投票請求280
9.3.5 發(fā)送心跳包與處理心跳包283
9.4 RocketMQ DLedger主從切換之存儲實(shí)現(xiàn)288
9.4.1 RocketMQ DLedger核心類及核心屬性288
9.4.2 RocketMQ DLedger數(shù)據(jù)存儲協(xié)議290
9.4.3 RocketMQ DLedger索引存儲協(xié)議291
9.5 RocketMQ DLedger主從切換之日志追加291
9.5.1 日志追加流程概述291
9.5.2 判斷Push隊列是否已滿293
9.5.3 Leader節(jié)點(diǎn)日志存儲293
9.5.4 Leader節(jié)點(diǎn)等待從節(jié)點(diǎn)日志復(fù)制響應(yīng)ACK298
9.6 RocketMQ DLedger主從切換之日志復(fù)制299
9.6.1 日志復(fù)制設(shè)計理念300
9.6.2 日志復(fù)制類設(shè)計體系301
9.6.3 日志轉(zhuǎn)發(fā)303
9.7 RocketMQ整合DLedger設(shè)計技巧與實(shí)現(xiàn)原理326
9.7.1 數(shù)據(jù)存儲兼容設(shè)計327
9.7.2 數(shù)據(jù)存儲兼容實(shí)現(xiàn)原理328
9.7.3 主從切換元數(shù)據(jù)同步機(jī)制337
9.8 RocketMQ主從切換實(shí)戰(zhàn)344
9.8.1 主從切換核心配置屬性344
9.8.2 搭建主從同步環(huán)境344
9.8.3 主從同步集群升級到主從切換346
9.9 本章小結(jié)350
第10章 RocketMQ監(jiān)控352
10.1 設(shè)計理念352
10.2 實(shí)現(xiàn)原理353
10.2.1 監(jiān)控相關(guān)類圖353
10.2.2 監(jiān)控原始數(shù)據(jù)采集流程355
10.3 監(jiān)控數(shù)據(jù)采樣機(jī)制356
10.3.1 監(jiān)控數(shù)據(jù)采樣356
10.3.2 根據(jù)采樣計算統(tǒng)計指標(biāo)357
10.4 如何采集監(jiān)控指標(biāo)359
10.5 監(jiān)控實(shí)戰(zhàn)應(yīng)用360
10.6 本章小結(jié)365
第11章 RocketMQ實(shí)戰(zhàn)366
11.1 消息批量發(fā)送366
11.2 消息發(fā)送隊列自選擇367
11.3 消息過濾368
11.3.1 TAG過濾模式368
11.3.2 SQL過濾模式368
11.3.3 類過濾模式369
11.4 事務(wù)消息371
11.5 Spring整合RocketMQ375
11.6 Spring Cloud整合RocketMQ376
11.7 RocketMQ監(jiān)控與運(yùn)維命令384
11.7.1 搭建RocketMQ監(jiān)控平臺rocketmq-console384
11.7.2 RocketMQ管理命令387
11.8 應(yīng)用場景分析423
11.9 實(shí)戰(zhàn)案例424
11.9.1 RocketMQ集群線上故障縮容實(shí)戰(zhàn)案例424
11.9.2 RocketMQ在線擴(kuò)容實(shí)戰(zhàn)427
11.10 本章小結(jié)430
附錄 A 參數(shù)說明431
附錄B RocketMQ各版本概述與升級建議436