06.如何應(yīng)對高并發(fā)

如何應(yīng)對高并發(fā)

什么是高并發(fā)

高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一,它通常是指,通過設(shè)計保證系統(tǒng)能夠同時并行處理很多請求。高并發(fā)相關(guān)常用的一些指標(biāo)有 響應(yīng)時間(Response Time),吞吐量(Throughput),每秒查詢率 QPS(Query Per Second)并發(fā)用戶數(shù) 等。

  • 響應(yīng)時間: 系統(tǒng)對請求做出響應(yīng)的時間。例如系統(tǒng)處理一個 HTTP 請求需要 200ms,這個 200ms 就是系統(tǒng)的響應(yīng)時間。

  • 吞吐量: 單位時間(年,月,日,時,分,秒)內(nèi)處理的請求數(shù)量。

  • QPS: 每秒響應(yīng)請求數(shù)。在互聯(lián)網(wǎng)領(lǐng)域,這個指標(biāo)和吞吐量區(qū)分的沒有這么明顯。

  • 并發(fā)用戶數(shù): 同時承載正常使用系統(tǒng)功能的用戶數(shù)量。例如一個即時通訊系統(tǒng),同時在線量一定程度上代表了系統(tǒng)的并發(fā)用戶數(shù)。

如何提升系統(tǒng)的并發(fā)能力

互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計,提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:垂直擴(kuò)展(Scale Up)水平擴(kuò)展(Scale Out)。

垂直擴(kuò)展

提升單機處理能力。垂直擴(kuò)展的方式又有兩種:

  • 增強單機硬件性能,例如:增加 CPU 核數(shù)如 32 核,升級更好的網(wǎng)卡如萬兆,升級更好的硬盤如 SSD,擴(kuò)充硬盤容量如 2T,擴(kuò)充系統(tǒng)內(nèi)存如 128G;

  • 提升單機架構(gòu)性能,例如:使用 Cache 來減少 IO 次數(shù),使用異步來增加單服務(wù)吞吐量,使用無鎖數(shù)據(jù)結(jié)構(gòu)來減少響應(yīng)時間;

在互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展非常迅猛的早期,如果預(yù)算不是問題,強烈建議使用 “增強單機硬件性能” 的方式提升系統(tǒng)并發(fā)能力,因為這個階段,公司的戰(zhàn)略往往是發(fā)展業(yè)務(wù)搶時間,而 “增強單機硬件性能” 往往是最快的方法。

不管是提升單機硬件性能,還是提升單機架構(gòu)性能,都有一個致命的不足:單機性能總是有極限的。所以互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計高并發(fā)終極解決方案還是水平擴(kuò)展。

水平擴(kuò)展

只要增加服務(wù)器數(shù)量,就能線性擴(kuò)充系統(tǒng)性能。水平擴(kuò)展對系統(tǒng)架構(gòu)設(shè)計是有要求的,如何在架構(gòu)各層進(jìn)行可水平擴(kuò)展的設(shè)計,以及互聯(lián)網(wǎng)公司架構(gòu)各層常見的水平擴(kuò)展實踐,是本文重點討論的內(nèi)容。

典型互聯(lián)網(wǎng)分層架構(gòu)

如何應(yīng)對高并發(fā)1.png
  • 客戶端層: 典型調(diào)用方是瀏覽器或手機應(yīng)用 APP

  • 反向代理層: 系統(tǒng)入口(Ingress),反向代理(Nginx)

  • 站點應(yīng)用層: 實現(xiàn)核心應(yīng)用邏輯,返回 HTML 或者 JSON

  • 服務(wù)層: 微服務(wù)體現(xiàn)在這一層

  • 數(shù)據(jù)緩存層: 緩存加速訪問存儲

  • 數(shù)據(jù)庫層: 數(shù)據(jù)庫持久化數(shù)據(jù)存儲

水平擴(kuò)展分層架構(gòu)

反向代理層的水平擴(kuò)展

如何應(yīng)對高并發(fā)2.png

反向代理層的水平擴(kuò)展,是通過 DNS 輪詢 實現(xiàn)的:DNS Server 對于一個域名配置了多個解析 IP,每次 DNS 解析請求來訪問 DNS Server,會輪詢返回這些 IP。

當(dāng) Nginx 成為瓶頸的時候,只要增加服務(wù)器數(shù)量,新增 Nginx 服務(wù)的部署,增加一個外網(wǎng) IP,就能擴(kuò)展反向代理層的性能,做到理論上的無限高并發(fā)。

站點應(yīng)用層的水平擴(kuò)展

如何應(yīng)對高并發(fā)3.png

站點層的水平擴(kuò)展,是通過 Nginx 實現(xiàn)的。通過修改 nginx.conf,可以設(shè)置多個 Web 后端。

當(dāng) Web 后端成為瓶頸的時候,只要增加服務(wù)器數(shù)量,新增 Web 服務(wù)的部署,在 Nginx 配置中配置上新的 Web 后端,就能擴(kuò)展站點層的性能,做到理論上的無限高并發(fā)。

服務(wù)層的水平擴(kuò)展

服務(wù)層的水平擴(kuò)展,是通過 服務(wù)連接池 實現(xiàn)的。

