當(dāng)前位置:首頁 > 技術(shù)學(xué)院 > 技術(shù)前線
[導(dǎo)讀]什么是高并發(fā),從字面上理解,就是在某一時刻產(chǎn)生大量的請求,那么多少量稱為大量,業(yè)界并沒有標(biāo)準(zhǔn)的衡量范圍。原因非常簡單,不同的業(yè)務(wù)處理復(fù)雜度不一樣。

高并發(fā),幾乎是每個程序員都想擁有的經(jīng)驗。原因很簡單:隨著流量變大,會遇到各種各樣的技術(shù)問題,比如接口響應(yīng)超時、CPU load升高、GC頻繁、死鎖、大數(shù)據(jù)量存儲等等,這些問題能推動我們在技術(shù)深度上不斷精進(jìn)。

什么是高并發(fā),從字面上理解,就是在某一時刻產(chǎn)生大量的請求,那么多少量稱為大量,業(yè)界并沒有標(biāo)準(zhǔn)的衡量范圍。原因非常簡單,不同的業(yè)務(wù)處理復(fù)雜度不一樣。

而我所理解的高并發(fā),它并不只是一個數(shù)字,而更是一種架構(gòu)思維模式,它讓你在面對不同的復(fù)雜情況下,從容地選擇不同的技術(shù)手段,來提升應(yīng)用系統(tǒng)的處理能力。

但是,并不意味應(yīng)用系統(tǒng)從誕生的那一刻,就需要具備強大的處理能力,這種做法并不提倡。要知道,脫離實際情況的技術(shù),會顯得毫無價值,甚至是一種浪費的表現(xiàn)。

言歸正傳,那高并發(fā)到底是一種怎樣的架構(gòu)思維模式,它對架構(gòu)設(shè)計又有什么影響,以及如何通過它來驅(qū)動架構(gòu)演進(jìn),讓我們接著往下讀,慢慢去體會這其中的精髓。

性能是一種基礎(chǔ)

在架構(gòu)設(shè)計的過程中,思考固然重要,但目標(biāo)更為關(guān)鍵。通過目標(biāo)的牽引力,可以始終確保推進(jìn)方向,不會脫離成功的軌道。那高并發(fā)的目標(biāo)是什么,估計你的第一反應(yīng)就是性能。

沒錯,性能是高并發(fā)的目標(biāo)之一,它不可或缺,但并不代表所有。而我將它視為是高并發(fā)的一種基礎(chǔ)能力,它的能力高低將會直接影響到其他能力的取舍。例如:服務(wù)可用性,數(shù)據(jù)一致性等。

性能在軟件研發(fā)過程中無處不在,不管是在非功能性需求中,還是在性能測試報告中,都能見到它的身影。那么如何來衡量它的高低呢,先來看看常用的性能指標(biāo)。

在過往的面試中,如果候選人做過高并發(fā)的項目,我通常會讓對方談?wù)剬τ诟卟l(fā)的理解,但是能系統(tǒng)性地回答好此問題的人并不多,大概分成這樣幾類:

1、對數(shù)據(jù)化的指標(biāo)沒有概念:不清楚選擇什么樣的指標(biāo)來衡量高并發(fā)系統(tǒng)?分不清并發(fā)量和QPS,甚至不知道自己系統(tǒng)的總用戶量、活躍用戶量,平峰和高峰時的QPS和TPS等關(guān)鍵數(shù)據(jù)。

2、設(shè)計了一些方案,但是細(xì)節(jié)掌握不透徹:講不出該方案要關(guān)注的技術(shù)點和可能帶來的副作用。比如讀性能有瓶頸會引入緩存,但是忽視了緩存命中率、熱點key、數(shù)據(jù)一致性等問題。

3、理解片面,把高并發(fā)設(shè)計等同于性能優(yōu)化:大談并發(fā)編程、多級緩存、異步化、水平擴容,卻忽視高可用設(shè)計、服務(wù)治理和運維保障。

4、掌握大方案,卻忽視最基本的東西:能講清楚垂直分層、水平分區(qū)、緩存等大思路,卻沒意識去分析數(shù)據(jù)結(jié)構(gòu)是否合理,算法是否高效,沒想過從最根本的IO和計算兩個維度去做細(xì)節(jié)優(yōu)化。

如何理解高并發(fā)?高并發(fā)系統(tǒng)設(shè)計的目標(biāo)是什么?高并發(fā)的實踐方案有哪些?

如何理解高并發(fā)?

高并發(fā)意味著大流量,需要運用技術(shù)手段抵抗流量的沖擊,這些手段好比操作流量,能讓流量更平穩(wěn)地被系統(tǒng)所處理,帶給用戶更好的體驗。

我們常見的高并發(fā)場景有:淘寶的雙11、春運時的搶票、微博大V的熱點新聞等。除了這些典型事情,每秒幾十萬請求的秒殺系統(tǒng)、每天千萬級的訂單系統(tǒng)、每天億級日活的信息流系統(tǒng)等,都可以歸為高并發(fā)。

很顯然,上面談到的高并發(fā)場景,并發(fā)量各不相同,那到底多大并發(fā)才算高并發(fā)呢?

