RocketMQ實戰與原理解析

RocketMQ實戰與原理解析

本書由雲棲社區官方出品。 作者是阿里資深數據專家,對RocketMQ有深入的研究,並有大量的實踐經驗。在寫這本書之前,作者不僅系統、深入地閱讀了RocketMQ的原始碼,而且還向RocketMQ的官方開發團隊深入了解了它的諸多設計細節。作者結合自己多年使用RocketMQ的經驗,從開發和運維兩個維度,給出了大部分場景下的優秀實踐,能幫助讀者在學會使用和用好RocketMQ的同時,儘量少“踩坑”。同時,本書也結合源碼分析了分散式訊息佇列的原理,使讀者可以在複雜業務場景下定製有特殊功能的訊息佇列。

內容介紹

本書 由雲棲社區官方出品。

全書共13章,在邏輯上分為兩大部分:

第一部分(第1~8章):RocketMQ實戰

第1~2章詳細講解了RocketMQ如何快速入門,以及在生產環境下的配置和使用;

第3~4章具體講解了不同類型生產者和消費者的特點,以及分散式訊息佇列的協調者NameServer;

第5章從訊息的存儲、傳送、複製和高可用等多個維度講解了RocketMQ的內部機制;

第6章討論了訊息的可靠性,如何讓訊息佇列在滿足業務邏輯需求的同時穩定、可靠地長期運行;

第7章討論了在大流量場景下,吞吐量優先時RocketMQ的使用方法;

第8章介紹RocketMQ與SpringBoot、Spark、Flink以及自定義的運維工具等其它系統的對接方法;

第二部分(第9~13章):RocketMQ原理

首先對RocketMQ的源碼結構進行了整體介紹,然後深入地分析了NameServer、各種常用消費類、主從同步機制,以及基於Netty的通信的源碼實現。掌握這些原始碼以後,讀者可以快速定製屬於自己的具有特殊功能的訊息中間件。

作者介紹

楊開元

阿里巴巴數據專家,畢業於北京大學,有10年IT行業研發經驗。對RocketMQ有深入的研究,是RocketMQ源碼貢獻者。曾就職於甲骨文和獵豹移動,專注於大數據和實時計算。在大量的工作實踐中,對MySQL、J2EE、JVM、Spring、Hadoop、Kafka、Storm、Flink都有深入研究。喜歡剖析源碼,分析原理,為開源項目貢獻代碼。

RocketMQ官方團隊及行業專家聯袂推薦

從2013年開源,RocketMQ承載了阿里巴巴數年“雙十一”的峰值流量,並且被業界多個大型網際網路公司、大型央企和金融證券系統廣泛使用。本書從開發和運維的雙重視角對RocketMQ做了詳細的闡述,既能滿足入門讀者的需求,又能滿足需要通過原始碼了解RocketMQ工作原理的中高端讀者的需求。

——王小瑞 阿里巴巴資深技術專家/Apache RocketMQ PMC Chair

《RocketMQ實戰與原理解析》 一書介紹了分散式訊息中間件RocketMQ的方方面面,作者是大數據領域的技術專家,在分散式領域具有很豐富的理論積累和實戰經驗,書若其人,這本書各章節儘是實戰經驗,如庖丁解牛般剖析了Apache RocketMQ的原理和架構設計。

——周新宇 Apache RocketMQ PMC Member

這是一本非常具有實戰意義的手冊,可以幫助工程師快速了解RocketMQ並展開實操。理論清晰,案例實用,體現了作者深厚的技術功底。

——夏振宇 微瑞思創董事長

訊息中間件是分散式系統中依賴最廣泛的中間件產品,作為Apache中間件頂級項目,RocketMQ已經經歷了眾多大型網際網路公司的線上檢驗,不論是從可靠性還是吞吐量上都得到廣泛的認可。相信這本書的出版,對正在使用和計畫研究RockemMQ技術的開發者來說是個大大的福音。

——王曉東 鳳凰金融高級副總裁

訊息佇列是重要的中間件之一,已經成為大型套用不可或缺的組件。本書從原理和套用的角度對RocketMQ進行了詳細的講解,無論是入門還是進階,本書都可以作為你的良師益友。

——張彥龍滴滴出行高級數據專家

