《億級流量系統架構設計與實戰》是電子工業出版社出版圖書,由李琛軒 編著。
基本介紹
- 中文名:億級流量系統架構設計與實戰
- 作者:李琛軒
- 出版時間:2024年5月
- 出版社:電子工業出版社
- 頁數:432 頁
- ISBN:9787121476983
- 定價:128 元
- 開本:16 開
內容簡介,圖書目錄,作者簡介,
內容簡介
《億級流量系統架構設計與實戰》涵蓋了億級用戶套用後台通用的技術和系統架構設計思路,在內容結構上分為三大篇:架構知識篇(第1~3章),作為全書的基礎知識篇,首先介紹後台的關鍵組件構成以及機房的搭建思路,然後介紹後台在應對高並發的讀/寫請求時通用的處理手段,最後介紹如何通過通用的服務治理手段來保障後台的高質量運行;基礎服務設計篇(第4~6章),主要講解基礎服務的架構設計,這裡選取的基礎服務幾乎是所有網際網路後台都需要的專門系統,包括唯一ID生成器、用戶登錄服務和海量推送系統;核心服務設計篇(第7~13章),主要講解在常見的社互動動場景中所需核心服務的架構設計,包括內容發布系統、通用計數系統、排行榜服務、用戶關係服務、Timeline Feed服務、評論服務和IM服務。
《億級流量系統架構設計與實戰》的適用人群包括計算機相關專業的學生、希望尋求大廠軟體開發工程師崗位的求職者,以及各信息技術類公司的後台研發工程師、架構師和技術管理人員。
圖書目錄
架構知識篇
第1章 大型網際網路公司的基礎架構 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 服務發現 28
1.5.1 註冊與發現 29
1.5.2 可用地址管理 30
1.5.3 地址變更推送 31
1.6 RPC服務 32
1.7 存儲層技術:MySQL 35
1.7.1 關係型資料庫 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 讀/寫數據的流程 56
1.10 存儲層技術:其他NoSQL資料庫 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 數據複製鏈路 85
1.15 本章小結 86
第2章 通用的高並發架構設計 88
2.1 高並發架構設計的要點 88
2.1.1 形成高並發系統的必要條件 88
2.1.2 高並發系統的衡量指標 89
2.1.3 高並發場景分類 90
2.2 高並發讀場景方案1:資料庫讀/寫分離 91
2.2.1 讀/寫分離架構 91
2.2.2 讀/寫請求路由方式 91
2.2.3 主從延遲與解決方案 92
2.3 高並發讀場景方案2:本地快取 93
2.3.1 基本的快取淘汰策略 93
2.3.2 W-TinyLFU策略 94
2.3.3 快取擊穿與SingleFlight 95
2.4 高並發讀場景方案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 高並發讀場景總結:CQRS 105
2.5.1 CQRS的簡要架構與實現 106
2.5.2 更多的使用場景 107
2.5.3 CQRS架構的特點 108
2.6 高並發寫場景方案1:數據分片之資料庫分庫分表 108
2.6.1 分庫和分表 109
2.6.2 垂直拆分 109
2.6.3 水平拆分 111
2.6.4 水平拆分規則 113
2.6.5 擴容方案 117
2.6.6 其他數據分片形式 120
2.7 高並發寫場景方案2:異步寫與寫聚合 120
2.7.1 異步寫 121
2.7.2 寫聚合 122
2.8 本章小結 122
第3章 通用的服務可用性治理手段 124
3.1 微服務架構與網路調用 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 艙壁隔離的實現 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 基於資料庫的自增主鍵 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:基於資料庫的自增主鍵 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 數據表設計 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 服務端接入第三方登錄 201
5.5.4 第三方登錄的完整流程總結 203
5.6 登錄態管理 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 掃碼登錄的技術實現 211
5.8 本章小結 213
第6章 海量推送系統 215
6.1 分散式長連線服務的技術要素分析 216
6.1.1 WebSocket協定簡介 216
6.1.2 長連線伺服器 217
6.1.3 分散式推送伺服器 218
6.1.4 路由算法 219
6.2 海量推送系統設計 220
6.2.1 整體架構設計 220
6.2.2 長連線的建立過程 221
6.2.3 訊息格式設計 222
6.2.4 訊息推送接口 223
6.2.5 單點訊息推送的細節 224
6.2.6 全局訊息推送的細節 225
6.2.7 多點訊息推送的細節 226
6.2.8 pusher平滑升級的問題 227
6.2.9 pusher擴容的問題 236
6.3 本章小結 237
核心服務設計篇
第7章 內容發布系統 240
7.1 內容發布系統的設計背景 240
7.2 內容存儲設計 241
7.2.1 內容數據的存儲 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 內容的創建設計 250
7.4.2 內容的修改設計 252
7.4.3 內容審核結果處理與版本控制設計 254
7.4.4 內容的刪除與下架設計 256
7.5 內容分發設計 256
7.5.1 內容分發渠道 257
7.5.2 何時通知分發渠道 257
7.5.3 將內容投遞到分發渠道 257
7.6 內容展示設計 259
7.6.1 內容數據的特點 259
7.6.2 使用CDN加速靜態資源訪問 259
7.6.3 使用快取和多副本支撐高並發讀取 260
7.6.4 內容展示流程設計 263
7.7 完整架構總覽 265
7.8 本章小結 267
第8章 通用計數系統 268
8.1 計數的常見用途 268
8.2 如何存儲計數數據 269
8.2.1 計數數據的特點 269
8.2.2 關係型資料庫的困境 270
8.2.3 是否要使用關係型資料庫 270
8.2.4 使用Redis存儲計數數據 271
8.3 海量計數服務設計 272
8.3.1 Redis數據類型 272
8.3.2 計數累計與讀取的示例 274
8.3.3 最佳化記憶體的調研 274
8.3.4 最佳化記憶體:定製化Redis 276
8.3.5 冷熱數據分離 279
8.3.6 應對過熱數據 280
8.3.7 計數服務架構圖 281
8.3.8 計數服務的適用範圍 282
8.4 本章小結 283
第9章 排行榜服務 284
9.1 排行榜的套用場景 284
9.2 排行榜技術的特點 285
9.3 使用Redis實現排行榜 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 粗估排行榜的實現 296
9.4.1 線段樹 296
9.4.2 粗估排名的實現 299
9.5 精確排名與粗估排名結合 306
9.6 本章小結 309
第10章 用戶關係服務 310
10.1 用戶關係服務的職責 310
10.2 基於Redis ZSET的設計 311
10.3 基於資料庫的設計 312
10.3.1 最初的想法 312
10.3.2 應對分庫分表 313
10.3.3 Following表的索引設計 314
10.3.4 Follower表的索引設計 316
10.3.5 進階:回表問題與最佳化 316
10.3.6 關注數和冬粉數 317
10.4 快取查詢 318
10.4.1 快取什麼數據 318
10.4.2 快取的創建與更新策略 319
10.4.3 本地快取 321
10.4.4 快取與資料庫結合的最終方案 321
10.5 基於圖資料庫的設計 323
10.5.1 實現用戶關係 323
10.5.2 套用權衡 327
10.6 本章小結 328
第11章 Timeline Feed服務 330
11.1 Feed流的分類 330
11.2 Timeline Feed流的功能特性 331
11.3 拉模式與用戶發件箱 331
11.4 推模式與用戶收件箱 333
11.5 推拉結合模式 334
11.5.1 結合思路 334
11.5.2 區分活躍用戶 335
11.6 實現Timeline Feed服務的關鍵技術細節 336
11.6.1 內容與用戶收件箱的互動 336
11.6.2 推送子任務 338
11.6.3 收件箱保存什麼數據 339
11.6.4 讀請求參數 340
11.6.5 使用資料庫實現收件箱 340
11.6.6 使用Redis ZSET實現收件箱 343
11.6.7 通過推拉結合模式構建Timeline Feed數據 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 數據表的初步設計 361
12.4.2 讀/寫接口與索引 362
12.4.3 資料庫的最終設計 363
12.4.4 高並發問題 364
12.5 蓋樓模式服務設計 366
12.5.1 資料庫方案:遞歸查詢 366
12.5.2 資料庫方案:保存完整樓層 368
12.5.3 圖資料庫方案 369
12.6 二級模式服務設計 370
12.6.1 一級評論和二級評論 370
12.6.2 時間順序:資料庫方案 371
12.6.3 時間順序:圖資料庫方案 373
12.6.4 評論審核與狀態 376
12.6.5 按照熱度排序 377
12.6.6 高並發處理 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 客戶端傳送訊息 396
13.5.3 服務端存儲訊息 397
13.5.4 服務端推送訊息與客戶端補償 398
13.6 會話管理與命令訊息 401
13.6.1 創建單聊會話 402
13.6.2 創建群聊會話 402
13.6.3 命令訊息 403
13.7 訊息回執 404
13.7.1 上報已讀訊息 404
13.7.2 記錄已讀訊息 404
13.8 階段性匯總:存儲設計 405
13.9 高並發架構 408
13.9.1 傳送訊息 409
13.9.2 數據快取 409
13.9.3 訊息分級 410
13.9.4 直播間彈幕模式 411
13.10 本章小結:最終架構 413
作者簡介
李琛軒
資深後台研發工程師,擁有8年網際網路後台研發經驗,現任某全球社交產品後台子方向負責人。從事網際網路社交產品領域的研發與架構設計工作多年,從業以來負責過多個知名產品的後台開發工作,相繼深耕於訊息佇列、服務發現系統、服務治理、分散式事務、高並發架構設計、全球多活等技術領域。