億級(jí)流量系統(tǒng)架構(gòu)設(shè)計(jì)與實(shí)戰(zhàn)
定 價(jià):128 元
- 作者:李琛軒
- 出版時(shí)間:2024/5/1
- ISBN:9787121476983
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP393.092.1
- 頁(yè)碼:432
- 紙張:
- 版次:01
- 開本:16開
本書講解億級(jí)流量系統(tǒng)架構(gòu)的設(shè)計(jì)方法及實(shí)戰(zhàn)經(jīng)驗(yàn),在內(nèi)容結(jié)構(gòu)上分為三大篇:架構(gòu)知識(shí)篇(第1~3章),主要講解海量用戶應(yīng)用后臺(tái)的組成結(jié)構(gòu)、高并發(fā)處理和服務(wù)可用性保障,首先講解后臺(tái)由哪些關(guān)鍵組件構(gòu)成及機(jī)房搭建思路,然后講解后臺(tái)在應(yīng)對(duì)高并發(fā)讀請(qǐng)求和寫請(qǐng)求時(shí)的通用處理手段,最后講解通用的服務(wù)治理手段以保障后臺(tái)高效運(yùn)行。基礎(chǔ)服務(wù)設(shè)計(jì)篇(第4~6章),主要講解幾個(gè)基礎(chǔ)服務(wù)的架構(gòu)設(shè)計(jì),這里選取的基礎(chǔ)服務(wù)幾乎為所有互聯(lián)網(wǎng)后臺(tái)所需的專門系統(tǒng),包括分布式唯一ID生成器、用戶登錄服務(wù)和海量消息推送系統(tǒng);核心服務(wù)設(shè)計(jì)篇(第7~13章),主要講解常見社交互動(dòng)場(chǎng)景中所需的核心服務(wù)的架構(gòu)設(shè)計(jì),包括內(nèi)容發(fā)布系統(tǒng)、通用計(jì)數(shù)系統(tǒng)、排行榜服務(wù)、用戶關(guān)系服務(wù)、Timeline Feed服務(wù)、評(píng)論服務(wù)和IM服務(wù)。
李琛軒,高級(jí)技術(shù)專家,8年互聯(lián)網(wǎng)后臺(tái)開發(fā)經(jīng)驗(yàn),現(xiàn)任某全球社交產(chǎn)品后臺(tái)技術(shù)負(fù)責(zé)人。從事互聯(lián)網(wǎng)社交產(chǎn)品領(lǐng)域的研發(fā)工作與架構(gòu)設(shè)計(jì)多年,從業(yè)以來(lái)負(fù)責(zé)過多個(gè)知名產(chǎn)品的后臺(tái)開發(fā)工作,相繼深耕于消息隊(duì)列、服務(wù)發(fā)現(xiàn)系統(tǒng)、服務(wù)治理、分布式事務(wù)、高并發(fā)架構(gòu)設(shè)計(jì)、全球多活等技術(shù)領(lǐng)域。
架構(gòu)知識(shí)篇
第1章 大型互聯(lián)網(wǎng)公司的基礎(chǔ)架構(gòu) 2
1.1 引言:?jiǎn)螜C(jī)房的內(nèi)部架構(gòu) 2
1.2 客戶端連接機(jī)房的技術(shù)1:DNS 5
1.2.1 DNS的意義 5
1.2.2 域名結(jié)構(gòu) 6
1.2.3 域名服務(wù)器 6
1.2.4 域名解析過程 7
1.3 客戶端連接機(jī)房的技術(shù)2:HTTP DNS 9
1.3.1 DNS存在的問題 9
1.3.2 HTTP DNS的原理 10
1.3.3 HTTP DNS實(shí)踐 11
1.4 接入層的技術(shù)演進(jìn) 12
1.4.1 Nginx 13
1.4.2 LVS 19
1.4.3 LVS+Nginx接入層的架構(gòu) 25
1.5 服務(wù)發(fā)現(xiàn) 28
1.5.1 注冊(cè)與發(fā)現(xiàn) 29
1.5.2 可用地址管理 30
1.5.3 地址變更推送 31
1.6 RPC服務(wù) 32
1.7 存儲(chǔ)層技術(shù):MySQL 35
1.7.1 關(guān)系型數(shù)據(jù)庫(kù) 35
1.7.2 MySQL 37
1.7.3 高可用架構(gòu)1:主從模式 37
1.7.4 高可用架構(gòu)2:MHA 40
1.7.5 高可用架構(gòu)3:MMM 41
1.7.6 高可用架構(gòu)4:MGR 43
1.8 存儲(chǔ)層技術(shù):Redis 44
1.8.1 高可用架構(gòu)1:主從模式 44
1.8.2 高可用架構(gòu)2:哨兵模式 45
1.8.3 高可用架構(gòu)3:集群模式 46
1.8.4 高可用架構(gòu)4:中心化集群架構(gòu) 50
1.9 存儲(chǔ)層技術(shù):LSM Tree 53
1.9.1 LSM Tree的原理 53
1.9.2 讀/寫數(shù)據(jù)流程 56
1.10 存儲(chǔ)層技術(shù):其他NoSQL數(shù)據(jù)庫(kù) 57
1.11 消息中間件技術(shù) 61
1.11.1 通信模式與用途 62
1.11.2 Kafka 64
1.11.3 Kafka的高可用 67
1.12 多機(jī)房:主備機(jī)房 69
1.13 多機(jī)房:同城雙活 71
1.13.1 存儲(chǔ)層改造 71
1.13.2 靈活實(shí)施 73
1.13.3 分流與故障切流 74
1.13.4 兩地三中心 77
1.14 多機(jī)房:異地多活 78
1.14.1 架構(gòu)要點(diǎn) 78
1.14.2 MySQL DRC的原理 80
1.14.3 Redis DRC的原理 83
1.14.4 分流策略 84
1.14.5 數(shù)據(jù)復(fù)制鏈路 85
1.15 本章小結(jié) 86
第2章 通用的高并發(fā)架構(gòu)設(shè)計(jì) 88
2.1 高并發(fā)架構(gòu)設(shè)計(jì)的要點(diǎn) 88
2.1.1 形成高并發(fā)系統(tǒng)的必要條件 88
2.1.2 高并發(fā)系統(tǒng)的衡量指標(biāo) 89
2.1.3 高并發(fā)場(chǎng)景分類 90
2.2 高并發(fā)讀場(chǎng)景方案1:數(shù)據(jù)庫(kù)讀/寫分離 91
2.2.1 讀/寫分離架構(gòu) 91
2.2.2 讀/寫請(qǐng)求路由方式 91
2.2.3 主從延遲與解決方案 92
2.3 高并發(fā)讀場(chǎng)景方案2:本地緩存 93
2.3.1 基本的緩存淘汰策略 93
2.3.2 W-TinyLFU策略 94
2.3.3 緩存擊穿與SingleFlight 95
2.4 高并發(fā)讀場(chǎng)景方案3:分布式緩存 100
2.4.1 分布式緩存選型 100
2.4.2 如何使用Redis緩存 101
2.4.3 緩存穿透 102
2.4.4 緩存雪崩 103
2.4.5 緩存更新 103
2.5 高并發(fā)讀場(chǎng)景總結(jié):CQRS 105
2.5.1 CQRS的簡(jiǎn)要架構(gòu)與實(shí)現(xiàn) 106
2.5.2 更多的使用場(chǎng)景 107
2.5.3 CQRS架構(gòu)的特點(diǎn) 108
2.6 高并發(fā)寫場(chǎng)景方案1:數(shù)據(jù)分片之?dāng)?shù)據(jù)庫(kù)分庫(kù)分表 108
2.6.1 分庫(kù)和分表 109
2.6.2 垂直拆分 109
2.6.3 水平拆分 111
2.6.4 水平拆分規(guī)則 113
2.6.5 擴(kuò)容方案 117
2.6.6 其他數(shù)據(jù)分片形式 120
2.7 高并發(fā)寫場(chǎng)景方案2:異步寫與寫聚合 120
2.7.1 異步寫 121
2.7.2 寫聚合 122
2.8 本章小結(jié) 122
第3章 通用的服務(wù)可用性治理手段 124
3.1 微服務(wù)架構(gòu)與網(wǎng)絡(luò)調(diào)用 124
3.2 重試 126
3.2.1 冪等接口 126
3.2.2 重試時(shí)機(jī) 130
3.2.3 重試風(fēng)險(xiǎn)與重試風(fēng)暴 130
3.2.4 重試控制:不重試的請(qǐng)求 131
3.2.5 重試控制:重試請(qǐng)求比 132
3.3 熔斷與隔離 132
3.3.1 服務(wù)雪崩 133
3.3.2 Hystrix熔斷器 134
3.3.3 Resilience4j和Sentinel熔斷器 136
3.3.4 共享資源與艙壁隔離 137
3.3.5 艙壁隔離的實(shí)現(xiàn) 138
3.4 限流 139
3.4.1 頻控 140
3.4.2 單機(jī)限流1:時(shí)間窗口 141
3.4.3 單機(jī)限流2:漏桶算法 143
3.4.4 單機(jī)限流3:令牌桶算法 144
3.4.5 全局限流 146
3.5 自適應(yīng)限流 148
3.5.1 服務(wù)與等待隊(duì)列 149
3.5.2 基于請(qǐng)求排隊(duì)時(shí)間 150
3.5.3 基于延遲比率 151
3.5.4 其他方案 152
3.6 降級(jí)策略 155
3.6.1 服務(wù)依賴度降級(jí) 155
3.6.2 讀請(qǐng)求降級(jí) 158
3.6.3 寫請(qǐng)求降級(jí) 159
3.7 本章小結(jié) 160
基礎(chǔ)服務(wù)設(shè)計(jì)篇
第4章 唯一ID生成器 164
4.1 分布式唯一ID 164
4.1.1 全局唯一與UUID 164
4.1.2 唯一ID生成器的特點(diǎn) 165
4.1.3 單調(diào)遞增與趨勢(shì)遞增 167
4.2 單調(diào)遞增的唯一ID 168
4.2.1 Redis INCRBY命令 168
4.2.2 基于數(shù)據(jù)庫(kù)的自增主鍵 171
4.2.3 高可用架構(gòu) 172
4.3 趨勢(shì)遞增的唯一ID:基于時(shí)間戳 174
4.3.1 正確使用時(shí)間戳 174
4.3.2 Snowflake算法 175
4.3.3 Snowflake算法的靈活應(yīng)用 175
4.3.4 分配服務(wù)實(shí)例ID 177
4.3.5 時(shí)鐘回?fù)軉栴}與解決方案 179
4.3.6 最終架構(gòu) 179
4.4 趨勢(shì)遞增的唯一ID:基于數(shù)據(jù)庫(kù)的自增主鍵 180
4.4.1 分庫(kù)分表架構(gòu) 181
4.4.2 批量緩存架構(gòu) 182
4.5 美團(tuán)點(diǎn)評(píng)開源方案:Leaf 183
4.5.1 Leaf-segment方案 183
4.5.2 Leaf-snowflake方案 185
4.6 本章小結(jié) 187
第5章 用戶登錄服務(wù) 189
5.1 用戶賬號(hào) 189
5.2 用戶登錄服務(wù)的功能要點(diǎn) 190
5.3 密碼保護(hù) 192
5.3.1 使用HTTPS通信 192
5.3.2 非對(duì)稱加密 193
5.3.3 密碼加密存儲(chǔ) 194
5.4 手機(jī)號(hào)登錄和郵箱登錄 194
5.4.1 數(shù)據(jù)表設(shè)計(jì) 195
5.4.2 用戶注冊(cè) 195
5.4.3 用戶登錄 196
5.4.4 手機(jī)號(hào)一鍵登錄 197
5.5 第三方登錄 199
5.5.1 OAuth 2標(biāo)準(zhǔn) 200
5.5.2 客戶端接入第三方登錄 201
5.5.3 服務(wù)端接入第三方登錄 202
5.5.4 第三方登錄的完整流程總結(jié) 203
5.6 登錄態(tài)管理 204
5.6.1 存儲(chǔ)型方案:Session 205
5.6.2 計(jì)算型方案:令牌 207
5.6.3 長(zhǎng)短令牌方案 208
5.7 掃碼登錄 210
5.7.1 二維碼 210
5.7.2 掃碼登錄的場(chǎng)景介紹 211
5.7.3 掃碼登錄的技術(shù)實(shí)現(xiàn) 211
5.8 本章小結(jié) 213
第6章 海量推送系統(tǒng) 215
6.1 分布式長(zhǎng)連接服務(wù)的技術(shù)要素分析 216
6.1.1 WebSocket協(xié)議簡(jiǎn)介 216
6.1.2 長(zhǎng)連接服務(wù)器 217
6.1.3 分布式推送服務(wù)器 218
6.1.4 路由算法 219
6.2 海量推送系統(tǒng)設(shè)計(jì) 220
6.2.1 整體架構(gòu)設(shè)計(jì) 220
6.2.2 長(zhǎng)連接的建立過程 221
6.2.3 消息格式設(shè)計(jì) 222
6.2.4 消息推送接口 223
6.2.5 單點(diǎn)消息推送的細(xì)節(jié) 224
6.2.6 全局消息推送的細(xì)節(jié) 225
6.2.7 多點(diǎn)消息推送的細(xì)節(jié) 226
6.2.8 pusher平滑升級(jí)的問題 227
6.2.9 pusher擴(kuò)容的問題 236
6.3 本章小結(jié) 237
核心服務(wù)設(shè)計(jì)篇
第7章 內(nèi)容發(fā)布系統(tǒng) 240
7.1 內(nèi)容發(fā)布系統(tǒng)的設(shè)計(jì)背景 240
7.2 內(nèi)容存儲(chǔ)設(shè)計(jì) 241
7.2.1 內(nèi)容數(shù)據(jù)的存儲(chǔ) 241
7.2.2 內(nèi)容元信息的存儲(chǔ) 243
7.2.3 內(nèi)容主體的存儲(chǔ)選型 244
7.2.4 音視頻轉(zhuǎn)碼 245
7.3 內(nèi)容審核設(shè)計(jì) 246
7.3.1 內(nèi)容審核的必要性 246
7.3.2 內(nèi)容的審核時(shí)機(jī)策略 246
7.3.3 如何審核內(nèi)容 247
7.3.4 審核中心的對(duì)外交互 249
7.4 內(nèi)容的全生命周期管理設(shè)計(jì) 250
7.4.1 內(nèi)容的創(chuàng)建設(shè)計(jì) 250
7.4.2 內(nèi)容的修改設(shè)計(jì) 252
7.4.3 內(nèi)容審核結(jié)果處理與版本控制設(shè)計(jì) 254
7.4.4 內(nèi)容的刪除與下架設(shè)計(jì) 256
7.5 內(nèi)容分發(fā)設(shè)計(jì) 256
7.5.1 內(nèi)容分發(fā)渠道 256
7.5.2 何時(shí)通知分發(fā)渠道 257
7.5.3 將內(nèi)容投遞到分發(fā)渠道 257
7.6 內(nèi)容展示設(shè)計(jì) 258
7.6.1 內(nèi)容數(shù)據(jù)的特點(diǎn) 259
7.6.2 使用CDN加速靜態(tài)資源訪問 259
7.6.3 使用緩存和多副本支撐高并發(fā)讀取 260
7.6.4 內(nèi)容展示流程設(shè)計(jì) 263
7.7 完整架構(gòu)總覽 265
7.8 本章小結(jié) 267
第8章 通用計(jì)數(shù)系統(tǒng) 268
8.1 計(jì)數(shù)的常見用途 268
8.2 如何存儲(chǔ)計(jì)數(shù)數(shù)據(jù) 269
8.2.1 計(jì)數(shù)數(shù)據(jù)的特點(diǎn) 269
8.2.2 關(guān)系型數(shù)據(jù)庫(kù)的困境 270
8.2.3 是否要使用關(guān)系型數(shù)據(jù)庫(kù) 270
8.2.4 使用Redis存儲(chǔ)計(jì)數(shù)數(shù)據(jù) 271
8.3 海量計(jì)數(shù)服務(wù)設(shè)計(jì) 272
8.3.1 Redis數(shù)據(jù)類型 272
8.3.2 計(jì)數(shù)累計(jì)與讀取的示例 274
8.3.3 優(yōu)化內(nèi)存的調(diào)研 274
8.3.4 優(yōu)化內(nèi)存:定制化Redis 276
8.3.5 冷熱數(shù)據(jù)分離 279
8.3.6 應(yīng)對(duì)過熱數(shù)據(jù) 280
8.3.7 計(jì)數(shù)服務(wù)架構(gòu)圖 281
8.3.8 計(jì)數(shù)服務(wù)的適用范圍 282
8.4 本章小結(jié) 283
第9章 排行榜服務(wù) 284
9.1 排行榜的應(yīng)用場(chǎng)景 284
9.2 排行榜技術(shù)的特點(diǎn) 285
9.3 使用Redis實(shí)現(xiàn)排行榜 285
9.3.1 使用Redis ZSET 286
9.3.2 冪等更新 287
9.3.3 同積分排名處理 289
9.3.4 服務(wù)設(shè)計(jì) 291
9.3.5 關(guān)于大Key的問題 295
9.4 粗估排行榜的實(shí)現(xiàn) 296
9.4.1 線段樹 296
9.4.2 粗估排名的實(shí)現(xiàn) 299
9.5 精確排名與粗估排名結(jié)合 306
9.6 本章小結(jié) 309
第10章 用戶關(guān)系服務(wù) 310
10.1 用戶關(guān)系服務(wù)的職責(zé) 310
10.2 基于Redis ZSET的設(shè)計(jì) 311
10.3 基于數(shù)據(jù)庫(kù)的設(shè)計(jì) 312
10.3.1 最初的想法 312
10.3.2 應(yīng)對(duì)分庫(kù)分表 313
10.3.3 Following表的索引設(shè)計(jì) 314
10.3.4 Follower表的索引設(shè)計(jì) 316
10.3.5 進(jìn)階:回表問題與優(yōu)化 316
10.3.6 關(guān)注數(shù)和粉絲數(shù) 317
10.4 緩存查詢 318
10.4.1 緩存什么數(shù)據(jù) 318
10.4.2 緩存的創(chuàng)建與更新策略 319
10.4.3 本地緩存 321
10.4.4 緩存與數(shù)據(jù)庫(kù)結(jié)合的最終方案 321
10.5 基于圖數(shù)據(jù)庫(kù)的設(shè)計(jì) 323
10.5.1 實(shí)現(xiàn)用戶關(guān)系 323
10.5.2 應(yīng)用權(quán)衡 327
10.6 本章小結(jié) 328
第11章 Timeline Feed服務(wù) 330
11.1 Feed流的分類 330
11.2 Timeline Feed流的功能特性 331
11.3 拉模式與用戶發(fā)件箱 331
11.4 推模式與用戶收件箱 333
11.5 推拉結(jié)合模式 334
11.5.1 結(jié)合思路 334
11.5.2 區(qū)分活躍用戶 335
11.6 實(shí)現(xiàn)Timeline Feed服務(wù)的關(guān)鍵技術(shù)細(xì)節(jié) 336
11.6.1 內(nèi)容與用戶收件箱的交互 336
11.6.2 推送子任務(wù) 338
11.6.3 收件箱保存什么數(shù)據(jù) 339
11.6.4 讀請(qǐng)求參數(shù) 340
11.6.5 使用數(shù)據(jù)庫(kù)實(shí)現(xiàn)收件箱 340
11.6.6 使用Redis ZSET實(shí)現(xiàn)收件箱 343
11.6.7 通過推拉結(jié)合模式構(gòu)建Timeline Feed數(shù)據(jù) 348
11.6.8 收尾工作 355
11.7 本章小結(jié) 356
第12章 評(píng)論服務(wù) 357
12.1 評(píng)論功能 357
12.2 評(píng)論列表模式 358
12.3 評(píng)論服務(wù)設(shè)計(jì)的初步想法 361
12.4 單級(jí)模式服務(wù)設(shè)計(jì) 361
12.4.1 數(shù)據(jù)表的初步設(shè)計(jì) 361
12.4.2 讀/寫接口與索引 362
12.4.3 數(shù)據(jù)庫(kù)的最終設(shè)計(jì) 363
12.4.4 高并發(fā)問題 364
12.5 蓋樓模式服務(wù)設(shè)計(jì) 366
12.5.1 數(shù)據(jù)庫(kù)方案:遞歸查詢 366
12.5.2 數(shù)據(jù)庫(kù)方案:保存完整樓層 368
12.5.3 圖數(shù)據(jù)庫(kù)方案 369
12.6 二級(jí)模式服務(wù)設(shè)計(jì) 370
12.6.1 數(shù)據(jù)特點(diǎn) 371
12.6.2 時(shí)間順序:數(shù)據(jù)庫(kù)方案 371
12.6.3 時(shí)間順序:圖數(shù)據(jù)庫(kù)方案 373
12.6.4 評(píng)論審核與狀態(tài) 376
12.6.5 按照熱度排序 377
12.6.6 高并發(fā)處理 381
12.6.7 架構(gòu)總覽 385
12.7 本章小結(jié) 386
第13章 IM服務(wù) 388
13.1 IM的意義與核心能力 388
13.2 IM相關(guān)概念 389
13.3 消息投遞 390
13.3.1 存儲(chǔ)消息:讀擴(kuò)散與寫擴(kuò)散 390
13.3.2 接收消息:拉模式與推模式 393
13.4 存儲(chǔ)初探 395
13.5 消息的有序性保證 396
13.5.1 消息亂序 396
13.5.2 客戶端發(fā)送消息 396
13.5.3 服務(wù)端存儲(chǔ)消息 397
13.5.4 服務(wù)端推送消息與客戶端補(bǔ)償 398
13.6 會(huì)話管理與命令消息 401
13.6.1 創(chuàng)建單聊會(huì)話 402
13.6.2 創(chuàng)建群聊會(huì)話 402
13.6.3 命令消息 403
13.7 消息回執(zhí) 404
13.7.1 上報(bào)已讀消息 404
13.7.2 記錄已讀消息 404
13.8 階段性匯總:存儲(chǔ)設(shè)計(jì) 405
13.9 高并發(fā)架構(gòu) 408
13.9.1 發(fā)送消息 409
13.9.2 數(shù)據(jù)緩存 409
13.9.3 消息分級(jí) 410
13.9.4 直播間彈幕模式 411
13.10 本章小結(jié):最終架構(gòu) 413