作者在RocketMQ領域有多年的一線開發、調優經驗,他將以獨到的方式帶領你走上RocketMQ的進階之路。本書可以幫助開發者,更加高效、快速地構建起分散式服務,將工程師從服務穩定性、分散式事務一致性的桎梏中解放出來。

——耿嘉安 360大數據專家

阿里自研的分散式訊息中間件RocketMQ已是Apache軟體基金會頂級項目。在“雙11”大促中訊息容量達到萬億級,適合電商、金融、大數據以及物聯網領域。在如今技術自主可控的發展趨勢下,相信RocketMQ會幫助更多開發者實現實踐創新。

——郭雪梅 雲棲社區總編

推薦序

在阿里巴巴技術發展初期,伴隨著淘寶業務的快速發展,網站流量呈現幾何級增長。單體巨無霸式的套用無法處理爆發式增長的流量,阿里內部從業務、組織層面進行了一次大的水平與垂直切分,拆分出用戶中心、商品中心、交易中心、評價中心等平台型套用,分散式電商系統的雛形由此誕生。阿里的訊息引擎就是在這樣的大背景下誕生的,並被套用於各個套用系統之間的異步解耦和削峰填谷。

從最初的日誌傳輸領域到後來阿里集團全維度線上業務的支撐,RocketMQ被廣泛用於交易、數據同步、快取同步、IM通訊、流計算、IoT等場景。在雙11全球狂歡節中,RocketMQ以萬億級的訊息總量支撐了全集團3000多個套用,為複雜的業務場景提供了系統解耦、削峰填谷的能力,保障了核心交易鏈路訊息流轉的低延遲、高吞吐,為阿里集團大中台的穩定性發揮了舉足輕重的作用。

為了更好地發展RocketMQ社區生態,2016年雙11前後,阿里巴巴將RocketMQ捐贈給Apache基金會,吸引了全球的開源愛好者參與到RocketMQ社區中,並於2017年9月成為Apache基金會的頂級項目。在開源社區的幫助下,RocketMQ具備了對接主流大數據流計算平台、離線上數據處理以及對接存儲平台的能力。

本書介紹了分散式訊息中間件RocketMQ的方方面面,作者為大數據領域的技術專家,在分散式領域具有很豐富的理論積累和實戰經驗。書如其人,書中各章節盡展實戰經驗,庖丁解牛般剖析了Apache RocketMQ的原理和架構設計。本書深入淺出地分析了RocketMQ的整體架構,分享了部署和運維的經驗,涵蓋RocketMQ的核心特性—高可用、高可靠機制,以及開源生態等。

本書作為國內首本全面解析Apache RocketMQ的書籍,對於希望了解RocketMQ技術內幕,以及想要掌握分散式系統設計理念的技術人員來說的確不容錯過。

——周新宇,Apache RocketMQ項目管理委員會成員

前 言

為什麼要寫這本書

幾年前在做一個項目的時候,若需要用到訊息佇列,簡單調研一下就會決定用Kafka,因為當時還不知道有RocketMQ。在我加入阿里後,當時有個項目需要用到訊息中間件,試用了RocketMQ,發現阿里開源的訊息中間件性能非常強大,但是上手有點費勁,因為現有文檔多是零零散散的博文。在沒有合適文檔指導的情況下,對系統中用到的RocketMQ模組心裡沒底,系統偶爾出現異常時總會束手無策,需要通過查看很多源碼,才能保證系統的穩定運行。

熟悉RocketMQ以後,我發現它是一款非常優秀的中間件產品,可以確保不丟訊息,而且效率很高。同時因為它是用Java開發的,所以修改起來比較容易。

在阿里內部,RocketMQ很好地服務了集團大大小小上千個套用,在每年的雙十一當天,更有不可思議的萬億級訊息通過RocketMQ流轉(在2017年的雙11當天,整個阿里巴巴集團通過RocketMQ流轉的線上訊息達到了萬億級,峰值TPS達到5600萬),在阿里大中台策略上發揮著舉足輕重的作用。所以如果有合適的參考文檔,RocketMQ會被更多人接受和使用,讓更多人不必重複造“輪子”。

我做了很多年開發,在學校課本上學的開發知識有限,大多數是通過看書和上網學到的,其中很多優秀的文章對自己幫助很大。所以我很希望能用這本書回饋技術社區中有需要的開發者們。

