為什么要寫這本書
隨著互聯(lián)網的不斷發(fā)展,互聯(lián)網企業(yè)的業(yè)務在飛速變化,推動著系統(tǒng)架構也在不斷地發(fā)生變化?傮w來說,系統(tǒng)架構大致經歷了單體應用架構垂直應用架構分布式架
構SOA架構微服務架構的演變。如今微服務技術越來越成熟,很多企業(yè)都采用微服務架構來支撐內部及對外的業(yè)務,尤其是在高并發(fā)大流量的電商業(yè)務場景下,微服務更是企業(yè)的架構模式。
微服務的普及也帶來了新的問題。原本單一的應用架構只需要連接一臺數(shù)據(jù)庫實例即可完成所有業(yè)務操作,業(yè)務方法的邏輯在一個事務中即可完成,涉及的所有數(shù)據(jù)庫操作要么全部提交,要么全部不提交,很容易實現(xiàn)數(shù)據(jù)的一致性。而在微服務架構下,原本單一的應用被拆分為一個個很小的服務,每個服務都有其獨立的業(yè)務和數(shù)據(jù)庫,服務與服務之間的交互通過接口或者遠程過程調用(Remote Procedure Call,RPC)的方式進行,此時,服務與服務之間的數(shù)據(jù)一致性問題就變得棘手了。
因為微服務這種架構模式本質上就是多個應用連接多個數(shù)據(jù)庫共同完成一組業(yè)務邏輯,所以數(shù)據(jù)一致性問題就凸顯出來了。除此之外,多個應用連接同一個數(shù)據(jù)庫和單個應用連接多個數(shù)據(jù)庫也會產生數(shù)據(jù)一致性問題?梢赃@么說,在互聯(lián)網行業(yè),任何企業(yè)都會或多或少地遇到數(shù)據(jù)一致性問題。業(yè)界將這種數(shù)據(jù)一致性問題稱為分布式事務問題。為了解決分布式事務問題,業(yè)界提出了一些著名的理論,比如CAP理論和Base理論,并針對這些理論提出了很多解決方案,比如解決強一致性分布式事務的DTP模型、XA事務、2PC模型、3PC模型,解決終一致性分布式事務的TCC、可靠消息終一致性、努力通知型等模型。不少企業(yè)和開源組織,甚至個人都基于這些模型實現(xiàn)了比較通用的分布式事務框架。
深入掌握分布式事務已然成為互聯(lián)網行業(yè)中每個中高級開發(fā)人員和架構師必須掌握的技能,而熟練掌握分布式事務產生的各種場景和解決方案也成為各大互聯(lián)網公司對應聘者的基本要求。
盡管對于分布式事務這個話題,業(yè)界有不少成熟的解決方案,但是縱觀整個圖書市場,幾乎找不到一本系統(tǒng)深入講解分布式事務的圖書。本書從實際需求出發(fā),全面且細致地介紹了有關分布式事務的基礎知識、解決方案、實現(xiàn)原理和源碼實戰(zhàn)。每章根據(jù)需要配有相關的原理圖和流程圖,并提供完整的實戰(zhàn)案例源碼。書中的每個解決方案都經過了高并發(fā)大流量生產環(huán)境的考驗,可以直接拿來解決實際生產環(huán)境中的分布式事務問題。通過對本書的閱讀和學習,讀者可以更加全面、深入、透徹地理解分布式事務的基礎、解決方案、原理和應用,提高應對分布式事務問題的處理能力和項目的實戰(zhàn)能力。
讀者對象
本書適合以下幾類讀者閱讀:
互聯(lián)網從業(yè)者,如中高級開發(fā)人員、架構師、技術經理、技術專家;
需要系統(tǒng)學習分布式事務的開發(fā)人員;
需要提高分布式事務開發(fā)水平的人員;
需要時常查閱分布式事務技術資料和開發(fā)案例的人員。
本書特色
1.大量圖解和開發(fā)案例
為了方便讀者理解,我們在介紹分布式事務的基礎、解決方案、原理、源碼與實戰(zhàn)章節(jié)中配有大量的圖解和圖表,同時在源碼與實戰(zhàn)章節(jié)配有完整的分布式事務案例,讀者可以參考本書的案例進行學習,并運行本書的案例代碼,以更深入地理解和掌握分布式事務。這些案例代碼和圖解的draw.io源文件收錄于隨書資料里,讀者可以從下面的鏈接獲取相關內容。
GitHub:https://github.com/dromara/distribute-transaction。
Gitee:https://gitee.com/dromara/distribute-transaction。
2.技術點全面
本書全面且細致地介紹了分布式事務的各項知識,包含分布式事務的基礎、解決方案、原理、源碼與實戰(zhàn)。通過閱讀本書,讀者能夠全面掌握分布式事務的原理和應用。
3.案例應用性強,具備較高的實用價值
本書關于分布式事務的各項技術點都配有相關的案例,都是實現(xiàn)分布式事務相關技術的典型案例,具有很強的實用性,方便讀者隨時查閱和參考。
另外,這些實戰(zhàn)案例大都是我們實際工作的總結,尤其是書中涉及的分布式事務框架,均是業(yè)界知名的開源分布式事務框架,稍加修改與完善便可應用于實際的生產環(huán)境中。
本書內容
本書分為如下四個部分。
部分 分布式事務基礎(第1~5章)
首先介紹事務的基本概念,然后介紹MySQL事務和Spring事務的實現(xiàn)原理,后介紹分布式事務的基本概念和理論知識。
第二部分 分布式事務解決方案(第6~7章)
以大量圖解的方式詳細介紹了分布式事務的各種解決方案,包括強一致性分布式事務解決方案和終一致性分布式事務解決方案。
第三部分 分布式事務原理(第8~11章)
以大量圖解的方式詳細講解了分布式事務的原理,包括XA強一致性分布式事務、TCC分布式事務、可靠消息終一致性分布式事務和努力通知型分布式事務。
第四部分 分布式事務源碼與實戰(zhàn)(第12~17章)
首先詳細講解了業(yè)界比較知名的ShardingSphere框架實現(xiàn)XA分布式事務的源碼,然后詳細剖析了Dromara開源社區(qū)的Hmily分布式事務框架實現(xiàn)TCC分布式事務的源碼,后分別對XA強一致性分布式事務、TCC分布式事務、可靠消息終一致性分布式事務和努力通知型分布式事務進行了實戰(zhàn)案例講解。
如何閱讀本書
對于沒有接觸過分布式事務的讀者,建議按照順序從第1章開始閱讀,并實現(xiàn)每一個案例。
對于有一定MySQL和Spring開發(fā)基礎的讀者,可以根據(jù)實際情況,有選擇性地閱讀分布式事務的相關章節(jié)。
對于書中涉及的每個分布式事務案例,讀者可以先自行思考實現(xiàn)方式,再閱讀相關的案例講解,了解各技術對應的原理細節(jié),以加深理解,達到事半功倍的學習效果。
勘誤和支持
本書是肖宇和冰河(排名不分先后)聯(lián)合撰寫的。由于水平有限,編寫時間倉促,書中難免會出現(xiàn)一些錯誤或者不準確的地方,懇請讀者批評指正。為此,我們特意在Dromara社區(qū)的GitHub上創(chuàng)建了一個單獨的倉庫用來記錄本書的勘誤信息,倉庫地址為https://github.com/dromara/transaction-book。讀者可以將書中的錯誤發(fā)布在Bug勘誤中,如果遇到任何問題,也可以記錄在這個倉庫中,我們將盡量在線上為讀者提供滿意的解答。如果有更多寶貴的建議或者意見,也可以聯(lián)系我們。
肖宇的聯(lián)系方式如下。
微信:xixy199195。
郵箱:xiaoyu@apache.org。
公眾號:Dromara開源組織。
冰河的聯(lián)系方式如下。
微信:hacker_binghe。
郵箱:1028386804@qq.com。
公眾號:冰河技術。
如果想獲得更多有關分布式事務或者開源框架的動態(tài),可以關注微信公眾號Dromara開源組織和冰河技術。
致謝
首先感謝張逸為本書作序。感謝鄭灝、劉啟榮、高新剛、沈建林、付曉巖、史少鋒、劉勛、張亮、代立冬、楊曉峰、于君澤、孫玄、沈劍、曾波、程超、張永倫、于雨、程軍和駱俊武(排名不分先后)等專家為本書撰寫推薦語。
感謝Dromara開源社區(qū)的兄弟姐妹們,感謝你們對社區(qū)的長期支持和貢獻。你們的支持是我們寫作的動力。
感謝機械工業(yè)出版社華章公司的楊福川老師和董惠芝編輯、韓蕊編輯在這一年多的時間里始終支持我們寫作,是你們的鼓勵和幫助引導我們順利完成了全部書稿。
感謝家人在我們寫作期間默默給予我們支持與鼓勵,并時刻為我們傳遞著信心和力量!
后,感謝所有支持、鼓勵和幫助過我們的人。謹以此書獻給我們親愛的家人,以及眾多熱愛開源事業(yè)和關注Dromara開源社區(qū)的朋友們!
肖宇、冰河
推薦語
序
前言
部分 分布式事務基礎
第1章 事務的基本概念2
1.1 事務的特性2
1.1.1 原子性3
1.1.2 一致性3
1.1.3 隔離性3
1.1.4 持久性3
1.2 事務的類型4
1.2.1 扁平事務4
1.2.2 帶有保存點的扁平事務4
1.2.3 鏈式事務5
1.2.4 嵌套事務5
1.2.5 分布式事務5
1.3 本地事務5
1.3.1 基本概念6
1.3.2 本地事務的執(zhí)行流程6
1.3.3 本地事務的優(yōu)缺點7
1.4 MySQL事務基礎7
1.4.1 并發(fā)事務帶來的問題7
1.4.2 MySQL事務隔離級別9
1.4.3 MySQL中各種事務隔離級別的區(qū)別10
1.4.4 MySQL事務隔離級別實踐11
1.4.5 MySQL中鎖的分類19
1.4.6 死鎖的產生和預防23
1.4.7 MySQL中的死鎖問題24
1.4.8 InnoDB中的MVCC原理25
1.5 本章小結28
第2章 MySQL事務的實現(xiàn)原理29
2.1 Redo Log29
2.1.1 Redo Log基本概念29
2.1.2 Redo Log基本原理30
2.1.3 Redo Log刷盤規(guī)則30
2.1.4 Redo Log刷盤實踐32
2.1.5 Redo Log寫入機制34
2.1.6 Redo Log的LSN機制35
2.1.7 Redo Log相關參數(shù)36
2.2 Undo Log36
2.2.1 Undo Log基本概念36
2.2.2 Undo Log存儲方式37
2.2.3 Undo Log基本原理37
2.2.4 Undo Log實現(xiàn)MVCC機制37
2.2.5 Undo Log相關參數(shù)40
2.3 BinLog41
2.3.1 BinLog基本概念41
2.3.2 BinLog記錄模式41
2.3.3 BinLog文件結構42
2.3.4 BinLog寫入機制43
2.3.5 BinLog組提交機制43
2.3.6 BinLog與Redo Log的區(qū)別45
2.3.7 BinLog相關參數(shù)45
2.4 MySQL事務流程46
2.4.1 MySQL事務執(zhí)行流程46
2.4.2 MySQL事務恢復流程47
2.5 MySQL中的XA事務48
2.5.1 XA事務的基本原理48
2.5.2 MySQL XA事務語法49
2.5.3 JDBC操作MySQL XA事務52
2.6 本章小結54
第3章 Spring事務的實現(xiàn)原理55
3.1 Spring事務原理55
3.1.1 JDBC直接操作事務55
3.1.2 使用Spring管理事務56
3.1.3 Spring事務分類57
3.1.4 Spring事務超時57
3.1.5 Spring事務回滾規(guī)則57
3.2 Spring事務三大接口57
3.2.1 PlatformTransactionManager接口57
3.2.2 TransactionDefinition接口58
3.2.3 TransactionStatus接口60
3.3 Spring事務隔離級別61
3.4 Spring事務傳播機制62
3.4.1 7種事務傳播機制類型62
3.4.2 常用的事務傳播類型65
3.5 Spring事務嵌套實踐65
3.5.1 環(huán)境準備66
3.5.2 實踐場景一71
3.5.3 實踐場景二72
3.5.4 實踐場景三73
3.5.5 實踐場景四74
3.5.6 實踐場景五75
3.5.7 實踐場景六76
3.5.8 實踐場景七77
3.6 Spring事務失效的場景79
3.6.1 數(shù)據(jù)庫不支持事務79
3.6.2 事務方法未被Spring管理79
3.6.3 方法沒有被public修飾79
3.6.4 同一類中的方法調用80
3.6.5 未配置事務管理器80
3.6.6 方法的事務傳播類型不支持事務81
3.6.7 不正確地捕獲異常81
3.6.8 標注錯誤的異常類型82
3.7 本章小結83
第4章 分布式事務的基本概念84
4.1 分布式系統(tǒng)架構84
4.1.1 產生的背景84
4.1.2 架構目標和架構原則85
4.2 分布式系統(tǒng)架構演進86
4.2.1 單體應用架構86
4.2.2 垂直應用架構87
4.2.3 分布式架構88
4.2.4 SOA架構89
4.2.5 微服務架構89
4.3 分布式事務場景90
4.3.1 跨JVM進程90
4.3.2 跨數(shù)據(jù)庫實例91
4.3.3 多服務訪問單數(shù)據(jù)庫91
4.4 數(shù)據(jù)一致性92
4.4.1 數(shù)據(jù)的一致性問題92
4.4.2 數(shù)據(jù)一致性解決方案93
4.5 本章小結93
第5章 分布式事務的理論知識94
5.1 CAP理論94
5.1.1 一致性94
5.1.2 可用性95
5.1.3 分區(qū)容忍性95
5.1.4 CAP的組合96
5.2 Base理論97
5.3 本章小結98
第二部分 分布式事務解決方案
第6章 強一致性分布式事務解決方案100
6.1 強一致性事務概述100
6.1.1 典型方案100
6.1.2 適用場景101
6.1.3 優(yōu)缺點101
6.2 DTP模型101
6.2.1 DTP模型的重要概念101
6.2.2 DTP模型的執(zhí)行流程102
6.3 2PC模型102
6.3.1 2PC模型的執(zhí)行流程103
6.3.2 事務執(zhí)行成功的流程103
6.3.3 事務執(zhí)行失敗的流程104
6.3.4 2PC模型存在的問題105
6.4 3PC模型105
6.4.1 事務執(zhí)行成功的流程105
6.4.2 事務執(zhí)行失敗的流程106
6.4.3 3PC模型中存在的問題108
6.5 本章小結108
第7章 終一致性分布式事務解決方案109
7.1 終一致性分布式事務概述109
7.1.1 典型方案109
7.1.2 適用場景110
7.1.3 優(yōu)缺點110
7.2 服務模式110
7.2.1 可查詢操作111
7.2.2 冪等操作111
7.2.3 TCC操作112
7.2.4 可補償操作113
7.3 TCC解決方案113
7.3.1 適用場景114
7.3.2 需要實現(xiàn)的服務模式114
7.3.3 方案的執(zhí)行流程114
7.3.4 方案的優(yōu)缺點115
7.3.5 需要注意的問題116
7.4 可靠消息終一致性解決方案117
7.4.1 適用場景117
7.4.2 需要實現(xiàn)的服務模式117
7.4.3 方案的執(zhí)行流程118
7.4.4 方案的優(yōu)缺點119
7.4.5 需要注意的問題120
7.5 努力通知型解決方案120
7.5.1 適用場景120
7.5.2 需要實現(xiàn)的服務模式121
7.5.3 方案的執(zhí)行流程121
7.5.4 方案的優(yōu)缺點122
7.5.5 需要注意的問題122
7.5.6 努力通知與可靠消息終一致性的區(qū)別123
7.6 本章小結123
第三部分 分布式事務原理
第8章 XA強一致性分布式事務原理126
8.1 X/Open DTP模型與XA規(guī)范126
8.1.1 DTP模型126
8.1.2 XA規(guī)范127
8.1.3 JTA規(guī)范127
8.1.4 XA二階段提交128
8.2 MySQL對XA規(guī)范的支持129
8.2.1 MySQL XA事務的語法129
8.2.2 MySQL XID詳解129
8.2.3 MySQL XA事務的狀態(tài)130
8.2.4 MySQL XA的問題131
8.3 XA規(guī)范的問題思考132
8.3.1 XA規(guī)范的缺陷132
8.3.2 XA流程的優(yōu)化與異常思考133
8.3.3 解決XA數(shù)據(jù)不一致的問題134
8.3.4 解決事務管理器的單點故障問題135
8.4 主流的解決方案135
8.5 本章小結136
第9章 TCC分布式事務原理137
9.1 TCC核心思想137
9.2 TCC實現(xiàn)原理139
9.2.1 TCC核心組成139
9.2.2 TCC核心原理140
9.3 TCC核心流程142
9.3.1 業(yè)務場景介紹142
9.3.2 Try階段流程143
9.3.3 Confirm階段流程144
9.3.4 Cancel階段流程145
9.4 TCC關鍵技術146
9.5 本章小結147
第10章 可靠消息終一致性分布式事務原理148
10.1 基本原理148
10.2 本地消息表149
10.2.1 實現(xiàn)原理149
10.2.2 優(yōu)缺點150
10.3 獨立消息服務151
10.3.1 實現(xiàn)原理151
10.3.2 優(yōu)缺點152
10.4 RocketMQ事務消息153
10.4.1 實現(xiàn)原理153
10.4.2 RocketMQ本地事務監(jiān)聽接口154
10.5 消息發(fā)送的一致性155
10.5.1 消息發(fā)送與確認機制155
10.5.2 消息發(fā)送的不一致性156
10.5.3 如何保證消息發(fā)送的一致性157
10.6 消息接收的一致性158
10.6.1 消息接收與確認機制158
10.6.2 消息接收的不一致性159
10.6.3 如何保證消息接收的一致性159
10.7 消息的可靠性161
10.7.1 消息發(fā)送的可靠性161
10.7.2 消息存儲的可靠性161
10.7.3 消息消費的可靠性162
10.8 本章小結162
第11章 努力通知型分布式事務原理163
11.1 適用場景163
11.2 方案特點164
11.3 基本原理164
11.4 異常處理165
11.5 本章小結166
第四部分 分布式事務源碼與實戰(zhàn)
第12章 XA強一致性分布式事務解決方案源碼解析168
12.1 分布式數(shù)據(jù)一致性場景的搭建168
12.1.1 構建環(huán)境168
12.1.2 準備環(huán)境169
12.1.3 修改配置169
12.1.4 啟動171
12.1.5 驗證171
12.2 ShardingSphere對XA分布式事務方案的整合172
12.2.1 ShardingTransactionManager接口172
12.2.2 XATransactionManager接口174
12.2.3 DataSourceSwapper類174
12.2.4 XAConnectionWrapper接口175
12.2.5 XA事務初始化175
12.2.6 XA資源注冊176
12.3 ShardingSphere對Atomikos方案的實戰(zhàn)與源碼解析178
12.3.1 Atomikos-XA分布式事務初始化流程178
12.3.2 Atomikos-XA分布式事務Begin流程183
12.3.3 Atomikos-XA分布式事務資源注冊原理185
12.3.4 Atomikos-XA分布式事務Commit流程186
12.3.5 Atomikos-XA分布式事務Rollback流程191
12.3.6 Atomikos-XA分布式事務恢復流程193
12.4 ShardingSphere對Narayana方案的實戰(zhàn)與源碼解析198
12.4.1 Narayana環(huán)境搭建198
12.4.2 Narayana-XA分布式事務初始化流程199
12.4.3 Narayana-XA分布式事務Begin流程206
12.4.4 Narayana-XA分布式事務資源注冊208
12.4.5 Narayana-XA分布式事務Commit流程208
12.4.6 Narayana-XA分布式事務Rollback流程211
12.4.7 Narayana-XA分布式事務恢復流程212
12.5 本章小結216
第13章 Hmily-TCC分布式事務解決方案源碼解析217
13.1 Hmily-TCC分布式場景的搭建217
13.1.1 準備環(huán)境218
13.1.2 下載源碼并編譯220
13.1.3 修改配置220
13.1.4 啟動程序222
13.1.5 驗證223
13.2 Hmily框架初始流程源碼解析223
13.2.1 加載配置225
13.2.2 初始化事務日志存儲229
13.2.3 初始化事務恢復調度器234
13.2.4 初始化事件分發(fā)器235
13.2.5 初始化Metrics監(jiān)控信息236
13.3 Hmily-TCC分布式事務源碼解析238
13.3.1 Try流程源碼解析239
13.3.2 Confirm流程源碼解析253
13.3.3 Cancel流程源碼解析258
13.4 Hmily對RPC框架的支持261
13.4.1 對Dubbo框架的支持261
13.4.2 對Spring Cloud框架的支持263
13.4.3 對BRPC框架的支持265
13.4.4 對Motan框架的支持267
13.4.5 對gRPC框架的支持268
13.4.6 對Sofa-RPC框架的支持270
13.4.7 對Tars框架的支持272
13.5 Hmily-TCC事務恢復源碼解析273
13.5.1 邏輯處理274
13.5.2 事務恢復275
13.6 本章小結276
第14章 XA強一致性分布式事務實戰(zhàn)277
14.1 場景說明277
14.2 程序模塊說明278
14.3 數(shù)據(jù)庫表設計278
14.4 程序實現(xiàn)279
14.4.1 項目搭建279
14.4.2 持久層的實現(xiàn)287
14.4.3 業(yè)務邏輯層的實現(xiàn)288
14.4.4 接口層的實現(xiàn)289
14.4.5 項目啟動類的實現(xiàn)290
14.5 測試程序290
14.6 本章小結292
第15章 TCC分布式事務實戰(zhàn)293
15.1 場景說明293
15.2 程序模塊說明294
15.3 數(shù)據(jù)庫表設計295
15.4 實現(xiàn)項目公共模塊297
15.4.1 項目搭建297
15.4.2 持久層的實現(xiàn)300
15.4.3 Dubbo接口的定義304
15.5 實現(xiàn)轉出銀行微服務305
15.5.1 項目搭建305
15.5.2 業(yè)務邏輯層的實現(xiàn)311
15.5.3 接口層的實現(xiàn)313
15.5.4 項目啟動類的實現(xiàn)313
15.6 實現(xiàn)轉入銀行微服務314
15.6.1 業(yè)務邏輯層的實現(xiàn)314
15.6.2 項目啟動類的實現(xiàn)315
15.7 測試程序316
15.8 本章小結318
第16章 可靠消息終一致性分布式事務實戰(zhàn)319
16.1 場景說明319
16.2 程序模塊說明321
16.3 RocketMQ環(huán)境搭建與測試321
16.3.1 搭建Java環(huán)境321
16.3.2 搭建RocketMQ環(huán)境322
16.3.3 測試RocketMQ環(huán)境324
16.4 數(shù)據(jù)庫表設計326
16.5 實現(xiàn)訂單微服務328
16.5.1 項目搭建328
16.5.2 持久層的實現(xiàn)333
16.5.3 業(yè)務邏輯層的實現(xiàn)335
16.5.4 接口層的實現(xiàn)338
16.5.5 項目啟動類的實現(xiàn)338
16.6 實現(xiàn)庫存微服務339
16.6.1 項目搭建339
16.6.2 持久層的實現(xiàn)339
16.6.3 業(yè)務邏輯層的實現(xiàn)341
16.6.4 項目啟動類的實現(xiàn)343
16.7 測試程序343
16.8 本章小結345
第17章 努力通知型分布式事務實戰(zhàn)347
17.1 場景說明347
17.2 程序模塊說明348
17.3 數(shù)據(jù)庫表設計348
17.4 實現(xiàn)賬戶微服務350
17.4.1 項目搭建350
17.4.2 持久層的實現(xiàn)355
17.4.3 業(yè)務邏輯層的實現(xiàn)358
17.4.4 接口層的實現(xiàn)360
17.4.5 啟動類的實現(xiàn)360
17.5 實現(xiàn)充值微服務361
17.5.1 項目搭建與持久層的實現(xiàn)361
17.5.2 業(yè)務邏輯層的實現(xiàn)361
17.5.3 接口層的實現(xiàn)362
17.5.4 啟動類的實現(xiàn)363
17.6 測試程序363
17.7 本章小結365