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