動筆寫這本書前,我系統地閱讀了RocketMQ的源碼,有些理解不夠透徹的地方請教了阿里RocketMQ開發團隊的同事,然後也總結了自己多年實際工作中的一些經驗。希望這本書能簡明扼要地說清楚RocketMQ的使用方法和核心原理。

讀者對象

希望學習分散式系統或分散式訊息佇列的開發人員。

服務端系統開發者,他們可以藉助高質量中間件來提高開發效率。

軟體架構師,他們可以通過訊息佇列最佳化複雜系統的設計。

本書特色

本書系統地介紹了RocketMQ這款優秀的分散式訊息佇列軟體,通過閱讀本書,讀者可以快速把RocketMQ套用到自己的項目中,也可以通過更改源碼定製符合自身業務的訊息中間件。

如何閱讀本書

本書分為兩大部分:

第一部分是RocketMQ實戰,包括第1~8章。這是本書的主體內容,可幫助讀者快速用好RocketMQ這個分散式訊息佇列。

這部分是按照由淺入深的方式撰寫的,為了讓讀者快速上手,首先介紹了搭建一個簡單RocketMQ集群的方法,以此來傳送和接收訊息;然後詳細介紹了如何用好Consumer和Producer,如何選擇合適的類以及進行參數設定;再進一步根據套用,說明如何讓RocketMQ在各種異常情況下保持穩定可靠,以及如何增大RocketMQ的吞吐量,從而在單位時間內處理更多的訊息。

第二部分是源碼分析,包括第9~13章。當讀者有特殊的業務需求,需要更改或擴展RocketMQ現有功能的時候,這部分內容能幫助讀者快速熟悉源碼,找到要下手更改的地方,快速實現想要的功能。

這部分也適合想通過源碼,深入學習訊息佇列的讀者閱讀。學習別人優秀的代碼是提升自己技術水平的一條有效途徑。

致謝

寫技術書籍很耗費時間,加之網際網路行業快節奏的工作方式,導致我寫這本書的時間大多是在周末和夜晚。在此感謝家人對我的支持和理解,尤其感謝我的妻子,沒有她對家庭的照顧和對我的鼓勵,這本書是無法完成的。

感謝阿里訊息中間件團隊的Leader王小瑞,是你從技術和寫作思路上給我很大的幫助。感謝訊息中間件團隊的其他同學,你們為開源社區貢獻了一個高質量的軟體,你們寫的很多高質量博文使開發者更容易理解RocketMQ。

感謝機械工業出版社的編輯楊福川、張錫鵬,感謝雲棲社區的刁雲怡,阿里的校友耿嘉安,是你們始終支持我的寫作,你們的引導和幫助使我能順利完成全部書稿。

謹以本書獻給我最親愛的家人,以及眾多熱愛軟體開發工作的朋友們!

楊開元

目 錄

推薦序

前言

第1章 快速入門1

1.1 訊息佇列功能介紹1

1.1.1 套用解耦1

1.1.2 流量消峰2

1.1.3 訊息分發3

1.2 RocketMQ簡介4

1.3 快速上手RocketMQ4

1.3.1 RocketMQ的下載、安裝和配置 5

1.3.2 啟動訊息佇列服務6

1.3.3 用命令行傳送和接收訊息6

1.3.4 關閉訊息佇列6

1.4 本章小結7

第2章 生產環境下的配置和使用8

2.1 RocketMQ各部分角色介紹8

2.2 多機集群配置和部署9

2.2.1 啟動多個NameServer和Broker10

2.2.2 配置參數介紹11

2.3 傳送/接收訊息示例13

2.4 常用管理命令15

2.5 通過圖形界面管理集群21

2.6 本章小結22

第3章 用適合的方式傳送和接收訊息23

3.1 不同類型的消費者23

3.1.1 DefaultMQPushConsumer的使用23

3.1.2 DefaultMQPushConsumer的處理流程25

3.1.3 DefaultMQPushConsumer的流量控制28

3.1.4 DefaultMQPullConsumer30

3.1.5 Consumer的啟動、關閉流程32

3.2 不同類型的生產者33

3.2.1 DefaultMQProducer 34