1、不能只看數(shù)字,要看具體的業(yè)務(wù)場景。不能說10W QPS的秒殺是高并發(fā),而1W QPS的信息流就不是高并發(fā)。信息流場景涉及復(fù)雜的推薦模型和各種人工策略,它的業(yè)務(wù)邏輯可能比秒殺場景復(fù)雜10倍不止。因此,不在同一個維度,沒有任何比較意義。

2、業(yè)務(wù)都是從0到1做起來的,并發(fā)量和QPS只是參考指標(biāo),最重要的是:在業(yè)務(wù)量逐漸變成原來的10倍、100倍的過程中,你是否用到了高并發(fā)的處理方法去演進(jìn)你的系統(tǒng),從架構(gòu)設(shè)計、編碼實現(xiàn)、甚至產(chǎn)品方案等維度去預(yù)防和解決高并發(fā)引起的問題?而不是一味的升級硬件、加機器做水平擴展。

此外,各個高并發(fā)場景的業(yè)務(wù)特點完全不同:有讀多寫少的信息流場景、有讀多寫多的交易場景,那是否有通用的技術(shù)方案解決不同場景的高并發(fā)問題呢?

我覺得大的思路可以借鑒,別人的方案也可以參考,但是真正落地過程中,細(xì)節(jié)上還會有無數(shù)的坑。另外,由于軟硬件環(huán)境、技術(shù)棧、以及產(chǎn)品邏輯都沒法做到完全一致,這些都會導(dǎo)致同樣的業(yè)務(wù)場景,就算用相同的技術(shù)方案也會面臨不同的問題,這些坑還得一個個趟。

高并發(fā)系統(tǒng)設(shè)計的目標(biāo)是什么?

先搞清楚高并發(fā)系統(tǒng)設(shè)計的目標(biāo),在此基礎(chǔ)上再討論設(shè)計方案和實踐經(jīng)驗才有意義和針對性。

2.1 宏觀目標(biāo)

高并發(fā)絕不意味著只追求高性能,這是很多人片面的理解。從宏觀角度看,高并發(fā)系統(tǒng)設(shè)計的目標(biāo)有三個:高性能、高可用,以及高可擴展。

1、高性能:性能體現(xiàn)了系統(tǒng)的并行處理能力,在有限的硬件投入下,提高性能意味著節(jié)省成本。同時,性能也反映了用戶體驗,響應(yīng)時間分別是100毫秒和1秒,給用戶的感受是完全不同的。

2、高可用:表示系統(tǒng)可以正常服務(wù)的時間。一個全年不停機、無故障;另一個隔三差五出線上事故、宕機,用戶肯定選擇前者。另外,如果系統(tǒng)只能做到90%可用,也會大大拖累業(yè)務(wù)。

3、高擴展:表示系統(tǒng)的擴展能力,流量高峰時能否在短時間內(nèi)完成擴容,更平穩(wěn)地承接峰值流量,比如雙11活動、明星離婚等熱點事件。

高并發(fā)是每個程序員都渴望了解和掌握的技能。隨著流量的增長,我們面臨著各種技術(shù)挑戰(zhàn),比如接口響應(yīng)超時、CPU Load 上升、GC 頻繁,死鎖等問題。解決這些問題是需要我們不斷精進(jìn)自我技術(shù)深度。

然而,在面對高并發(fā),很多人對其的理解并不透徹,其實不管是后端程序員,也不管你用的是什么語言,還是測試工程師、運維工程師,都需要對高并發(fā)有很好的了解和掌握。

在過往面試候選人的時候,一旦看到簡歷中有高并發(fā)經(jīng)驗,尤其是那種寫著擅長和精通高并發(fā)系統(tǒng)設(shè)計與開發(fā)的候選人,我就特別興奮,但是結(jié)果往往是讓我失望的,很少有人能全面系統(tǒng)性地回答關(guān)于高并發(fā)相關(guān)的問題。

類型一:高并發(fā)基本概念不清

這些簡歷寫著高并發(fā)經(jīng)驗的候選人,有很大一批對高并發(fā)基本概念都是不清楚的,最典型的就是我們?nèi)绾魏饬恳粋€系統(tǒng)是高并發(fā)系統(tǒng)。更有甚者竟然連什么叫并發(fā)量、什么是 QPS 都不知道。一個內(nèi)部系統(tǒng)都能說出 QPS 上萬的答案。

類型二:高并發(fā)技術(shù)細(xì)節(jié)掌握弱

也確實有一部分候選人參與了高并發(fā)系統(tǒng)的開發(fā),甚至也參與了一些技術(shù)方案的設(shè)計。但是他們卻很難講出高并發(fā)技術(shù)方案要關(guān)注的技術(shù)細(xì)節(jié)以及優(yōu)缺點。比如我們正常在提升讀數(shù)據(jù)性能場景時,引入緩存實現(xiàn)方案,這個都能答出來,但是你繼續(xù)問緩存命中率、HotKey、數(shù)據(jù)一致性這些就不會了。

類型三:高并發(fā)缺乏體系化理解

高并發(fā)技術(shù)體系是一個系統(tǒng)化的工程,要求全面性,而現(xiàn)實中很多技術(shù)人卻掌握的很片面,一提到高并發(fā)就開始回答多線程并發(fā)編程技術(shù)、緩存技術(shù)、消息中間件技術(shù)等,但是他們不知道在高并發(fā)系統(tǒng)中,如何進(jìn)行系統(tǒng)的高可用保障方案以及如何進(jìn)行運維保障等相關(guān)內(nèi)容。

