您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么理解web開(kāi)發(fā)中的高并發(fā)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么理解web開(kāi)發(fā)中的高并發(fā)”吧!
如何理解高并發(fā)?
高并發(fā)意味著大流量,需要運(yùn)用技術(shù)手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩(wěn)地被系統(tǒng)所處理,帶給用戶(hù)更好的體驗(yàn)。
我們常見(jiàn)的高并發(fā)場(chǎng)景有:淘寶的雙 11、春運(yùn)時(shí)的搶票、微博大 V 的熱點(diǎn)新聞等。
除了這些典型事情,每秒幾十萬(wàn)請(qǐng)求的秒殺系統(tǒng)、每天千萬(wàn)級(jí)的訂單系統(tǒng)、每天億級(jí)日活的信息流系統(tǒng)等,都可以歸為高并發(fā)。
很顯然,上面談到的高并發(fā)場(chǎng)景,并發(fā)量各不相同,那到底多大并發(fā)才算高并發(fā)呢?
①不能只看數(shù)字,要看具體的業(yè)務(wù)場(chǎng)景。不能說(shuō) 10W QPS 的秒殺是高并發(fā),而 1W QPS 的信息流就不是高并發(fā)。
信息流場(chǎng)景涉及復(fù)雜的推薦模型和各種人工策略,它的業(yè)務(wù)邏輯可能比秒殺場(chǎng)景復(fù)雜 10 倍不止。因此,不在同一個(gè)維度,沒(méi)有任何比較意義。
②業(yè)務(wù)都是從 0 到 1 做起來(lái)的,并發(fā)量和 QPS 只是參考指標(biāo),最重要的是:在業(yè)務(wù)量逐漸變成原來(lái)的 10 倍、100 倍的過(guò)程中,你是否用到了高并發(fā)的處理方法去演進(jìn)你的系統(tǒng)。
從架構(gòu)設(shè)計(jì)、編碼實(shí)現(xiàn)、甚至產(chǎn)品方案等維度去預(yù)防和解決高并發(fā)引起的問(wèn)題?而不是一味的升級(jí)硬件、加機(jī)器做水平擴(kuò)展。
此外,各個(gè)高并發(fā)場(chǎng)景的業(yè)務(wù)特點(diǎn)完全不同:有讀多寫(xiě)少的信息流場(chǎng)景、有讀多寫(xiě)多的交易場(chǎng)景,那是否有通用的技術(shù)方案解決不同場(chǎng)景的高并發(fā)問(wèn)題呢?
我覺(jué)得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過(guò)程中,細(xì)節(jié)上還會(huì)有無(wú)數(shù)的坑。
另外,由于軟硬件環(huán)境、技術(shù)棧、以及產(chǎn)品邏輯都沒(méi)法做到完全一致,這些都會(huì)導(dǎo)致同樣的業(yè)務(wù)場(chǎng)景,就算用相同的技術(shù)方案也會(huì)面臨不同的問(wèn)題,這些坑還得一個(gè)個(gè)趟。
因此,這篇文章我會(huì)將重點(diǎn)放在基礎(chǔ)知識(shí)、通用思路、和我曾經(jīng)實(shí)踐過(guò)的有效經(jīng)驗(yàn)上,希望讓你對(duì)高并發(fā)有更深的理解。
高并發(fā)系統(tǒng)設(shè)計(jì)的目標(biāo)是什么?
先搞清楚高并發(fā)系統(tǒng)設(shè)計(jì)的目標(biāo),在此基礎(chǔ)上再討論設(shè)計(jì)方案和實(shí)踐經(jīng)驗(yàn)才有意義和針對(duì)性。
宏觀目標(biāo)
高并發(fā)絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高并發(fā)系統(tǒng)設(shè)計(jì)的目標(biāo)有三個(gè):高性能、高可用,以及高可擴(kuò)展。
①高性能:性能體現(xiàn)了系統(tǒng)的并行處理能力,在有限的硬件投入下,提高性能意味著節(jié)省成本。
同時(shí),性能也反映了用戶(hù)體驗(yàn),響應(yīng)時(shí)間分別是 100 毫秒和 1 秒,給用戶(hù)的感受是完全不同的。
②高可用:表示系統(tǒng)可以正常服務(wù)的時(shí)間。一個(gè)全年不停機(jī)、無(wú)故障;另一個(gè)隔三差五出線上事故、宕機(jī),用戶(hù)肯定選擇前者。另外,如果系統(tǒng)只能做到 90% 可用,也會(huì)大大拖累業(yè)務(wù)。
③高擴(kuò)展:表示系統(tǒng)的擴(kuò)展能力,流量高峰時(shí)能否在短時(shí)間內(nèi)完成擴(kuò)容,更平穩(wěn)地承接峰值流量,比如雙 11 活動(dòng)、明星離婚等熱點(diǎn)事件。
這 3 個(gè)目標(biāo)是需要通盤(pán)考慮的,因?yàn)樗鼈兓ハ嚓P(guān)聯(lián)、甚至也會(huì)相互影響。
比如說(shuō):考慮系統(tǒng)的擴(kuò)展能力,你會(huì)將服務(wù)設(shè)計(jì)成無(wú)狀態(tài)的,這種集群設(shè)計(jì)保證了高擴(kuò)展性,其實(shí)也間接提升了系統(tǒng)的性能和可用性。
再比如說(shuō):為了保證可用性,通常會(huì)對(duì)服務(wù)接口進(jìn)行超時(shí)設(shè)置,以防大量線程阻塞在慢請(qǐng)求上造成系統(tǒng)雪崩,那超時(shí)時(shí)間設(shè)置成多少合理呢?一般,我們會(huì)參考依賴(lài)服務(wù)的性能表現(xiàn)進(jìn)行設(shè)置。
微觀目標(biāo)
再?gòu)奈⒂^角度來(lái)看,高性能、高可用和高擴(kuò)展又有哪些具體的指標(biāo)來(lái)衡量?為什么會(huì)選擇這些指標(biāo)呢?
性能指標(biāo):通過(guò)性能指標(biāo)可以度量目前存在的性能問(wèn)題,同時(shí)作為性能優(yōu)化的評(píng)估依據(jù)。一般來(lái)說(shuō),會(huì)采用一段時(shí)間內(nèi)的接口響應(yīng)時(shí)間作為指標(biāo)。
①平均響應(yīng)時(shí)間:最常用,但是缺陷很明顯,對(duì)于慢請(qǐng)求不敏感。比如 1 萬(wàn)次請(qǐng)求,其中 9900 次是 1ms,100 次是 100ms,則平均響應(yīng)時(shí)間為 1.99ms,雖然平均耗時(shí)僅增加了 0.99ms,但是 1% 請(qǐng)求的響應(yīng)時(shí)間已經(jīng)增加了 100 倍。
②TP90、TP99 等分位值:將響應(yīng)時(shí)間按照從小到大排序,TP90 表示排在第 90 分位的響應(yīng)時(shí)間, 分位值越大,對(duì)慢請(qǐng)求越敏感。
③吞吐量:和響應(yīng)時(shí)間呈反比,比如響應(yīng)時(shí)間是 1ms,則吞吐量為每秒 1000 次。
通常,設(shè)定性能目標(biāo)時(shí)會(huì)兼顧吞吐量和響應(yīng)時(shí)間,比如這樣表述:在每秒 1 萬(wàn)次請(qǐng)求下,AVG 控制在 50ms 以下,TP99 控制在 100ms 以下。對(duì)于高并發(fā)系統(tǒng),AVG 和 TP 分位值必須同時(shí)要考慮。
另外,從用戶(hù)體驗(yàn)角度來(lái)看,200 毫秒被認(rèn)為是第一個(gè)分界點(diǎn),用戶(hù)感覺(jué)不到延遲,1 秒是第二個(gè)分界點(diǎn),用戶(hù)能感受到延遲,但是可以接受。
因此,對(duì)于一個(gè)健康的高并發(fā)系統(tǒng),TP99 應(yīng)該控制在 200 毫秒以?xún)?nèi),TP999 或者 TP9999 應(yīng)該控制在 1 秒以?xún)?nèi)。
可用性指標(biāo):高可用性是指系統(tǒng)具有較高的無(wú)故障運(yùn)行能力,可用性=平均故障時(shí)間/系統(tǒng)總運(yùn)行時(shí)間,一般使用幾個(gè) 9 來(lái)描述系統(tǒng)的可用性。
對(duì)于高并發(fā)系統(tǒng)來(lái)說(shuō),最基本的要求是:保證 3 個(gè) 9 或者 4 個(gè) 9。原因很簡(jiǎn)單,如果你只能做到 2 個(gè) 9,意味著有 1% 的故障時(shí)間,像一些大公司每年動(dòng)輒千億以上的 GMV 或者收入,1% 就是 10 億級(jí)別的業(yè)務(wù)影響。
可擴(kuò)展性指標(biāo):面對(duì)突發(fā)流量,不可能臨時(shí)改造架構(gòu),最快的方式就是增加機(jī)器來(lái)線性提高系統(tǒng)的處理能力。
對(duì)于業(yè)務(wù)集群或者基礎(chǔ)組件來(lái)說(shuō),擴(kuò)展性=性能提升比例/機(jī)器增加比例,理想的擴(kuò)展能力是:資源增加幾倍,性能提升幾倍。通常來(lái)說(shuō),擴(kuò)展能力要維持在 70% 以上。
但是從高并發(fā)系統(tǒng)的整體架構(gòu)角度來(lái)看,擴(kuò)展的目標(biāo)不僅僅是把服務(wù)設(shè)計(jì)成無(wú)狀態(tài)就行了,因?yàn)楫?dāng)流量增加 10 倍,業(yè)務(wù)服務(wù)可以快速擴(kuò)容 10 倍,但是數(shù)據(jù)庫(kù)可能就成為了新的瓶頸。
像 MySQL 這種有狀態(tài)的存儲(chǔ)服務(wù)通常是擴(kuò)展的技術(shù)難點(diǎn),如果架構(gòu)上沒(méi)提前做好規(guī)劃(垂直和水平拆分),就會(huì)涉及到大量數(shù)據(jù)的遷移。
因此,高擴(kuò)展性需要考慮:服務(wù)集群、數(shù)據(jù)庫(kù)、緩存和消息隊(duì)列等中間件、負(fù)載均衡、帶寬、依賴(lài)的第三方等,當(dāng)并發(fā)達(dá)到某一個(gè)量級(jí)后,上述每個(gè)因素都可能成為擴(kuò)展的瓶頸點(diǎn)。
高并發(fā)的實(shí)踐方案有哪些?
了解了高并發(fā)設(shè)計(jì)的 3 大目標(biāo)后,再系統(tǒng)性總結(jié)下高并發(fā)的設(shè)計(jì)方案,會(huì)從以下兩部分展開(kāi):先總結(jié)下通用的設(shè)計(jì)方法,然后再?lài)@高性能、高可用、高擴(kuò)展分別給出具體的實(shí)踐方案。
通用的設(shè)計(jì)方法
通用的設(shè)計(jì)方法主要是從「縱向」和「橫向」兩個(gè)維度出發(fā),俗稱(chēng)高并發(fā)處理的兩板斧:縱向擴(kuò)展和橫向擴(kuò)展。
縱向擴(kuò)展(scale-up):它的目標(biāo)是提升單機(jī)的處理能力。
方案包括如下兩種:
提升單機(jī)的硬件性能:通過(guò)增加內(nèi)存、CPU 核數(shù)、存儲(chǔ)容量、或者將磁盤(pán)升級(jí)成 SSD 等堆硬件的方式來(lái)提升。
提升單機(jī)的軟件性能:使用緩存減少 IO 次數(shù),使用并發(fā)或者異步的方式增加吞吐量。
橫向擴(kuò)展(scale-out):因?yàn)閱螜C(jī)性能總會(huì)存在極限,所以最終還需要引入橫向擴(kuò)展,通過(guò)集群部署以進(jìn)一步提高并發(fā)處理能力。
包括以下兩個(gè)方向:
①做好分層架構(gòu):這是橫向擴(kuò)展的提前,因?yàn)楦卟l(fā)系統(tǒng)往往業(yè)務(wù)復(fù)雜,通過(guò)分層處理可以簡(jiǎn)化復(fù)雜問(wèn)題,更容易做到橫向擴(kuò)展。
上面這種圖是互聯(lián)網(wǎng)最常見(jiàn)的分層架構(gòu),當(dāng)然真實(shí)的高并發(fā)系統(tǒng)架構(gòu)會(huì)在此基礎(chǔ)上進(jìn)一步完善。
比如會(huì)做動(dòng)靜分離并引入 CDN,反向代理層可以是 LVS+Nginx,Web 層可以是統(tǒng)一的 API 網(wǎng)關(guān),業(yè)務(wù)服務(wù)層可進(jìn)一步按垂直業(yè)務(wù)做微服務(wù)化,存儲(chǔ)層可以是各種異構(gòu)數(shù)據(jù)庫(kù)。
②各層進(jìn)行水平擴(kuò)展:無(wú)狀態(tài)水平擴(kuò)容,有狀態(tài)做分片路由。業(yè)務(wù)集群通常能設(shè)計(jì)成無(wú)狀態(tài)的,而數(shù)據(jù)庫(kù)和緩存往往是有狀態(tài)的,因此需要設(shè)計(jì)分區(qū)鍵做好存儲(chǔ)分片,當(dāng)然也可以通過(guò)主從同步、讀寫(xiě)分離的方案提升讀性能。
具體的實(shí)踐方案
下面再結(jié)合我的個(gè)人經(jīng)驗(yàn),針對(duì)高性能、高可用、高擴(kuò)展 3 個(gè)方面,總結(jié)下可落地的實(shí)踐方案。
高性能的實(shí)踐方案:
集群部署,通過(guò)負(fù)載均衡減輕單機(jī)壓力。
多級(jí)緩存,包括靜態(tài)數(shù)據(jù)使用 CDN、本地緩存、分布式緩存等,以及對(duì)緩存場(chǎng)景中的熱點(diǎn) Key、緩存穿透、緩存并發(fā)、數(shù)據(jù)一致性等問(wèn)題的處理。
分庫(kù)分表和索引優(yōu)化,以及借助搜索引擎解決復(fù)雜查詢(xún)問(wèn)題。
考慮 NoSQL 數(shù)據(jù)庫(kù)的使用,比如 HBase、TiDB 等,但是團(tuán)隊(duì)必須熟悉這些組件,且有較強(qiáng)的運(yùn)維能力。
異步化,將次要流程通過(guò)多線程、MQ、甚至延時(shí)任務(wù)進(jìn)行異步處理。
限流,需要先考慮業(yè)務(wù)是否允許限流(比如秒殺場(chǎng)景是允許的),包括前端限流、Nginx 接入層的限流、服務(wù)端的限流。
對(duì)流量進(jìn)行削峰填谷,通過(guò) MQ 承接流量。
并發(fā)處理,通過(guò)多線程將串行邏輯并行化。
預(yù)計(jì)算,比如搶紅包場(chǎng)景,可以提前計(jì)算好紅包金額緩存起來(lái),發(fā)紅包時(shí)直接使用即可。
緩存預(yù)熱,通過(guò)異步任務(wù)提前預(yù)熱數(shù)據(jù)到本地緩存或者分布式緩存中。
減少 IO 次數(shù),比如數(shù)據(jù)庫(kù)和緩存的批量讀寫(xiě)、RPC 的批量接口支持、或者通過(guò)冗余數(shù)據(jù)的方式干掉 RPC 調(diào)用。
減少 IO 時(shí)的數(shù)據(jù)包大小,包括采用輕量級(jí)的通信協(xié)議、合適的數(shù)據(jù)結(jié)構(gòu)、去掉接口中的多余字段、減少緩存 Key 的大小、壓縮緩存 Value 等。
程序邏輯優(yōu)化,比如將大概率阻斷執(zhí)行流程的判斷邏輯前置、For 循環(huán)的計(jì)算邏輯優(yōu)化,或者采用更高效的算法。
各種池化技術(shù)的使用和池大小的設(shè)置,包括 HTTP 請(qǐng)求池、線程池(考慮 CPU 密集型還是 IO 密集型設(shè)置核心參數(shù))、數(shù)據(jù)庫(kù)和 Redis 連接池等。
JVM 優(yōu)化,包括新生代和老年代的大小、GC 算法的選擇等,盡可能減少 GC 頻率和耗時(shí)。
鎖選擇,讀多寫(xiě)少的場(chǎng)景用樂(lè)觀鎖,或者考慮通過(guò)分段鎖的方式減少鎖沖突。
上述方案無(wú)外乎從計(jì)算和 IO 兩個(gè)維度考慮所有可能的優(yōu)化點(diǎn),需要有配套的監(jiān)控系統(tǒng)實(shí)時(shí)了解當(dāng)前的性能表現(xiàn),并支撐你進(jìn)行性能瓶頸分析,然后再遵循二八原則,抓主要矛盾進(jìn)行優(yōu)化。
高可用的實(shí)踐方案:
對(duì)等節(jié)點(diǎn)的故障轉(zhuǎn)移,Nginx 和服務(wù)治理框架均支持一個(gè)節(jié)點(diǎn)失敗后訪問(wèn)另一個(gè)節(jié)點(diǎn)。
非對(duì)等節(jié)點(diǎn)的故障轉(zhuǎn)移,通過(guò)心跳檢測(cè)并實(shí)施主備切換(比如redis的哨兵模式或者集群模式、MySQL 的主從切換等)。
接口層面的超時(shí)設(shè)置、重試策略和冪等設(shè)計(jì)。
降級(jí)處理:保證核心服務(wù),犧牲非核心服務(wù),必要時(shí)進(jìn)行熔斷;或者核心鏈路出問(wèn)題時(shí),有備選鏈路。
限流處理:對(duì)超過(guò)系統(tǒng)處理能力的請(qǐng)求直接拒絕或者返回錯(cuò)誤碼。
MQ 場(chǎng)景的消息可靠性保證,包括 Producer 端的重試機(jī)制、Broker 側(cè)的持久化、Consumer 端的 Ack 機(jī)制等。
灰度發(fā)布,能支持按機(jī)器維度進(jìn)行小流量部署,觀察系統(tǒng)日志和業(yè)務(wù)指標(biāo),等運(yùn)行平穩(wěn)后再推全量。
監(jiān)控報(bào)警:全方位的監(jiān)控體系,包括最基礎(chǔ)的 CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)的監(jiān)控,以及 Web 服務(wù)器、JVM、數(shù)據(jù)庫(kù)、各類(lèi)中間件的監(jiān)控和業(yè)務(wù)指標(biāo)的監(jiān)控。
災(zāi)備演練:類(lèi)似當(dāng)前的“混沌工程”,對(duì)系統(tǒng)進(jìn)行一些破壞性手段,觀察局部故障是否會(huì)引起可用性問(wèn)題。
高可用的方案主要從冗余、取舍、系統(tǒng)運(yùn)維 3 個(gè)方向考慮,同時(shí)需要有配套的值班機(jī)制和故障處理流程,當(dāng)出現(xiàn)線上問(wèn)題時(shí),可及時(shí)跟進(jìn)處理。
高擴(kuò)展的實(shí)踐方案:
合理的分層架構(gòu):比如上面談到的互聯(lián)網(wǎng)最常見(jiàn)的分層架構(gòu),另外還能進(jìn)一步按照數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層對(duì)微服務(wù)做更細(xì)粒度的分層(但是需要評(píng)估性能,會(huì)存在網(wǎng)絡(luò)多一跳的情況)。
存儲(chǔ)層的拆分:按照業(yè)務(wù)維度做垂直拆分、按照數(shù)據(jù)特征維度進(jìn)一步做水平拆分(分庫(kù)分表)。
業(yè)務(wù)層的拆分:最常見(jiàn)的是按照業(yè)務(wù)維度拆(比如電商場(chǎng)景的商品服務(wù)、訂單服務(wù)等),也可以按照核心接口和非核心接口拆,還可以按照請(qǐng)求源拆(比如 To C 和 To B,APP 和 H5)。
感謝各位的閱讀,以上就是“怎么理解web開(kāi)發(fā)中的高并發(fā)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么理解web開(kāi)發(fā)中的高并發(fā)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。