3.2.2 傳送延遲訊息36

3.2.3 自定義訊息傳送規則36

3.2.4 對事務的支持37

3.3 如何存儲佇列位置信息38

3.4 自定義日誌輸出42

3.5 本章小結44

第4章 分散式訊息佇列的協調者45

4.1 NameServer的功能45

4.1.1 集群狀態的存儲結構46

4.1.2 狀態維護邏輯47

4.2 各個角色間的互動流程48

4.2.1 互動流程源碼分析48

4.2.2 為何不用ZooKeeper50

4.3 底層通信機制50

4.3.1 Remoting模組51

4.3.2 協定設計和編解碼54

4.3.3 Netty庫56

4.4 本章小結56

第5章 訊息佇列的核心機制57

5.1 訊息存儲和傳送57

5.2 訊息存儲結構58

5.3 高可用性機制60

5.4 同步刷盤和異步刷盤61

5.5 同步複製和異步複製62

5.6 本章小結63

第6章 可靠性優先的使用場景64

6.1 順序訊息64

6.1.1 全局順序訊息64

6.1.2 部分順序訊息65

6.2 訊息重複問題67

6.3 動態增減機器67

6.3.1 動態增減NameServer67

6.3.2 動態增減Broker69

6.4 各種故障對訊息的影響70

6.5 訊息優先權72

6.6 本章小結73

第7章 吞吐量優先的使用場景74

7.1 在Broker端進行訊息過濾74

7.1.1 訊息的Tag和Key74

7.1.2 通過Tag進行過濾75

7.1.3 用SQL表達式的方式進行過濾75

7.1.4 Filter Server方式過濾77

7.2 提高Consumer處理能力78

7.3 Consumer的負載均衡80

7.3.1 DefaultMQPushConsumer的負載均衡80

7.3.2 DefaultMQPullConsumer的負載均衡81

7.4 提高Producer的傳送速度83

7.5 系統性能調優的一般流程85

7.6 本章小結87

第8章 和其他系統互動88

8.1 在SpringBoot中使用RocketMQ88

8.1.1 直接使用88

8.1.2 通過Spring Messaging方式使用90

8.2 直接使用雲上RocketMQ91

8.3 RocketMQ與Spark、Flink對接93

8.4 自定義開發運維工具93

8.4.1 開源版本運維工具功能介紹94

8.4.2 基於Tools模組開發自定義運維工具95

8.5 本章小結96

第9章 首個Apache中間件頂級項目97

9.1 RocketMQ的前世今生97

9.2 Apache頂級項目(TLP)之路98

9.3 源碼結構99

9.4 不斷疊代的代碼100

9.5 本章小結102

第10章 NameServer源碼解析103

10.1 模組入口代碼的功能103

10.1.1 入口函式103

10.1.2 解析命令行參數104

10.1.3 初始化NameServer的Controller105

10.2 NameServer的總控邏輯106

10.3 核心業務邏輯處理107

10.4 集群狀態存儲109

10.5 本章小結111

第11章 最常用的消費類112

11.1 整體流程112

11.1.1 上層接口類112

11.1.2 DefaultMQPushConsumer的實現者114

11.1.3 獲取訊息邏輯116

11.2 訊息的並發處理118

11.2.1 並發處理過程118

11.2.2 ProcessQueue對象121

11.3 生產者消費者的底層類122

11.3.1 MQClientInstance類的創建規則122

11.3.2 MQClientInstance類的功能124

11.4 本章小結127

第12章 主從同步機制128

12.1 同步屬性信息128

12.2 同步訊息體130

12.3 sync_master和async_master132

12.4 本章小結134

第13章 基於Netty的通信實現135

13.1 Netty介紹135

13.2 Netty架構總覽136

13.2.1 重新實現ByteBuffer136

13.2.2 統一的異步 I/O接口137

13.2.3 基於攔截鏈模式的事件模型138

13.2.4 高級組件139

13.3 Netty用法示例140

13.3.1 Discard伺服器140

13.3.2 查看收到的數據144

13.4 RocketMQ基於Netty的通信功能實現145

13.4.1 頂層抽象類145

13.4.2 自定義協定148

13.4.3 基於Netty的Server和Client151

13.5 本章小結152

相關詞條

熱門詞條

聯絡我們