當(dāng)然,就像灸哥一直說的,一位高并發(fā)系統(tǒng)設(shè)計專家從來都不是靠課本等渠道學(xué)習(xí)出來的,而是實打?qū)嵄槐瞥鰜淼?。你想想?dāng)年灸哥在某寶直播團(tuán)隊,當(dāng) QPS 到幾十萬甚至上千萬的時候,如果我負(fù)責(zé)的系統(tǒng)服務(wù)不能扛住,那我就是 3.25,年底啥也沒有。那這種情況下,你要不要對你的系統(tǒng)做高并發(fā)的系統(tǒng)重構(gòu)優(yōu)化呢?答案是非常肯定的。

接下來,我將結(jié)合我多年的高并發(fā)項目經(jīng)歷,會給大家一起來聊聊高并發(fā)相關(guān)的內(nèi)容。

首先,我們先一起聊聊高并發(fā)是什么?

高并發(fā)的定義

高并發(fā)是指系統(tǒng)在同一時間段內(nèi)同時處理大量請求的能力,這里的請求包括網(wǎng)絡(luò)請求、數(shù)據(jù)庫訪問請求、文件讀寫請求等。簡單講,就是當(dāng)有大量用戶同時訪問你的系統(tǒng)時,系統(tǒng)能夠有效處理這些請求而不出現(xiàn)性能下降或者系統(tǒng)崩潰的情況。

通俗講,高并發(fā)就是指系統(tǒng)突增巨大請求流量,需要程序員通過各種技術(shù)手段來應(yīng)對高流量對你系統(tǒng)的沖擊,讓你的系統(tǒng)不掛,前端可以正常服務(wù)用戶。像阿里的雙十一、雙十二、京東的六一八等促銷場景,都是高并發(fā)的典型場景。

但是,對于多少的并發(fā)量才算是高并發(fā)呢?這個需要根據(jù)具體的業(yè)務(wù)場景來確定的,業(yè)內(nèi)并沒有一個確定性的數(shù)據(jù)指標(biāo)來定義。

除了對應(yīng)的數(shù)字以外,我們在進(jìn)行高并發(fā)系統(tǒng)設(shè)計的時候,更多的需要考慮業(yè)務(wù)場景的復(fù)雜性和處理方式。不同的業(yè)務(wù)場景需要不同的處理方法。

因此,對于高并發(fā)的理解,它不是簡單地追求數(shù)字,而是需要綜合考慮多個維度。

接下來,我們聊一聊高并發(fā)系統(tǒng)的目標(biāo)有哪些?

高并發(fā)的目標(biāo)

高并發(fā)系統(tǒng)的目標(biāo)從系統(tǒng)層面看,有高性能、高可用和高擴展三個目標(biāo),這三個目標(biāo)是相輔相成,需要綜合在一起考慮。在追求系統(tǒng)高性能的同時,也要保障對應(yīng)系統(tǒng)的高可用和高擴展。只有全面綜合考慮這三個目標(biāo),才能設(shè)計出穩(wěn)定、高效的高并發(fā)系統(tǒng)架構(gòu)。

高性能

高性能是高并發(fā)系統(tǒng)的首要目標(biāo)之一,系統(tǒng)需要能夠在短時間內(nèi)處理大量的并發(fā)請求,保持良好的響應(yīng)速度和低延遲,以提供優(yōu)質(zhì)的用戶體驗。你可以想想,同樣的兩個產(chǎn)品,你在 A 這一個下單請求需要 1min,在 B 這僅需要 10ms,你心里的感覺是如何的呢?是不是對 A 開始罵娘?甚至已經(jīng)馬上卸載了 A 吧?高性能的系統(tǒng)是能夠滿足用戶對實時性和響應(yīng)速度的需求,提升用戶滿意度。

高可用

高可用性是指系統(tǒng)能夠保持長時間的穩(wěn)定運行,對于用戶的請求都能夠做出及時的響應(yīng),不會因為系統(tǒng)故障或者其他原因?qū)е路?wù)中斷或者不可用。高可用性的系統(tǒng)能夠最大程度地減少因系統(tǒng)故障而造成的損失,保障業(yè)務(wù)的連續(xù)性和穩(wěn)定性。你可以想想如果一個系統(tǒng)全年不宕機,另外一個系統(tǒng)隔三差五地來個線上事故,如果你是用戶,你會怎么選擇呢?

高擴展

高擴展性是指系統(tǒng)能夠在業(yè)務(wù)量增長或者流量激增的情況下,可以通過增加資源或者擴展節(jié)點等簡單方式就可以提升系統(tǒng)的處理能力,保持系統(tǒng)的穩(wěn)定性和性能表現(xiàn)。高擴展性的系統(tǒng)能夠隨著業(yè)務(wù)的發(fā)展而靈活調(diào)整,適應(yīng)不斷變化的業(yè)務(wù)需求。

以上三個目標(biāo)被稱為是高并發(fā)系統(tǒng)的宏觀目標(biāo),在微觀層面同樣也有著對應(yīng)的目標(biāo),我們接下來一起看看微觀層面的目標(biāo):

性能指標(biāo)

