軟件架構設計:大型網(wǎng)站技術架構與業(yè)務架構融合之道
定 價:79 元
- 作者:余春龍
- 出版時間:2019/1/1
- ISBN:9787121356032
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP393.092.2
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
當我在撰寫本書時,腦海中曾浮現(xiàn)出當初上學期間一個勁兒地啃UML建模、軟件架構設計書籍的情景。對于一個沒有太多項目經(jīng)驗的人來說有點可笑,但也正是這種過早熏陶,使得我之后在工作中接手一個個項目時,會多想一些架構方面的事情。
為什么說是多想了呢?因為無論在企業(yè)面試還是日常工作中,人們更多談論的是語言、數(shù)據(jù)結構、算法、操作系統(tǒng)原理,框架或中間件的使用方式、原理等硬性的內(nèi)容,因為這些硬性的內(nèi)容比較容易表述,其中學問的深淺也容易衡量。而對于軟件建模、架構設計等軟性的內(nèi)容,就不容易衡量了。人們都知道它們很重要,但又說不清楚里面到底包含了哪些學問,所以談論這些內(nèi)容時通常都比較虛,最終導致很少從方法論的角度去講,而是在項目中遇到問題時再具體解決,屬于實用主義思維的做法。
另一方面,隨著互聯(lián)網(wǎng)技術的發(fā)展,很多大型網(wǎng)站或系統(tǒng)要處理海量的用戶訪問,需要解決高并發(fā)、高可用和由此帶來的數(shù)據(jù)一致性問題,這也使得大家把大部分精力都用在解決這些問題上。這些問題可以被稱為顯性問題,因為如果解決不好,會造成系統(tǒng)宕機,用戶體驗受損,給企業(yè)帶來嚴重損失,人們能意識到這種問題很重要。解決的思路通常有兩個:第一,利用分布式系統(tǒng)的特性不斷地分拆,把大系統(tǒng)拆小,各個擊破,降低風險;第二,小步快跑,快速迭代。
但還有一類問題是隱性問題,是指系統(tǒng)的可重用性、可擴展性、可維護性等。因為一個系統(tǒng)由于設計問題導致研發(fā)人力的投入和時間成本的增加,往往無法顯性地衡量。也可能并非系統(tǒng)設計得不好,而是業(yè)務本身就很復雜,或者各部門之間的溝通協(xié)調(diào)問題導致開發(fā)效率低。即便系統(tǒng)設計得不好,做新功能有沉重的歷史包袱,也能依靠加班加點解決。但其實隱性問題比顯性問題的影響更大,因為它會讓技術拖累業(yè)務,當有新需求的時候,系統(tǒng)無法跟隨業(yè)務快速變化。
所以,本書不想偏廢兩者中的任意一個。因為對于一個系統(tǒng)來說,可能既面臨高并發(fā)、高可用的技術問題,又面臨復雜的業(yè)務問題,所以如何處理兩者的關系,打通技術和業(yè)務的任督二脈,是本書想要探討的內(nèi)容。
架構是一種綜合能力,而不是某一方面的技能。也正因為如此,本書提供的是一個全面的解決方案、方法論、成體系的設計思維。本書從基礎技術談起,之后到高層技術,再到業(yè)務、管理,提供一個架構能力的全局視圖,從而詮釋一個架構師的完整能力模型。
具體來說,全書分為5大部分:
第1部分:從行業(yè)背景出發(fā),對架構做一個宏觀概述,闡述架構是什么。
第2部分:計算機功底。功底非常重要,這是做架構的基本門檻。大學的教科書上教的全是功底,但經(jīng)過多年實踐之后,再回過頭看書本內(nèi)容,會有新的理解和體會。
第3部分:技術架構。這部分是純技術,講解如何應對高并發(fā)、高可用、一致性方面的問題。
第4部分:業(yè)務架構。如何從技術延展到業(yè)務,如何跳出技術細節(jié)抽象思考問題,如何通過業(yè)務建模把技術和業(yè)務進行融合。
第5部分:從職業(yè)發(fā)展的角度,從技術延展到管理。建立對公司、商業(yè)、團隊管理的一些認知。
對于剛?cè)胄械男氯,建議從頭看到尾,從而對架構的能力體系有一個全面的認知;對于有經(jīng)驗的從業(yè)者,可以選取自己感興趣的章節(jié)閱讀。
由于編寫時間緊張,書中難免存在不足之處,望廣大讀者批評指正。
目 錄
第1部分 什么是架構
第1章 五花八門的架構師職業(yè)2
1.1 架構師職業(yè)分類2
1.2 架構的分類2
第2章 架構的道與術5
2.1 何為道,何為術5
2.2 道與術的辯證關系6
第2部分 計算機功底
第3章 語言10
3.1 層出不窮的編程語言10
3.2 精通一門語言10
第4章 操作系統(tǒng)12
4.1 緩沖I/O和直接I/O12
4.2 內(nèi)存映射文件與零拷貝14
4.2.1 內(nèi)存映射文件14
4.2.2 零拷貝15
4.3 網(wǎng)絡I/O模型17
4.3.1 實現(xiàn)層面的網(wǎng)絡I/O模型17
4.3.2 Reactor模式與Preactor模式20
4.3.3 select、epoll的LT與ET20
4.3.4 服務器編程的1 N M模型22
4.4 進程、線程和協(xié)程24
4.5 無鎖(內(nèi)存屏障與CAS)27
4.5.1 內(nèi)存屏障27
4.5.2 CAS30
第5章 網(wǎng)絡31
5.1 HTTP 1.031
5.1.1 HTTP 1.0的問題31
5.1.2 Keep-Alive機制與Content-Length屬性31
5.2 HTTP 1.132
5.2.1 連接復用與Chunk機制32
5.2.2 Pipeline與Head-of-line Blocking問題33
5.2.3 HTTP/2出現(xiàn)之前的性能提升方法34
5.2.4 一來多回問題35
5.2.5 斷點續(xù)傳36
5.3 HTTP/236
5.3.1 與HTTP 1.1的兼容37
5.3.2 二進制分幀37
5.3.3 頭部壓縮39
5.4 SSL/TLS39
5.4.1 背景39
5.4.2 對稱加密的問題40
5.4.3 雙向非對稱加密41
5.4.4 單向非對稱加密42
5.4.5 中間人攻擊43
5.4.6 數(shù)字證書與證書認證中心44
5.4.7 根證書與CA信任鏈45
5.4.8 SSL/TLS協(xié)議:四次握手47
5.5 HTTPS48
5.6 TCP/UDP49
5.6.1 可靠與不可靠49
5.6.2 TCP的假連接(狀態(tài)機)51
5.6.3 三次握手(網(wǎng)絡2將軍問題)53
5.6.4 四次揮手54
5.7 QUIC56
5.7.1 不丟包(Raid5算法和Raid6算法)57
5.7.2 更少的RTT58
5.7.3 連接遷移58
第6章 數(shù)據(jù)庫59
6.1 范式與反范式59
6.2 分庫分表59
6.2.1 為什么要分60
6.2.2 分布式ID生成服務60
6.2.3 拆分維度的選擇60
6.2.4 Join查詢問題61
6.2.5 分布式事務61
6.3 B 樹62
6.3.1 B 樹邏輯結構62
6.3.2 B 樹物理結構63
6.3.3 非主鍵索引65
6.4 事務與鎖66
6.4.1 事務的四個隔離級別66
6.4.2 悲觀鎖和樂觀鎖67
6.4.3 死鎖檢測71
6.5 事務實現(xiàn)原理之1:Redo Log72
6.5.1 Write-Ahead73
6.5.2 Redo Log的邏輯與物理結構74
6.5.3 Physiological Logging75
6.5.4 I/O寫入的原子性(Double Write)76
6.5.5 Redo Log Block結構77
6.5.6 事務、LSN與Log Block的關系78
6.5.7 事務Rollback與崩潰恢復(ARIES算法)80
6.6 事務實現(xiàn)原理之2:Undo Log86
6.6.1 Undo Log是否一定需要86
6.6.2 Undo Log(MVCC)88
6.6.3 Undo Log不是Log89
6.6.4 Undo Log與Redo Log的關聯(lián)90
6.6.4 各種鎖91
6.7 Binlog與主從復制94
6.7.1 Binlog與Redo Log的主要差異94
6.7.2 內(nèi)部XA ?C Binlog與Redo Log一致性問題95
6.7.3 三種主從復制方式96
6.7.3 并行復制97
第7章 框架、軟件與中間件99
7.1 對生態(tài)體系的認知99
7.2 框架99
7.3 軟件與中間件100
第3部分 技術架構之道
第8章 高并發(fā)問題104
8.1 問題分類104
8.1.1 側(cè)重于高并發(fā)讀的系統(tǒng)104
8.1.2 側(cè)重于高并發(fā)寫的系統(tǒng)105
8.1.3 同時側(cè)重于高并發(fā)讀和高并發(fā)寫的系統(tǒng)106
8.2 高并發(fā)讀108
8.2.1 策略1:加緩存108
8.2.2 策略2:并發(fā)讀109
8.2.3 策略3:重寫輕讀110
8.2.4 總結:讀寫分離(CQRS架構)113
8.3 高并發(fā)寫114
8.3.1 策略1:數(shù)據(jù)分片114
8.3.2 策略2:任務分片115
8.3.3 策略3:異步化117
8.3.4 策略4:批量123
8.3.5 策略5:串行化 多進程單線程 異步I/O124
8.4 容量規(guī)劃125
8.4.1 吞吐量、響應時間與并發(fā)數(shù)125
8.4.2 壓力測試與容量評估127
第9章 高可用與穩(wěn)定性129
9.1 多副本129
9.2 隔離、限流、熔斷和降級130
9.3 灰度發(fā)布與回滾135
9.4 監(jiān)控體系與日志報警136
第10章 事務一致性138
10.1 隨處可見的分布式事務問題138
10.2 分布式事務解決方案匯總139
10.2.1 2PC139
10.2.2 最終一致性(消息中間件)141
10.2.3 TCC145
10.2.4 事務狀態(tài)表 調(diào)用方重試 接收方冪等147
10.2.5 對賬148
10.2.6 妥協(xié)方案:弱一致性 基于狀態(tài)的補償149
10.2.7 妥協(xié)方案:重試 回滾 報警 人工修復151
10.2.8 總結152
第11章 多副本一致性153
11.1 高可用且強一致性到底有多難153
11.1.1 Kafka的消息丟失問題153
11.1.2 Kafka消息錯亂問題156
11.2 Paxos算法解析158
11.2.1 Paxos解決什么問題158
11.2.2 復制狀態(tài)機161
11.2.3 一個樸素而深刻的思想163
11.2.4 Basic Paxos算法164
11.2.5 Multi Paxos算法167
11.3 Raft算法解析169
11.3.1 為可理解性而設計169
11.3.2 單點寫入170
11.3.3 日志結構171
11.3.4 階段1:Leader選舉174
11.3.5 階段2:日志復制176
11.3.6 階段3:恢復階段177
11.3.7 安全性保證177
11.4 Zab算法解析180
11.4.1 Replicated State Machine vs. Primary-Backup System180
11.4.2 zxid182
11.4.3 序:亂序提交 vs. 順序提交182
11.4.4 Leader選舉:FLE算法184
11.4.5 正常階段:2階段提交186
11.4.6 恢復階段186
11.5 三種算法對比187
第12章 CAP理論189
12.1 CAP理論的誤解189
12.2 現(xiàn)實世界不存在強一致性(PACELC理論)190
12.3 典型案例:分布式鎖192
第4部分 業(yè)務架構之道
第13章 業(yè)務意識196
13.1 產(chǎn)品經(jīng)理vs.需求分析師196
13.2 什么叫作一個業(yè)務198
13.3 業(yè)務架構的雙重含義199
13.4 業(yè)務架構與技術架構的區(qū)分200
第14章 業(yè)務架構思維202
14.1 偽分層202
14.2 邊界思維204
14.3 系統(tǒng)化思維205
14.4 利益相關者分析206
14.5 非功能性需求分析(以終為始)208
14.6 視角(橫看成嶺側(cè)成峰)209
14.7 抽象210
14.8 建模213
14.9 正交分解215
第15章 技術架構與業(yè)務架構的融合218
15.1 各式各樣的方法論218
15.2 為什么要領域驅(qū)動218
15.3 業(yè)務流程不等于系統(tǒng)流程221
15.4 為何很難設計一個好的領域模型222
15.5 領域驅(qū)動設計與微服務架構的合223
15.6 領域驅(qū)動設計與讀寫分離(CQRS)224
15.7 業(yè)務分層架構模式225
15.8 管道過濾器架構模式226
15.9 狀態(tài)機架構模式226
15.10 業(yè)務切面/業(yè)務閉環(huán)架構模式228
第5部分 從架構到技術管理
第16章 個人素質(zhì)的提升232
16.1 能力模型232
16.2 影響力的塑造234
第17章 團隊能力的提升237
17.1 不確定性與風險把控237
17.2 以價值為中心的管理239
17.3 團隊培養(yǎng)241