前言
我們知道,高并發代表着大流量,高并發系統設計的魅力就在于我們能夠憑借自己的聰明才智設計巧妙的方案,進而抵抗巨大流量的沖擊,帶給使用者更好的使用體驗。這些方案好似能操縱流量,讓流量更加平穩得被系統中的服務群組件處理。

來做個簡單的比喻吧。
從古至今,長江和黃河流域水患不斷,遠古時期,大禹曾拓寬河道,清除淤沙讓流水更加順暢;都江堰作為史上最成功的的治水案例之一,用引流将岷江之水分流到多個支流中,以分擔水流壓力;三門峽和葛洲壩通過建造水庫将水引入水庫先存儲起來,然後再想辦法把水庫中的水緩緩地排出去,以此提高下遊的抗洪能力。
"秒殺活動"、"搶紅包"、"微網誌熱搜"、"12306搶票"、"共享單車拉新"等都是高并發的典型業務場景,那麼如何解決這些業務場景背後的難點問題呢?
- 秒殺系統中,QPS達到10萬/s時,如何定位并解決業務瓶頸?
- 明星婚戀話題不斷引爆微網誌熱搜,如何確定系統不當機?
- 共享單車充值活動,如何保證不超賣?
- ......
同一時間、海量使用者的高頻通路對任何平台都是難題,但可喜的是,雖然業務場景不同,設計和優化的思想卻是萬變不離其宗。如果你掌握了高并發系統設計的核心技術點(緩存、池化、異步化、負載均衡、隊列、降級熔斷等),深化成自 己的知識體系,解決這些業務問題将不在話下,應對自如。
高并發系統設計腦圖
那麼,我們怎麼去學習、提高我們的高并發系統設計的能力呢?
說明:文章限于篇幅,故隻做部分展示,完整的《高并發系統設計》文檔小編已經整理好了,正在學習高并發或者想把這份文檔當做練習題複習一下的朋友,文末有擷取資料的免費下載下傳方式!
Step ①:基礎
首先,我們需要了解一下知識點:
- 高并發系統:它的通用設計方法是什麼
- 架構分層:我們為什麼一定要這麼做?
- 系統設計目标(一):如何提升系統性能?
- 系統設計目标(二):系統怎樣做到高可用?
- 系統設計目标(三):如何讓系統易于擴充?
Step ②:資料庫
在第一步中,我已經從宏觀的角度帶你了解了高并發系統設計的基礎知識,你已經知曉了,我們系統設計的目的是為了獲得更好的性能、更高的可用性,以及更強的系統擴充能力。
那麼在這一步,我們正式進入演進篇,我會再從局部出發,帶你逐一了解完成這些目标會使用到的一些方法,這些方法會針對性地解決高并發系統設計中出現的問題。
- 池化技術:如何減少頻繁建立資料庫連接配接的性能損耗?
- 資料庫優化方案(一):查詢請求增加時,如何做主從分離?
- 資料庫優化方案(二):寫入資料量增加時,如何實作分庫分表?
- 發号器:如何保證分庫分表後ID的全局唯一性?
- NoSQL:在高并發場景下,資料庫和NoSQL如何做到互補?
Step ③:緩存
通過前面資料庫篇的學習,你已經了解了在高并發大流量下,資料庫層的演進過程以及庫表設計上的考慮點。
那麼我将從緩存定義、緩存分類和緩存優勢劣勢三個方面全方位帶你掌握緩存的設計思想和理念,帶你針對性地掌握使用緩存的正确姿勢,以便讓你在實際工作中能夠更好地使用緩存提升整體系統的性能。
- 緩存:資料庫成為瓶頸後,動态資料的查詢要如何加速?
- 緩存的使用姿勢(一):如何選擇緩存的讀寫政策?
- 緩存的使用姿勢(二):緩存如何做到高可用?
- 緩存的使用姿勢(三):緩存穿透了怎麼辦?
- CDN:靜态資源如何加速?
Stpe ④:消息隊列
1 秒鐘之内,有 1 萬個資料庫連接配接同時達到,系統的資料庫瀕臨崩潰,尋找能夠應對如此高并發的寫請求方案迫在眉睫。這時你想到了消息隊列。
這裡我會從以下幾個問題去帶大家學習如何使用消息隊列解決秒殺場景下的問題:
- 消息隊列:秒殺時如何處理每秒上萬次的下單請求?
- 消息投遞:如何保證消息僅僅被消費一次?
- 消息隊列:如何降低消息隊列系統中消息的延遲?
Step ⑤:分布式服務
通過前面幾個篇章的内容,你已經從資料庫、緩存和消息隊列的角度對自己的垂直電商系統在性能、可用性和擴充性上做了優化。
但是有一個問題一直萦繞在你的心裡:究竟是什麼促使我們将一體化架構,拆分成微服務化架構?是不是說系統的整體 QPS 到了 1 萬,或者到了 2 萬,就一定要做微服務化拆分呢?
我将從以下幾個點去講解,為什麼我們要用分布式服務?它好在哪裡、如何實作?
- 系統架構:每秒1萬次請求的系統要做服務化拆分嗎?
- 微服務架構:微服務化後,系統架構要如何改造?
- RPC架構:10萬QPS下如何實作毫秒級的服務調用?
- 注冊中心:分布式系統如何尋址?
- 分布式Trace:橫跨幾十個分布式元件的慢請求要如何排查?
- 負載均衡:怎樣提升系統的橫向擴充能力?
- API網關:系統的門面要如何做呢?
- 多機房部署:跨地域的分布式系統如何做?
- Service Mesh:如何屏蔽服務化系統的服務治理細節?
Step ⑥:維護
要想快速地發現和定位業務系統中出現的問題,必須搭建一套完善的服務端監控體系。正所謂“道路千萬條,監控第一條,監控不到位,上司兩行淚”。不過,在搭建的過程中,你的團隊又陷入了困境:
- 首先,監控的名額要如何選擇呢?
- 采集這些名額可以有哪些方法和途徑呢?
- 名額采集到之後又要如何處理和展示呢?
這些問題,一環扣一環,關乎着系統的穩定性和可用性,通過完成一下這些,我就帶你解決這些問題,搭建一套服務端監控體系。
- 給系統加上眼睛:服務端監控要怎麼做?
- 應用性能管理:使用者的使用體驗應該如何監控?
- 壓力測試:怎樣設計全鍊路壓力測試平台?
- 配置管理:成千上萬的配置項要如何管理?
- 降級熔斷:如何屏蔽非核心系統故障的影響?
- 流量控制:高并發系統中我們如何操縱流量?
Step ⑦:實戰
在前面,我分别從資料庫、緩存、消息隊列和分布式服務化的角度,帶你了解了面對高并發的時候要如何保證系統的高性能、高可用和高可擴充。其中雖然有大量的例子輔助你了解理論知識,但是沒有一個完整的執行個體幫你把知識串起來。
是以,為了将我們提及的知識落地,在實戰篇中,我會以微網誌為背景,用兩個完整的案例帶你從實踐的角度應對高并發大流量的沖擊,期望給你一個更加具體的感性認識,為你在實作類似系統的時候提供一些思路。
- 計數系統設計(一):面對海量資料的計數器要如何做?
- 計數系統設計(二):50萬QPS下如何設計未讀數系統?
- 資訊流設計(一):通用資訊流系統的推模式要如何做?
- 資訊流設計(二):通用資訊流系統的拉模式要如何做?
總結
通過以上七個步驟,我想你應該能夠從中獲益良多,掌握高并發系統設計的精髓!