評估一個高并發(fā)系統(tǒng)的性能指標(biāo)一般包括系統(tǒng)的響應(yīng)時間、吞吐量、處理能力等,通過監(jiān)控這些性能指標(biāo)可以評估出系統(tǒng)的性能表現(xiàn),并根據(jù)分析結(jié)果對系統(tǒng)進(jìn)行優(yōu)化和調(diào)整。

QPS Queries Per Second

QPS 是衡量信息系統(tǒng)在一秒鐘內(nèi)接收到的搜索流量的一種常見度量指標(biāo),被廣泛應(yīng)用在任何請求-響應(yīng)的系統(tǒng)中,稱為每秒請求數(shù)。對于高并發(fā)的系統(tǒng),必須要關(guān)注 QPS,這樣你才能指導(dǎo)你的系統(tǒng)何時需要進(jìn)行擴容。

TPS,Transactions Per Second

TPS 是軟件測試結(jié)果的測量單位,是指每秒的事務(wù)數(shù)量,一個事務(wù)是指一個客戶端向服務(wù)器發(fā)送請求然后服務(wù)器做出響應(yīng)的過程??蛻舳嗽诎l(fā)送請求時開始計時,收到服務(wù)器響應(yīng)后結(jié)束計時,用來計算使用的時間和完成的事務(wù)個數(shù)。

QPS VS TPS

QPS 基本可以理解為類似于 TPS,但不同的是,對于一個頁面的一次訪問,形成一個 TPS,但一次頁面請求,可能會產(chǎn)生多次對服務(wù)器的請求,就是說會有多個 QPS。

RT Response-time

RT 是指一個請求從開始到最后收到響應(yīng)數(shù)據(jù)結(jié)果所花費的總時間,即響應(yīng)時間。響應(yīng)時間是一個系統(tǒng)最重要的指標(biāo)之一,它的數(shù)值大小直接反應(yīng)了系統(tǒng)的快慢。

并發(fā)數(shù)

并發(fā)數(shù)是指系統(tǒng)同時能處理的請求數(shù)量,這個指標(biāo)反應(yīng)了系統(tǒng)的負(fù)載能力。并發(fā)意味著可以同時進(jìn)行多個處理,并發(fā)在現(xiàn)代編程中無處不在。

吞吐量

系統(tǒng)的吞吐量和處理對 CPU 的消耗、外部接口、IO 等多個因素緊密相關(guān),單個處理請求對 CPU 消耗越高,外部系統(tǒng)接口、IO 速度越慢,系統(tǒng)的吞吐能力越低,反之越高。系統(tǒng)吞吐量有幾個重要指標(biāo)參數(shù):QPS/TPS、并發(fā)數(shù)、響應(yīng)時間。

接下來我們來看一個具體的例子來理解這些指標(biāo)。

某寶直播業(yè)務(wù)要求預(yù)估計算對應(yīng)的各個指標(biāo)。正常在進(jìn)行流量估算的時候,會采用二八定律,如果每天 80% 的訪問集中在 20% 的時間段里,那這個 20% 的時間就被稱為峰值時間。

那峰值時間內(nèi)的 QPS 粗估就可以按照下面的公式來計算:

峰值時間的 QPS = (總 PV 數(shù) * 80%)/(每天秒數(shù) * 20%)

所需要的機器需求就可以這么來計算:

需要的機器數(shù)量 = 峰值時間的 QPS / 單臺機器的 QPS

可用性指標(biāo)

可用性指標(biāo)主要用于評估在一段時間內(nèi)保持正常運行的能力,以及系統(tǒng)對用戶請求的響應(yīng)能力??捎眯灾笜?biāo)有助于衡量系統(tǒng)的穩(wěn)定性和可靠性,確保系統(tǒng)可以滿足用戶的需求。

系統(tǒng)的可用時間

系統(tǒng)的可用時間是指系統(tǒng)在一定時間段內(nèi)正常運行的時間總和,通常以百分比形式表示,計算公式如下:

可用性 = 正常運行時間 / 系統(tǒng)總運行時間

高并發(fā)系統(tǒng)一般會要求在 99.9% 以上的可用性,甚至更高,這也就是我們在日常工作中說的幾個 9。具體的數(shù)值計算如下圖所示:

可用性一天總故障時間一年總故障時間

90%2.4 H36.5 D

99%14.4 min3.65 D

99.9%1.44 min8 H

99.99%8.6 s52 min

高可用性除了主要依賴可用性這一指標(biāo)以外,一般還有以下幾個考量指標(biāo):

故障率

故障率是指系統(tǒng)在一定時間內(nèi)發(fā)生故障的次數(shù)與總操作次數(shù)的比率,它可以幫助評估系統(tǒng)的穩(wěn)定性,通常以每天、每月、每季度的故障次數(shù)來衡量。

平均故障間隔時間

平均故障間隔時間是指系統(tǒng)在兩次故障之間的平均時間間隔,通常以天為單位,比較長的平均故障間隔時間說明系統(tǒng)更穩(wěn)定可靠。

平均修復(fù)時間

平均修復(fù)時間是指系統(tǒng)從發(fā)生故障到回復(fù)正常運行所需的平均時間,比較短的平均修復(fù)時間意味著系統(tǒng)可以更快地恢復(fù)正常運行。

擴展性指標(biāo)