站點層通過 RPC Client 調(diào)用下游的服務(wù)層 RPC Server 時,RPC Client 中的連接池會建立與下游服務(wù)多個連接,當(dāng)服務(wù)成為瓶頸的時候,只要增加服務(wù)器數(shù)量,新增服務(wù)部署,在 RPC Client 處建立新的下游服務(wù)連接,就能擴(kuò)展服務(wù)層性能,做到理論上的無限高并發(fā)。如果需要優(yōu)雅的進(jìn)行服務(wù)層自動擴(kuò)容,這里可能需要配置中心里服務(wù)自動發(fā)現(xiàn)功能的支持。

數(shù)據(jù)層的水平擴(kuò)展

在數(shù)據(jù)量很大的情況下,數(shù)據(jù)層(緩存,數(shù)據(jù)庫)涉及數(shù)據(jù)的水平擴(kuò)展,將原本存儲在一臺服務(wù)器上的數(shù)據(jù)(緩存,數(shù)據(jù)庫)水平拆分到不同服務(wù)器上去,以達(dá)到擴(kuò)充系統(tǒng)性能的目的。

按照范圍水平拆分

如何應(yīng)對高并發(fā)5.png

每一個數(shù)據(jù)服務(wù),存儲一定范圍的數(shù)據(jù)

  • user0 庫,存儲 uid 范圍 1-1kw

  • user1 庫,存儲 uid 范圍 1kw-2kw

優(yōu)點:

  • 規(guī)則簡單,Service 只需判斷一下 uid 范圍就能路由到對應(yīng)的存儲服務(wù)

  • 數(shù)據(jù)均衡性較好

  • 比較容易擴(kuò)展,可以隨時加一個 uid [2kw,3kw] 的數(shù)據(jù)服務(wù)

缺點:

  • 請求的負(fù)載不一定均衡,一般來說,新注冊的用戶會比老用戶更活躍,大范圍的服務(wù)請求壓力會更大

按照哈希水平拆分

如何應(yīng)對高并發(fā)6.png

每一個數(shù)據(jù)庫,存儲某個 key 值 hash 后的部分?jǐn)?shù)據(jù)

  • user0 庫,存儲偶數(shù) uid 數(shù)據(jù)

  • user1 庫,存儲奇數(shù) uid 數(shù)據(jù)

優(yōu)點:

  • 規(guī)則簡單,Service 只需對 uid 進(jìn)行 hash 能路由到對應(yīng)的存儲服務(wù)

  • 數(shù)據(jù)均衡性較好

  • 請求均勻性較好

缺點:

  • 不容易擴(kuò)展,擴(kuò)展一個數(shù)據(jù)服務(wù),hash 方法改變時候,可能需要進(jìn)行數(shù)據(jù)遷移

水平拆分與主從同步

這里需要注意的是,通過水平拆分來擴(kuò)充系統(tǒng)性能,與主從同步讀寫分離來擴(kuò)充數(shù)據(jù)庫性能的方式有本質(zhì)的不同。

通過水平拆分?jǐn)U展數(shù)據(jù)庫性能

  • 每個服務(wù)器上存儲的數(shù)據(jù)量是總量的 1/n,所以單機的性能也會有提升

  • n 個服務(wù)器上的數(shù)據(jù)沒有交集,那個服務(wù)器上數(shù)據(jù)的并集是數(shù)據(jù)的全集

  • 數(shù)據(jù)水平拆分到了 n 個服務(wù)器上,理論上讀性能擴(kuò)充了 n 倍,寫性能也擴(kuò)充了 n 倍(其實遠(yuǎn)不止 n 倍,因為單機的數(shù)據(jù)量變?yōu)榱嗽瓉淼?1/n)

通過主從同步讀寫分離擴(kuò)展數(shù)據(jù)庫性能

  • 每個服務(wù)器上存儲的數(shù)據(jù)量是和總量相同

  • n 個服務(wù)器上的數(shù)據(jù)都一樣,都是全集

  • 理論上讀性能擴(kuò)充了 n 倍,寫仍然是單點,寫性能不變

注意: 緩存層的水平拆分和數(shù)據(jù)庫層的水平拆分類似,也是以范圍拆分和哈希拆分的方式居多

總結(jié)

高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一,它通常是指,通過設(shè)計保證系統(tǒng)能夠同時并行處理很多請求。

提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:垂直擴(kuò)展(Scale Up)與水平擴(kuò)展(Scale Out)。前者垂直擴(kuò)展可以通過提升單機硬件性能,或者提升單機架構(gòu)性能,來提高并發(fā)性,但單機性能總是有極限的,互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計高并發(fā)終極解決方案還是后者:水平擴(kuò)展。

互聯(lián)網(wǎng)分層架構(gòu)中,各層次水平擴(kuò)展的實踐又有所不同:

  • 反向代理層可以通過 DNS 輪詢 的方式來進(jìn)行水平擴(kuò)展

  • 站點層可以通過 Nginx 來進(jìn)行水平擴(kuò)展

  • 服務(wù)層可以通過服務(wù)連接池來進(jìn)行水平擴(kuò)展

  • 數(shù)據(jù)庫可以按照數(shù)據(jù)范圍,或者數(shù)據(jù)哈希的方式來進(jìn)行水平擴(kuò)展

各層實施水平擴(kuò)展后,能夠通過增加服務(wù)器數(shù)量的方式來提升系統(tǒng)的性能,做到理論上的性能無限。

摘自魯斯菲爾

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容