架構(gòu)設(shè)計2.0:大型分布式系統(tǒng)架構(gòu)方法論與實踐
定 價:105 元
- 作者:余春龍
- 出版時間:2021/12/1
- ISBN:9787121425073
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP316.4
- 頁碼:320
- 紙張:
- 版次:01
- 開本:16開
本書深刻總結(jié)了作者在大型互聯(lián)網(wǎng)公司長期的實戰(zhàn)經(jīng)驗,系統(tǒng)化地闡述了構(gòu)建大型分布式系統(tǒng)所需要的技術(shù)架構(gòu)與業(yè)務(wù)架構(gòu)方法論,并輔與詳盡的實踐剖析。全書分為三大部分:第1部分完整討論了分布式架構(gòu)的幾大核心問題,包括高并發(fā)、高可靠性、高可用、數(shù)據(jù)一致性(包括分布式事務(wù)、Paxos/Raft一致性算法)、跨城容災(zāi)與異地多活、CAP理論;第2部分從業(yè)務(wù)架構(gòu)思維、需求分析、業(yè)務(wù)建模、領(lǐng)域驅(qū)動設(shè)計與微服務(wù)等角度探討業(yè)務(wù)架構(gòu);第3部分是案例實戰(zhàn),通過眾多的業(yè)界實際案例來對理論有一個更為直觀的介紹。通過本書,讀者可以對構(gòu)建大型復(fù)雜系統(tǒng)的方法論有全局的認識,對軟件架構(gòu)的核心能力有深刻的理解,對個人的技術(shù)成長起到一定的借鑒作用,提升思維認知。本書不僅適合工程師、架構(gòu)師閱讀,也適合企業(yè)系統(tǒng)開發(fā)人員在內(nèi)的軟件開發(fā)從業(yè)人員閱讀。
余春龍,中科院軟件所碩士畢業(yè),先后在多家一線互聯(lián)網(wǎng)公司任架構(gòu)師,歷經(jīng)各種大規(guī)模研發(fā)團隊的架構(gòu)實踐,在海量高并發(fā)高可用架構(gòu)、業(yè)務(wù)建模、領(lǐng)域驅(qū)動設(shè)計、技術(shù)規(guī)劃與技術(shù)管理等方面具備豐富的工程經(jīng)驗,形成了自己完整的一套架構(gòu)方法論。
第1部分 分布式架構(gòu)
第1章 高并發(fā) 4
1.1 問題分類 4
1.1.1 側(cè)重于“高并發(fā)讀”的系統(tǒng) 4
1.1.2 側(cè)重于“高并發(fā)寫”的系統(tǒng) 6
1.1.3 同時側(cè)重于“高并發(fā)讀”和“高并發(fā)寫”的系統(tǒng) 7
1.2 高并發(fā)讀 8
1.2.1 策略1:動靜分離與CDN加速 8
1.2.2 策略2:加緩存 9
1.2.3 策略3:并發(fā)讀與Pipeline 10
1.2.4 策略4:批量讀 12
1.2.5 策略5:重寫輕讀 12
1.2.6 總結(jié):讀寫分離(CQRS架構(gòu)) 14
1.3 高并發(fā)寫 16
1.3.1 策略1:數(shù)據(jù)分片 16
1.3.2 策略2:任務(wù)分片 17
1.3.3 策略3:異步化與Pipeline 19
1.3.4 策略4:批量 26
1.3.5 策略5:串行化+多進程單線程+異步I/O 27
第2章 高可靠 29
2.1 容量評估與規(guī)劃 29
2.1.1 理論基礎(chǔ):吞吐量、響應(yīng)時間與并發(fā)數(shù)三者關(guān)系 29
2.1.2 容量規(guī)劃 31
2.1.3 單機最大QPS估算方法1: CPU密集型與I/O密集型的區(qū)分 32
2.1.4 單機最大QPS估算方法2:壓力測試 33
2.2 過載保護:限流與熔斷 35
2.2.1 限流的兩種限制維度 35
2.2.2 單機限流的算法 35
2.2.3 單機限流的實現(xiàn) 37
2.2.4 中央限流 40
2.2.5 熔斷 41
2.3 超時與重試 42
2.4 隔離 43
2.5 有損服務(wù)與降級 44
2.6 灰度發(fā)布、備份與回滾 45
2.7 監(jiān)控體系與日志報警 47
第3章 分布式事務(wù) 50
3.1 隨處可見的分布式事務(wù)問題 51
3.1.1 緩存和數(shù)據(jù)庫的一致性問題 51
3.1.2 消息中間件和數(shù)據(jù)庫的一致性問題 51
3.1.3 兩個數(shù)據(jù)庫的一致性問題 51
3.1.4 服務(wù)和數(shù)據(jù)庫的一致性問題 51
3.1.5 兩個服務(wù)的一致性問題 52
3.1.6 兩個文件的一致性問題 52
3.2 分布式事務(wù)解決方案匯總 52
3.2.1 2PC 52
3.2.2 最終一致性:第一種實現(xiàn)方案 56
3.2.3 最終一致性:第二種實現(xiàn)方案(基于事務(wù)消息) 59
3.2.4 TCC 61
3.2.5 事務(wù)狀態(tài)表+事務(wù)補償 63
3.2.6 同步雙寫(多寫)+異步對賬 64
3.2.7 妥協(xié)方案:弱一致性+基于狀態(tài)的事后補償 66
3.2.8 妥協(xié)方案:重試+回滾+報警+人工修復(fù) 68
3.2.9 阿里云Seata框架 68
3.2.10 總結(jié) 73
第4章 高可用 74
4.1 高可用架構(gòu)的思維框架 74
4.1.1 如何實現(xiàn)故障探測 75
4.1.2 如何解決腦裂問題 75
4.1.3 如何做到數(shù)據(jù)一致性 76
4.1.4 如何做到對客戶端透明 76
4.1.5 如何解決高可用依賴的連環(huán)套問題 76
4.2 接入層高可用 78
4.2.1 DNS層高可用:廣域網(wǎng)負載均衡 79
4.2.2 接入網(wǎng)關(guān)高可用:局域網(wǎng)負載均衡 79
4.2.3 Nginx高可用 81
4.2.4 Tomcat高可用 81
4.3 業(yè)務(wù)邏輯層(微服務(wù)層)高可用 82
4.4 存儲層高可用 83
4.4.1 RedisCluster的高可用案例 83
4.4.2 HDFS的高可用案例 85
第5章 高可用:多副本一致性算法 89
5.1 高可用且強一致性到底有多難 89
5.1.1 Kafka的消息丟失問題 89
5.1.2 Kafka的消息錯亂問題 93
5.1.3 MySQL半同步復(fù)制數(shù)據(jù)不一致問題 94
5.2 Paxos算法解析 96
5.2.1 Paxos解決什么問題 96
5.2.2 復(fù)制狀態(tài)機 99
5.2.3 一個樸素而深刻的想法 101
5.2.4 Basic Paxos算法 102
5.2.5 Multi Paxos算法 105
5.3 Raft算法解析 108
5.3.1 為“可理解性”而設(shè)計 108
5.3.2 單點寫入 108
5.3.3 日志結(jié)構(gòu) 109
5.3.4 階段1:Leader選舉 113
5.3.5 階段2:日志復(fù)制 115
5.3.6 階段3:恢復(fù)階段 116
5.3.7 安全性保證 116
5.4 Zab算法解析 119
5.4.1 復(fù)制狀態(tài)機與Primary-Backup System 119
5.4.2 zxid 121
5.4.3 “序”:亂序提交與順序提交 122
5.4.4 Leader選舉:FLE算法 124
5.4.5 正常階段:2階段提交 125
5.4.6 恢復(fù)階段 126
5.5 三種算法對比與工程實現(xiàn) 127
第6章 高可用:跨城容災(zāi)與異地多活 129
6.1 跨城的關(guān)鍵物理約束:時延 129
6.2 多IDC無復(fù)制架構(gòu) 130
6.2.1 單寫多讀架構(gòu) 130
6.2.2 各IDC自治架構(gòu) 132
6.3 同城同步復(fù)制,跨城異步復(fù)制:2地3中心 133
6.4 跨城同步復(fù)制:3地5中心 133
6.5 跨城異步復(fù)制 135
6.5.1 不能容忍數(shù)據(jù)不一致:實現(xiàn)部分的強一致 136
6.5.2 可以容忍數(shù)據(jù)不一致:事后修復(fù) 137
6.5.3 加快異步復(fù)制速度 137
6.6 單元化 138
6.6.1 到底什么是單元化 138
6.6.2 什么系統(tǒng)不能單元化 140
第7章 CAP理論 142
7.1 CAP理論的誤解 142
7.2 現(xiàn)實世界不存在“強一致性”(PACELC理論) 143
第2部分 業(yè)務(wù)架構(gòu)
第8章 業(yè)務(wù)架構(gòu)定義 148
8.1 各式各樣的方法論 148
8.2 什么不是業(yè)務(wù)架構(gòu) 149
8.3 以終為始:業(yè)務(wù)架構(gòu)到底解決哪些問題 150
第9章 深刻理解現(xiàn)實世界:識別“真正的”需求 153
9.1 探究問題的本源 153
9.2 系統(tǒng)化思維 154
9.3 信息傳播的遞減效應(yīng) 155
9.4 主要矛盾與次要矛盾 156
9.5 產(chǎn)品手段與技術(shù)手段的權(quán)衡 156
第10章 深刻理解現(xiàn)實世界:從整體上去看待需求 158
10.1 利益相關(guān)者分析:看需求先看人 158
10.2 金字塔原理:不重不漏地拆解問題 160
10.3 需求的兩種表現(xiàn)形式:業(yè)務(wù)流程與業(yè)務(wù)規(guī)則 162
10.4 “業(yè)務(wù)”的閉環(huán)性 163
第11章 不同粒度的建模方法與原則 165
11.1 單個系統(tǒng)內(nèi)部的建模方法與原則 165
11.1.1 建模的通用思維:搭積木 165
11.1.2 面向?qū)ο蠼5幕静襟E 167
11.2 問題空間 169
11.2.1 深刻理解專業(yè)名詞 169
11.2.2 重要信息“顯性化” 170
11.2.3 抽象 171
11.3 解決方案空間 174
11.3.1 重構(gòu) 174
11.3.2 設(shè)計模式 175
11.3.3 面向?qū)ο蟮奈宕笤瓌t(SOLID原則) 178
11.4 跨系統(tǒng)、跨團隊的建模方法與原則 179
11.4.1 康威定律 179
11.4.2 領(lǐng)域的劃分:高內(nèi)聚與低耦合 181
11.4.3 邊界思維:接口的設(shè)計比實現(xiàn)重要得多 182
11.4.4 多視角描述同一個架構(gòu):架構(gòu)4+1/5+1視圖 184
第12章 常用架構(gòu)模式 186
12.1 分層架構(gòu)模式與“偽分層” 186
12.2 管道-過濾器架構(gòu)模式 189
12.3 狀態(tài)機架構(gòu)模式 190
12.4 業(yè)務(wù)切面/業(yè)務(wù)閉環(huán)架構(gòu)模式 192
12.5 規(guī)則引擎 193
12.5.1 什么是規(guī)則 194
12.5.2 業(yè)務(wù)代碼如何抽象成一條條規(guī)則 194
12.5.3 規(guī)則描述語言DSL 196
12.5.4 規(guī)則引擎的兩種執(zhí)行方式 197
12.6 工作流引擎 198
第13章 領(lǐng)域驅(qū)動設(shè)計 200
13.1 傳統(tǒng)開發(fā)模式:面向數(shù)據(jù)庫表的“面條式”代碼 200
13.2 DDD的基本概念 201
13.3 DDD的方法論 203
13.3.1 領(lǐng)域模型和數(shù)據(jù)模型的區(qū)別 203
13.3.2 基于DDD的分層架構(gòu) 203
13.3.3 領(lǐng)域模型和數(shù)據(jù)模型如何映射 204
13.3.4 DDD中的讀寫分離模式 206
第14章 DDD的折中與微服務(wù)架構(gòu) 207
14.1 軟件建模本身的困難 207
14.2 “無建模”帶來的各種問題 209
14.3 DDD的困難 210
14.4 折中后的DDD 211
14.4.1 宏觀層面:遵循子域、限界上下文、微服務(wù)三者的映射關(guān)系 211
14.4.2 微觀層面:不遵循DDD的方法論 212
14.5 三個不同層次的讀寫分離架構(gòu) 212
第3部分 案例實戰(zhàn)
第15章 基礎(chǔ)架構(gòu)案例實戰(zhàn) 216
15.1 分布式鎖 216
15.1.1 分布式鎖的使用場景 216
15.1.2 分布式鎖的常用實現(xiàn)方式與問題 216
15.1.3 用串行化代替分布式鎖 217
15.2 服務(wù)注冊與服務(wù)發(fā)現(xiàn)中心 219
15.2.1 服務(wù)注冊與服務(wù)發(fā)現(xiàn)中心的基本原理 219
15.2.2 服務(wù)路由表的數(shù)據(jù)延遲與解決方案 220
15.2.3 服務(wù)注冊中心應(yīng)該是AP系統(tǒng),還是CP系統(tǒng) 221
15.2.4 配置中心應(yīng)該是AP系統(tǒng),還是CP系統(tǒng) 222
15.3 分布式ID生成系統(tǒng) 222
15.3.1 全局唯一,趨勢遞增 223
15.3.2 全局唯一,單調(diào)遞增 225
15.3.3 全局唯一,連續(xù)遞增 229
第16章 C端業(yè)務(wù)系統(tǒng)案例實戰(zhàn) 230
16.1 電商庫存系統(tǒng) 230
16.1.1 業(yè)務(wù)背景與需求分析 230
16.1.2 高并發(fā)讀與寫:中央緩存與本地緩存的權(quán)衡 234
16.1.3 數(shù)據(jù)一致性:冪等問題 238
16.1.4 數(shù)據(jù)一致性:扣減多個商品的原子性問題 239
16.1.5 數(shù)據(jù)一致性:并發(fā)更新的鎖問題 239
16.1.6 數(shù)據(jù)一致性:流水和庫存表如何對賬 240
16.1.7 業(yè)務(wù)架構(gòu)進階之一:一個庫存模型同時支持自營與平臺
兩個商業(yè)模式 241
16.1.8 業(yè)務(wù)架構(gòu)進階之二:分區(qū)售賣問題 243
16.1.9 業(yè)務(wù)架構(gòu)進階之三:供應(yīng)鏈庫存(不光要管售賣,還要管采購) 244
16.1.10 業(yè)務(wù)架構(gòu)進階之四:以“單據(jù)”為中心的庫存對賬 245
16.1.11 業(yè)務(wù)架構(gòu)進階之五:先采后賣,還是先賣后采 247
16.2 秒殺系統(tǒng) 249
16.2.1 需求分析 249
16.2.2 異步秒殺與同步秒殺 250
16.2.3 同步秒殺系統(tǒng)的設(shè)計 252
16.2.4 防刷問題 253
16.2.5 名額歸還問題 254
16.2.6 同步與異步的相結(jié)合 254
16.2.7 層層限流,保護最終的核心系統(tǒng) 255
16.3 Feeds流 255
16.3.1 需求分析 255
16.3.2 無限長列表的實現(xiàn) 256
16.3.3 寫擴散和讀擴散的相結(jié)合 258
16.3.4 評論的實現(xiàn) 259
第17章 B端業(yè)務(wù)系統(tǒng)案例實戰(zhàn) 261
17.1 規(guī)則引擎平臺 261
17.1.1 規(guī)則引擎的典型應(yīng)用場景 261
17.1.2 四種技術(shù)選型 263
17.1.3 規(guī)則的存儲與版本管理 265
17.1.4 可視化規(guī)則編輯 266
17.1.5 特征庫、動作庫管理 268
17.1.6 特征數(shù)據(jù)庫 269
17.1.7 總結(jié) 270
17.2 工作流引擎平臺 271
17.2.1 沒有工作流引擎,如何做業(yè)務(wù)開發(fā) 271
17.2.2 工作流引擎的基本思路 273
17.2.3 工作流引擎與微服務(wù)編排引擎、分布式事務(wù)的Saga模式的區(qū)別與
聯(lián)系 274
17.2.4 BPMN標準 278
17.2.5 工作流引擎的技術(shù)選型與Activiti介紹 281
17.2.6 對Activiti的裁剪 283
17.2.7 Activiti的性能問題與對Activiti的擴展 284
17.2.8 工作流引擎與微服務(wù)/DDD方法論的沖突 285
17.3 權(quán)限管理系統(tǒng) 286
17.3.1 權(quán)限管理系統(tǒng)的由來 286
17.3.2 權(quán)限如何抽象:權(quán)限Code 287
17.3.3 權(quán)限的進一步抽象 288
17.3.4 權(quán)限模型 289
17.3.5 權(quán)限系統(tǒng)的實現(xiàn)方式 289
17.3.6 API權(quán)限與微服務(wù)鑒權(quán) 292
第18章 大數(shù)據(jù)與中臺案例實戰(zhàn) 295
18.1 嚴格區(qū)分在線業(yè)務(wù)邏輯與離線業(yè)務(wù)邏輯 295
18.2 警惕后臺離線任務(wù) 298
18.3 合理利用大數(shù)據(jù)交互式查詢引擎 300
18.4 中臺 301
18.4.1 什么不是中臺 301
18.4.2 業(yè)務(wù)中臺 303
18.4.3 數(shù)據(jù)中臺 304
18.4.4 中臺和組織架構(gòu) 307