面對激增突發(fā)的流量,不可能也來不及改造架構(gòu)應(yīng)對,最快的方式就是通用增加機器和擴展節(jié)點來提高系統(tǒng)的處理能力。對于業(yè)務(wù)服務(wù)集群或者基礎(chǔ)組件來說,擴展性 = 性能提升比例 / 機器增加比例。比較理想的擴展能力就是資源增加幾倍,性能提升幾倍。正常高并發(fā)系統(tǒng),在擴展性上的要求是維持在 70% 以上。

很多人在應(yīng)對擴展性的時候,最常用的方案就是把服務(wù)設(shè)計成無狀態(tài)服務(wù),但是當(dāng)流量增長 100 倍,服務(wù)快速擴容 100 倍后,你會發(fā)現(xiàn)你的數(shù)據(jù)庫成為了瓶頸。尤其是關(guān)系數(shù)據(jù)庫,比如 MySQL 的存儲服務(wù)是有狀態(tài)的,這往往是高擴展的技術(shù)挑戰(zhàn),如果架構(gòu)上沒有做好提前的規(guī)劃,比如垂直和水平拆分等,就會涉及到大量的數(shù)據(jù)遷移工作。

從上述分析,可以得出結(jié)論:高擴展性一般要考慮服務(wù)集群、數(shù)據(jù)庫、緩存、消息隊列、負(fù)載均衡、帶寬、三方服務(wù)等,當(dāng)你系統(tǒng)的流量到達(dá)一個量級后,這些都有可能成為你擴展性的阻塞因素。

在考量系統(tǒng)擴展性的時候,一般實用的指標(biāo)如下:

水平擴展比例

水平擴展比例是指系統(tǒng)增加節(jié)點或者機器后,系統(tǒng)性能能夠線性提升的比例。比如,如果系統(tǒng)增加了兩倍的機器,吞吐量也增加了兩倍,那水平擴展比例就是 1,高并發(fā)系統(tǒng)一般會要求水平擴展比例盡可能趨向 1,以確保系統(tǒng)在增加負(fù)載時能夠有效地擴展性能。

資源使用效率

資源使用效率是指系統(tǒng)在擴展過程中能夠充分利用新增資源的能力,高并發(fā)系統(tǒng)應(yīng)該能夠有效地利用新增機器的計算、存儲、網(wǎng)絡(luò)等資源,提高系統(tǒng)的整體性能。

高并發(fā)系統(tǒng)的通用解決方案

在了解了什么是高并發(fā)、高并發(fā)的目標(biāo)以及衡量的指標(biāo)后,我們來一起看看高并發(fā)系統(tǒng)的通用解決方案都有哪些?

在設(shè)計高并發(fā)系統(tǒng)架構(gòu)時,通用的設(shè)計方案通常就是指縱向擴展和橫向擴展兩個維度。

縱向擴展

縱向擴展一般包括兩個方面:

第一,進(jìn)行硬件升級,提升單機的硬件性能。

通過增加單臺服務(wù)器的硬件資源,比如 CPU 核心數(shù)量、內(nèi)存容量、磁盤速度、存儲容量等方式來提升系統(tǒng)的處理能力,這種方式適用于需要快速響應(yīng)的臨時需求,但成本很高且有上限。

第二,進(jìn)行軟件優(yōu)化,提升單機的軟件性能。

通過對系統(tǒng)軟件進(jìn)行優(yōu)化來提高單臺服務(wù)器的性能,比如優(yōu)化算法、減少不必要的計算、提高數(shù)據(jù)庫查詢效率等手段,這種方式不需要額外的硬件投入,但是會對系統(tǒng)的架構(gòu)和代碼進(jìn)行比較大的改動。

橫向擴展

縱向擴展的目標(biāo)和關(guān)注點在單臺機器的維度,但是單臺機器的性能總是存在上限的,所以在對高并發(fā)系統(tǒng)進(jìn)行設(shè)計的時候,還需要重點考慮橫向擴展的方式,來提高高并發(fā)的處理能力。

第一,做好集群部署。

將你的系統(tǒng)部署在多臺服務(wù)器上,通用負(fù)載均衡將用戶請求均勻地分發(fā)到各個服務(wù)器進(jìn)行處理,這種方式可以通過添加新的服務(wù)器或者服務(wù)節(jié)點來提高系統(tǒng)的整體處理能力,適用于負(fù)載均衡比較均勻的場景。

第二,使用分布式微服務(wù)架構(gòu)模式。

將你的系統(tǒng)拆分為多個獨立的服務(wù)或者組件模塊,每個服務(wù)運行在獨立的服務(wù)器上,通過消息隊列或者 RPC 的方式進(jìn)行通信和協(xié)作。這種方式可以提高系統(tǒng)的可擴展性和容錯性,但是也引入了新的挑戰(zhàn),比如服務(wù)之間的依賴關(guān)系、通信成本等。

第三,使用緩存技術(shù)。

使用緩存技術(shù)可以減輕數(shù)據(jù)庫等服務(wù)端資源的壓力,常見的包括內(nèi)存緩存技術(shù)、分布式緩存技術(shù)等,通用把熱點數(shù)據(jù)緩存在內(nèi)存中,可以極大地提高系統(tǒng)的讀取性能和并發(fā)處理能力。

聊完高并發(fā)系統(tǒng)的通用解決方案之后,我們在針對“三高”分別聊聊對應(yīng)的解決方案,這些可都是灸哥的經(jīng)驗干貨,歡迎交流!

高性能的解決方案

在高并發(fā)系統(tǒng),高性能是至關(guān)重要的,它直接影響著系統(tǒng)的響應(yīng)速度和用戶體驗,接下來我們就可以看看根據(jù)我過往的經(jīng)驗總結(jié)了一些關(guān)于高性能的具體解決方案。

集群部署與負(fù)載均衡

將系統(tǒng)部署在多臺服務(wù)器上,通過負(fù)載均衡將請求均勻分發(fā)到各個服務(wù)器節(jié)點上進(jìn)行處理,這樣可以分擔(dān)單臺服務(wù)器的壓力,提高系統(tǒng)的并發(fā)處理能力和整體性能。

數(shù)據(jù)庫優(yōu)化

針對數(shù)據(jù)庫優(yōu)化主要以下方面:第一,將數(shù)據(jù)庫的讀寫操作分離,分配到不同的服務(wù)器上進(jìn)行處理,減輕數(shù)據(jù)庫的讀寫壓力,提高系統(tǒng)的并發(fā)讀能力;第二,對頻繁查詢的字段添加索引,減少查詢時間,合理使用聯(lián)合索引,減少索引冗余和不必要的查詢開銷;第三,優(yōu)化數(shù)據(jù)庫查詢語句,避免全表掃描和多表聯(lián)合查詢,減少數(shù)據(jù)庫的查詢時間和資源消耗。

使用緩存技術(shù)

緩存技術(shù)一般包括:第一,使用內(nèi)存緩存技術(shù)(如 Redis、Memcached)緩存熱點數(shù)據(jù)或計算結(jié)果,減少對數(shù)據(jù)庫的頻繁查詢,提高系統(tǒng)的響應(yīng)速度;第二,使用分布式緩存(如 Redis Cluster、Hazelcast)將緩存數(shù)據(jù)分布在多個節(jié)點上,提高系統(tǒng)的并發(fā)讀取和寫入能力,保證緩存的可用性和一致性。

異步處理

在高并發(fā)系統(tǒng)中,異步處理方案包括:第一,使用消息隊列將耗時的業(yè)務(wù)邏輯或數(shù)據(jù)處理操作放入消息隊列中,由后臺任務(wù)處理器異步執(zhí)行,減少用戶請求的等待時間,提高系統(tǒng)的并發(fā)處理能力和吞吐量;第二,使用延時任務(wù)將一些非實時的任務(wù)延遲處理,如數(shù)據(jù)統(tǒng)計、日志記錄等,降低對系統(tǒng)性能的影響,提高系統(tǒng)的響應(yīng)速度。

多級緩存策略

使用多級緩存策略,包括本地緩存、分布式緩存和靜態(tài)資源 CDN 等,根據(jù)數(shù)據(jù)的訪問頻率和使用場景,將數(shù)據(jù)緩存在不同的緩存層中,提高數(shù)據(jù)的訪問速度和命中率。

優(yōu)化網(wǎng)絡(luò)和 IO 操作

將多個小的網(wǎng)絡(luò)請求合并為一個大的請求,減少網(wǎng)絡(luò)通信的次數(shù),降低網(wǎng)絡(luò)延遲和帶寬消耗。使用異步IO技術(shù)或非阻塞IO技術(shù),減少IO操作的等待時間,提高系統(tǒng)的并發(fā)讀取和寫入能力。

并發(fā)編程和線程池

使用多線程、協(xié)程或事件驅(qū)動等并發(fā)編程模型,充分利用多核處理器和系統(tǒng)資源,提高系統(tǒng)的并發(fā)處理能力。使用線程池來管理和復(fù)用線程資源,避免線程創(chuàng)建和銷毀的開銷,提高系統(tǒng)的并發(fā)處理效率和性能穩(wěn)定性。

JVM 調(diào)優(yōu)

針對Java應(yīng)用程序,進(jìn)行JVM調(diào)優(yōu),包括調(diào)整堆內(nèi)存大小、垃圾回收器的選擇和調(diào)優(yōu)、JVM參數(shù)的優(yōu)化等,以提高Java應(yīng)用程序的性能和穩(wěn)定性。

代碼邏輯優(yōu)化

優(yōu)化系統(tǒng)中頻繁使用的算法和數(shù)據(jù)結(jié)構(gòu),減少不必要的計算和存儲開銷,提高系統(tǒng)的計算效率和資源利用率。以及可以將大概率阻斷執(zhí)行流程的判斷邏輯前置、For 循環(huán)的計算邏輯優(yōu)化等。

水平擴展和分布式架構(gòu)

使用分布式架構(gòu)和微服務(wù)架構(gòu),將系統(tǒng)拆分成多個獨立的服務(wù)或模塊,每個服務(wù)運行在獨立的服務(wù)器上,并通過消息隊列或RPC進(jìn)行通信和協(xié)作。這樣可以提高系統(tǒng)的可擴展性和容錯性,實現(xiàn)分布式處理和并行計算。

限流方案

根據(jù)業(yè)務(wù)場景考慮是否可以限流,包括從前端開始限流、Nginx 接入層限流、服務(wù)端服務(wù)限流等。

預(yù)計算和預(yù)熱

針對一些計算量較大或者訪問頻率較高的數(shù)據(jù),可以提前進(jìn)行計算或者加載到緩存中,減少用戶請求時的計算時間和等待時間。

池化技術(shù)

各種池化技術(shù)的使用以及池大小的優(yōu)化配置,比如 HTTP 請求池、線程池、數(shù)據(jù)庫連接池、Redis 連接池等。

以上這些解決方案均來自于日常實踐經(jīng)驗的總結(jié),在具體的業(yè)務(wù)需求和系統(tǒng)特點中,要根據(jù)實際情況來進(jìn)行調(diào)整和優(yōu)化,多種方案的結(jié)合使用,同時綜合考慮負(fù)載情況、資源利用率、用戶體驗和成本效益等因素,以實現(xiàn)高性能的高并發(fā)系統(tǒng)。

高可用的解決方案

在高并發(fā)系統(tǒng)中,系統(tǒng)的可用性直接影響到用戶體驗和業(yè)務(wù)連續(xù)性。為了確保系統(tǒng)在面對各種意外情況時能夠保持穩(wěn)定運行,需要采取一系列高可用的解決方案。

負(fù)載均衡器

使用負(fù)載均衡器將流量分發(fā)到多臺服務(wù)器上,以實現(xiàn)請求的均衡分布和減輕單點故障的壓力。當(dāng)某臺服務(wù)器發(fā)生故障時,負(fù)載均衡器可以自動將流量重定向到其他可用的服務(wù)器上,保證系統(tǒng)的正常運行。

容災(zāi)備份

部署容災(zāi)備份系統(tǒng),將系統(tǒng)的數(shù)據(jù)和服務(wù)備份到不同的地理位置或者數(shù)據(jù)中心。當(dāng)主要數(shù)據(jù)中心發(fā)生故障時,可以快速切換到備份系統(tǒng),確保系統(tǒng)的持續(xù)可用性。

故障轉(zhuǎn)移和主備切換

在系統(tǒng)中設(shè)置故障檢測機制,及時發(fā)現(xiàn)服務(wù)器或服務(wù)的故障,并實施故障轉(zhuǎn)移和主備切換。例如,可以使用心跳檢測來監(jiān)控服務(wù)器的健康狀態(tài),當(dāng)服務(wù)器宕機或服務(wù)異常時,自動切換到備用服務(wù)器或備用服務(wù)。

服務(wù)治理

使用服務(wù)治理框架來管理系統(tǒng)中的各個服務(wù)實例,包括注冊發(fā)現(xiàn)、健康檢查、負(fù)載均衡、故障恢復(fù)等功能。通過服務(wù)治理框架,可以實現(xiàn)對服務(wù)實例的動態(tài)管理和調(diào)度,確保系統(tǒng)的高可用性和負(fù)載均衡。

接口超時和重試策略

在系統(tǒng)的接口層設(shè)置超時時間和重試策略,對于長時間未響應(yīng)的請求進(jìn)行超時處理,并自動進(jìn)行重試。這樣可以避免因為單個請求的超時或失敗導(dǎo)致系統(tǒng)整體的不可用。

降級和熔斷

當(dāng)系統(tǒng)出現(xiàn)異?;蜇?fù)載過高時,可以通過降級和熔斷來保護(hù)核心服務(wù),犧牲非核心服務(wù)或者關(guān)閉部分功能,以保證系統(tǒng)的正常運行。例如,可以暫時關(guān)閉某些功能模塊或者限制用戶訪問速度,以減輕系統(tǒng)的壓力。

限流和隊列緩沖

對系統(tǒng)的流量進(jìn)行限制和緩沖,防止突發(fā)流量導(dǎo)致系統(tǒng)崩潰或者雪崩。可以通過限流算法和消息隊列來控制請求的處理速度,以穩(wěn)定系統(tǒng)的運行狀態(tài)。

灰度發(fā)布和回滾策略

采用灰度發(fā)布的方式逐步更新系統(tǒng)版本,先在少量用戶或服務(wù)器上進(jìn)行測試,再逐步擴大范圍,以減少系統(tǒng)更新對整體運行的影響。同時,設(shè)置回滾策略,當(dāng)新版本出現(xiàn)問題時,可以快速回滾到上一個穩(wěn)定版本,保證系統(tǒng)的可用性。

監(jiān)控和報警

部署監(jiān)控和報警系統(tǒng),實時監(jiān)測系統(tǒng)的運行狀態(tài)和性能指標(biāo),并設(shè)置預(yù)警規(guī)則和報警機制,及時發(fā)現(xiàn)并處理潛在的故障和問題,保證系統(tǒng)的穩(wěn)定運行。

災(zāi)備演練

類似當(dāng)前的“混沌工程”,對系統(tǒng)進(jìn)行一些破壞性手段,觀察局部故障是否會引起可用性問題。

這些解決方案可以結(jié)合使用,根據(jù)系統(tǒng)的需求和特點進(jìn)行調(diào)整和優(yōu)化,以提高系統(tǒng)的可用性和穩(wěn)定性。在設(shè)計和實現(xiàn)高可用系統(tǒng)時,需要綜合考慮系統(tǒng)的容錯能力、故障恢復(fù)能力、用戶體驗和成本效益等因素,選擇最合適的解決方案。

高擴展的解決方案

在高并發(fā)系統(tǒng)中,要求確保系統(tǒng)在面對不斷增長的用戶請求時,能夠靈活地擴展資源,以滿足需求并保持穩(wěn)定性。

分層架構(gòu)設(shè)計

采用分層架構(gòu)設(shè)計,將系統(tǒng)劃分為多個層次,如前端、應(yīng)用服務(wù)器、緩存層、數(shù)據(jù)庫等,每個層次都可以根據(jù)需要獨立進(jìn)行擴展。這種設(shè)計能夠有效地降低系統(tǒng)的耦合度,提高系統(tǒng)的靈活性和可擴展性。

無狀態(tài)服務(wù)設(shè)計

將系統(tǒng)設(shè)計成無狀態(tài)的服務(wù)架構(gòu),使得每個請求都可以獨立處理,而不依賴于之前的狀態(tài)信息。這樣可以方便地進(jìn)行水平擴展,通過增加服務(wù)器節(jié)點來處理更多的請求,而無需考慮狀態(tài)同步和數(shù)據(jù)一致性的問題。

服務(wù)集群化

將相同類型的服務(wù)部署在一個集群中,并通過負(fù)載均衡器來分發(fā)請求,實現(xiàn)服務(wù)的水平擴展。通過增加集群中的節(jié)點數(shù)量,可以線性地提高系統(tǒng)的處理能力,以應(yīng)對不斷增長的用戶請求。

數(shù)據(jù)庫的分庫分表

對數(shù)據(jù)庫進(jìn)行分庫分表設(shè)計,將數(shù)據(jù)按照一定的規(guī)則分散存儲在多個數(shù)據(jù)庫實例和數(shù)據(jù)表中。這樣可以有效地減少單個數(shù)據(jù)庫的負(fù)載壓力,并提高數(shù)據(jù)的讀寫并發(fā)性能。同時,可以通過數(shù)據(jù)庫分片技術(shù)實現(xiàn)數(shù)據(jù)的水平擴展,以支持更大規(guī)模的數(shù)據(jù)存儲和處理需求。

緩存技術(shù)應(yīng)用

使用緩存技術(shù)來減輕數(shù)據(jù)庫的壓力,提高系統(tǒng)的讀取性能和響應(yīng)速度??梢詫衢T數(shù)據(jù)和頻繁訪問的數(shù)據(jù)緩存到內(nèi)存中,減少數(shù)據(jù)庫的訪問次數(shù)。同時,采用分布式緩存技術(shù),將緩存數(shù)據(jù)分布存儲在多個節(jié)點上,以提高緩存的容量和可擴展性。

消息隊列應(yīng)用

引入消息隊列系統(tǒng)來實現(xiàn)異步處理和削峰填谷,將請求和任務(wù)進(jìn)行解耦,并通過消息隊列進(jìn)行緩沖和調(diào)度。這樣可以有效地平滑系統(tǒng)的負(fù)載波動,提高系統(tǒng)的穩(wěn)定性和可擴展性。

高并發(fā)系統(tǒng)的設(shè)計方案雖然有通用的解決方案,以及文中針對高性能、高可用、高擴展的對應(yīng)解決方案,這些在你涉及高并發(fā)系統(tǒng)時,總體的設(shè)計思路和可借鑒的解決方案基本都是類似的。但是對應(yīng)到你具體的業(yè)務(wù)場景中,落地方案是肯定會存在差異的。作為架構(gòu)師的你,要千萬記住架構(gòu)設(shè)計的三原則:簡單、合適和演進(jìn)。這里對三原則就不做過多介紹了,有興趣的可以翻看我之前的架構(gòu)系統(tǒng)文章。

高并發(fā)編程的核心理念主要包括以下幾個方面:

1、分布式:將系統(tǒng)拆分成多個獨立的部分,每個部分可以獨立處理請求,從而提高整個系統(tǒng)的并發(fā)能力。

2、異步編程:通過異步編程可以讓線程不必等待某些操作的結(jié)果就可以繼續(xù)執(zhí)行,從而提高并發(fā)能力。

3、非阻塞編程:非阻塞編程可以讓線程不必等待某些操作的結(jié)果,而是繼續(xù)執(zhí)行其他任務(wù),從而提高系統(tǒng)的響應(yīng)速度和吞吐量。

4、緩存優(yōu)化:通過緩存可以減少對后端系統(tǒng)的訪問,從而降低系統(tǒng)的負(fù)載,提高系統(tǒng)的并發(fā)能力。

5、負(fù)載均衡:通過負(fù)載均衡可以將請求分發(fā)到多個處理節(jié)點上,從而提高整個系統(tǒng)的并發(fā)能力。

6、無狀態(tài)服務(wù):無狀態(tài)服務(wù)可以減少服務(wù)器對客戶端的狀態(tài)管理,從而提高系統(tǒng)的并發(fā)能力。

7、消息隊列:通過消息隊列可以將任務(wù)異步處理,從而提高系統(tǒng)的并發(fā)能力。

隨著當(dāng)今技術(shù)的不斷發(fā)展和業(yè)務(wù)的不斷變化,我們還要持續(xù)不斷地學(xué)習(xí)和探索,不斷優(yōu)化和完善高并發(fā)系統(tǒng)架構(gòu)設(shè)計,以適應(yīng)不斷變化的需求和挑戰(zhàn),實現(xiàn)高并發(fā)系統(tǒng)的持續(xù)穩(wěn)定運行和持續(xù)發(fā)展。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