成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高并發(fā)是一種架構(gòu)思維模式

開(kāi)發(fā) 架構(gòu) 新聞
本文從淺到深依次講述了性能是實(shí)現(xiàn)高并發(fā)的基礎(chǔ)條件,控制是實(shí)現(xiàn)資源最大化利用的方式,以及如何通過(guò)取舍來(lái)?yè)Q取當(dāng)前應(yīng)用系統(tǒng)更所需的能力,但這些僅僅只是高并發(fā)世界里的一個(gè)角落。

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

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

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

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

性能是一種基礎(chǔ)

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

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

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

每秒處理事務(wù)數(shù)(TPS)

每秒能夠處理的事務(wù)數(shù),其中T(Transactions)可以定義不同的含義,它可以是完整的一筆業(yè)務(wù),也可以是單個(gè)的接口請(qǐng)求。

每秒請(qǐng)求數(shù)(RPS)

每秒請(qǐng)求數(shù)量,也可以叫做QPS,但它與TPS有所不同,前者注重請(qǐng)求能力,后者注重處理能力。不過(guò),若所有請(qǐng)求都在得到響應(yīng)后再次發(fā)起,那么RPS基本等于TPS。

響應(yīng)時(shí)長(zhǎng)(RT)

從發(fā)出請(qǐng)求到得到響應(yīng)的耗時(shí),一般可以采用毫秒單位來(lái)表示,而在一些對(duì)RT比較敏感的業(yè)務(wù)場(chǎng)景下,可以使用精度更高的微秒來(lái)表示。

并發(fā)用戶數(shù)(VU)

同時(shí)請(qǐng)求的用戶數(shù),很多人將它與并發(fā)數(shù)畫(huà)上等號(hào), 但兩者稍有不同,前者關(guān)注客戶端,后者關(guān)注服務(wù)端,除非 每個(gè) 用戶僅發(fā)送一筆請(qǐng)求,且請(qǐng)求從 客戶端到服務(wù)端 沒(méi)有延遲,同時(shí)服務(wù)端有足夠的處 理線程。

以上都是些常用的性能指標(biāo),基本可以覆蓋80%以上的性能衡量要求。但千萬(wàn)不要以單個(gè)指標(biāo)的高低來(lái)衡量性能。比如:訂單查詢TPS=100萬(wàn)就認(rèn)為性能很高,但RT=10秒。

這顯然毫無(wú)意義。因此, 建議同時(shí)觀察多個(gè)指標(biāo)的方式來(lái)衡量性能的高低,大多數(shù)情況下主要會(huì)關(guān)注TPS和RT,而你可以 將TPS視為一種水平能力,注重并行處理能力, 將RT視為一種垂直能力,注重單筆處理能力, 兩者缺一不可 

接觸過(guò)性能測(cè)試的同學(xué),可能會(huì)見(jiàn)過(guò)如下這種性能測(cè)試結(jié)果圖,圖中包含了剛才提到過(guò)的三個(gè)性能指標(biāo),其中橫坐標(biāo)為VU,縱坐標(biāo)分別為TPS和RT。

注:表格中的數(shù)據(jù)都是理想情況下的,實(shí)際上會(huì)有上下抖動(dòng),而這里只是為了想用它來(lái)解釋一種現(xiàn)象而已。

圖中的兩條曲線, 在不斷增加VU的情況下,TPS不斷上升,但RT保持穩(wěn)定,但當(dāng)VU增加到一定量級(jí)的時(shí)候,TPS開(kāi)始趨于穩(wěn)定,而RT不斷上升。

如果你仔細(xì)觀察,還會(huì)發(fā)現(xiàn)一個(gè)奇妙的地方,當(dāng)RT=25ms時(shí),它們?nèi)叽嬖谥撤N關(guān)系,即:TPS=VU/RT。但當(dāng)RT>25ms時(shí),這種關(guān)系似乎被打破了,這里暫時(shí)先賣個(gè)關(guān)子,稍后再說(shuō)。

根據(jù)表格中的數(shù)據(jù),性能測(cè)試報(bào)告結(jié)論: 最大TPS=65000,當(dāng) RT=25ms(最短)時(shí),最大可承受VU=1500 

感覺(jué)有點(diǎn)不對(duì)勁,用剛才的公式來(lái)驗(yàn)證一下,1500/0.025s=60000,但最大卻是TPS=65000。那是因?yàn)椋?dāng)VU=1500時(shí),應(yīng)用系統(tǒng)的使用資源還有空間。

再來(lái)觀察一下表格中的數(shù)據(jù),VU從1500增加到1750時(shí),TPS繼續(xù)上升,且到了最大值65000。此時(shí),你是不是會(huì)理解為當(dāng)VU增加到1750時(shí),使用資源被耗盡了。話雖沒(méi)錯(cuò),但不嚴(yán)謹(jǐn)。

注:使用資源不一定是指硬件資源,也可能是其他方面,例如:應(yīng)用系統(tǒng)設(shè)置的最大處理線程。

其實(shí)在VU增加到1750前,使用資源就已飽和,那如何來(lái)測(cè)算VU的臨界值呢。你可以將最大TPS作為已知條件,即:VU=TPS*RT,65000*0.025s=1625。也就是說(shuō),當(dāng)VU=1625時(shí),使用資源將出現(xiàn)瓶頸。

調(diào)整性能測(cè)試報(bào)告 結(jié)論: 最大TPS=65000, 當(dāng)RT=25ms(最短)時(shí) ,最大可承受VU=1625 

有人會(huì)問(wèn),表格中的RT是不是平均值,首先回答為是。不過(guò), 高并發(fā)場(chǎng)景對(duì)RT會(huì)特別敏感,所以除了要考慮RT的平均值外,建議還要考慮它的分位值 ,例如:P99。

舉例:假設(shè)1000筆請(qǐng)求,其中900筆RT=23ms,50筆RT=36ms,50筆RT=50ms

平均值

P99值

P95值

P90值

25ms

50ms

36ms

23ms

P99的計(jì)算方式,是將1000筆請(qǐng)求的RT從小到大進(jìn)行排序,然后取排在第99%位的數(shù)值,基于以上舉例數(shù)據(jù)來(lái)進(jìn)行計(jì)算,P99=50ms,其他分位值的計(jì)算方式類似。

再次調(diào)整性能測(cè)試報(bào)告結(jié)論: 最大TPS=65000,當(dāng) RT(平均)=25ms(最短)時(shí),最大可承受VU=1625,RT(P99)=50ms,RT(P95)=36ms,RT(P90)=23ms 

在非功能性需求中,你可能會(huì)看到這樣的需求,性能指標(biāo)要求: RT(平均) <=30。結(jié)合剛才的性能測(cè)試報(bào)告結(jié)論, 當(dāng) RT(平均)=25ms(最短)時(shí),最大可承受VU=1625。那就等于在RT上還有5ms的容忍時(shí)間。

既然是這樣的話,那我們不妨就繼續(xù)嘗試增加VU,不過(guò)RT (平均) 會(huì)出現(xiàn)上升,但只要控制不要上升到30ms即可, 這是一種通過(guò)犧牲耗時(shí)(RT)來(lái)?yè)Q取并發(fā)用戶數(shù)(VU)的行為 。但請(qǐng)不要把它理解為每筆請(qǐng)求耗時(shí)都會(huì)上升5ms,這將是一個(gè)嚴(yán)重的誤區(qū)。

RT(平均) 的增加,完全可能  由于應(yīng)用系統(tǒng) 當(dāng)前 沒(méi)有足夠的使用資源來(lái)處理請(qǐng)求所造成的,例如:處理線程。如果沒(méi)有可用線程可以分配給請(qǐng)求時(shí),就會(huì)將這請(qǐng)求先放入隊(duì)列,等前面的請(qǐng)求處理完成并釋放線程后,就可以繼續(xù)處理隊(duì)列中的請(qǐng)求了。

那也就是說(shuō),沒(méi)有進(jìn)入隊(duì)列的請(qǐng)求并不會(huì)增加額外的耗時(shí),而只有進(jìn)入隊(duì)列的請(qǐng)求會(huì)增加。那么 進(jìn)入隊(duì)列的請(qǐng)求會(huì) 增加多少耗時(shí)呢, 在理想情況下(RT恒定), 可能會(huì) 是正常處理一筆請(qǐng)求耗時(shí)的倍數(shù),而倍數(shù)的大小又取決于并發(fā)請(qǐng)求的數(shù)量。

假設(shè) 最大處理 線程=1625,若每個(gè)用戶僅發(fā)送一筆請(qǐng)求,且請(qǐng)求從 客戶端到服務(wù)端沒(méi)有延遲的條件下, 當(dāng)并發(fā)用戶數(shù)=1625時(shí),能夠保證 RT=25ms,但當(dāng) 并發(fā)用戶數(shù) >1625時(shí),因?yàn)榫€程只能分配給1625筆請(qǐng)求,那多余的請(qǐng)求就無(wú)法保證RT=25ms。

超過(guò)1625筆的請(qǐng)求會(huì)先放入隊(duì)列,等前面1625筆請(qǐng)求處理完成后,再?gòu)年?duì)列中拿出最多1625筆請(qǐng)求進(jìn)行下一批處理,如果隊(duì)列中還有剩余請(qǐng)求,那就繼續(xù)按照這種方式循環(huán)處理。

進(jìn)入隊(duì)列的請(qǐng)求,每等待一批就需要增加前一批的處理耗時(shí)。在理想情況下,每一批都是 RT=25ms,如果這筆請(qǐng)求在隊(duì)列中等待了兩批,那就要額外增加50ms的耗時(shí)。

VU

第一批

第二批

第三批

1000

1000筆請(qǐng)求

RT=25ms

2000

1625筆請(qǐng)求

RT =25ms

375筆請(qǐng)求

RT =50ms

4000

1625筆請(qǐng)求

RT =25ms

1625 筆請(qǐng)求

RT =50ms

750筆請(qǐng)求

RT =75ms

因此,并不能簡(jiǎn)單通過(guò)VU=TPS*RT= 65000*0.03=1950 來(lái)計(jì)算最大可承受VU。而是需要 引入一種叫做 科特爾法則(Little’s Law) 的排隊(duì)模型來(lái)估算,不過(guò)由于這個(gè)法則比較復(fù)雜,這里暫時(shí)不做展開(kāi)。

通過(guò)粗略估算后,VU大約在2032,我們?cè)賹?duì)這個(gè)值用上述表格中再反向驗(yàn)算一下。

VU

第一批

第二批

RT (平均)

2032

1625筆請(qǐng)求

RT =25ms

407筆請(qǐng)求

RT =50ms

(1625*25+407*50)/(1625+407 )≈30ms

最終 調(diào)整性能測(cè)試報(bào)告結(jié)論: 最大TPS=65000,當(dāng)RT(平均)=25(最短)時(shí),最大可承受VU=1625,RT(P99)=50,RT(P95)=36,RT(P90)=23;當(dāng)RT(平均)=30(容忍)時(shí),(理想情況)最大可承受VU=2032  RT(P99)=RT(P95)=50,RT(P90)=25 

這就解釋了為什么當(dāng)RT>25ms時(shí),VU=TPS*RT會(huì)不成立的原因。 不過(guò),這些都是在理想情況下推演出來(lái)的,實(shí)際情況會(huì)比這要復(fù)雜得多。

所以,還是盡量采用多輪性能測(cè)試來(lái)得到性能指標(biāo),這樣也更具備真 實(shí)性。畢竟 影響性能的因素實(shí)在大多且很難完全掌控,任何細(xì)微變化都將影響 性能指標(biāo)的變化。

到這里,我們已經(jīng)了解了可以用哪些 指標(biāo) 來(lái)衡量性能的高低。不過(guò),這里更想強(qiáng)調(diào)的是, 性能是高并發(fā)的基礎(chǔ)能力,是實(shí)現(xiàn)高并發(fā)的基礎(chǔ)條件,并且你需要有側(cè)重性地提升不同維度的性能指標(biāo),而非僅關(guān)注某一項(xiàng) 

限制是一種設(shè)計(jì)

上文說(shuō)到,性能是高并發(fā)的目標(biāo)之一。 追求性能沒(méi)有錯(cuò),但并非永無(wú)止境 。想要提升 性能,勢(shì)必投入成本,不過(guò)它們并不是一直成正比,而是隨著成本不斷增加,性能提升幅度逐漸衰減,甚至可能不再提升。所以,有時(shí)間我們要懂得適可而止。

思考一下,追求性能是為了解決什么問(wèn)題,至少有一點(diǎn),是為了讓應(yīng)用系統(tǒng)能夠應(yīng)對(duì)突發(fā)請(qǐng)求。換言之,如果能解決這個(gè)問(wèn)題,是不是也算實(shí)現(xiàn)了高并發(fā)的目標(biāo)。

而有時(shí)候,我們 在解決問(wèn)題時(shí),不要總是習(xí)慣做加法,還可以嘗試做減法 ,架構(gòu)設(shè)計(jì)同樣如此。那么,如何通過(guò)做減法的方式,來(lái)解決應(yīng)對(duì)突發(fā)請(qǐng)求的問(wèn)題呢。讓我們來(lái)講講限制。

限制,從狹義上可以理解為是一種約束或控制能力 。在軟件領(lǐng)域中,它可以針對(duì)功能性或非功能性,而在高并發(fā)的場(chǎng)景中,它更偏向于非功能性。

限制應(yīng)用系統(tǒng)的處理能力,并不代表要降低應(yīng)用系統(tǒng)的處理能力 ,而是通過(guò)某些控制手段, 讓突發(fā)請(qǐng)求能夠被平滑地處理,同時(shí)起到 應(yīng)用系統(tǒng)的保護(hù)能力, 避免癱瘓, 還能 將應(yīng)用系統(tǒng)的資源進(jìn)行合理分配,避免浪費(fèi) 

那么,到底有哪些控制手段,既能實(shí)現(xiàn)以上這些能力, 又能減少對(duì)客戶體驗(yàn)上的影響,下面就來(lái)介紹幾種常用的控制手段 

第一招:限流

限流,是在一個(gè)時(shí)間窗口內(nèi),對(duì)請(qǐng)求進(jìn)行速率控制 。若請(qǐng)求達(dá)到提前設(shè)定的閾值 時(shí) ,則對(duì)請(qǐng)求進(jìn)行排隊(duì)或拒絕。常用的限流算法有兩種:漏桶算法和令牌桶算法。

漏桶算法,所有請(qǐng)求先進(jìn)入漏桶,然后按照一個(gè)恒定的速率對(duì)漏桶里的請(qǐng)求進(jìn)行處理,是一種控制處理速率的限流方式,用于平滑突發(fā)請(qǐng)求速率。

它的優(yōu)點(diǎn)是,能夠確保資源不會(huì)瞬間耗盡,避免請(qǐng)求處理發(fā)生阻塞現(xiàn)象,另外,還能夠保護(hù)被應(yīng)用系統(tǒng)所調(diào)用的外部服務(wù),也免受突發(fā)請(qǐng)求的沖擊。

它的缺點(diǎn)是,對(duì)于突發(fā)請(qǐng)求仍然會(huì)以一個(gè)恒定的速率來(lái)進(jìn)行處理,其靈活性會(huì)較弱一點(diǎn),容易發(fā)生突發(fā)請(qǐng)求超過(guò)漏桶的容量,導(dǎo)致后續(xù)請(qǐng)求直接被丟棄。

令牌桶算法,應(yīng)用系統(tǒng)會(huì)以一個(gè)恒定的速率往桶里放入令牌,請(qǐng)求處理前,會(huì)從桶里獲取令牌,當(dāng)桶里沒(méi)有令牌可取時(shí),則拒絕服務(wù),是一種平均流入速率的限流方式。

它的優(yōu)點(diǎn)是,在限制平均流入速率的同時(shí),還能在面對(duì)突發(fā)請(qǐng)求的情況下,確保資源被充分利用,不會(huì)被閑置或浪費(fèi)。

它的缺點(diǎn)是,舍棄了處理速率的強(qiáng)控制能力,那么如果某些功能依賴外部服務(wù),可能將會(huì)讓外部服務(wù)無(wú)法承受壓力,導(dǎo)致無(wú)法正常返回,而且還浪費(fèi)了這次獲取的令牌。

綜上, 兩種算法并沒(méi)有絕對(duì)的好壞,而是需要根據(jù)實(shí)際的情況,選擇合適的方式,從而在發(fā)揮限流作用的同時(shí)不會(huì)引發(fā)其他問(wèn)題  但在一些秒殺活動(dòng)中,軟件黨的高頻請(qǐng)求,會(huì)很容易觸發(fā)限流,導(dǎo)致大量正常請(qǐng)求被誤殺的問(wèn)題。

雖然在請(qǐng)求被限流后,會(huì)返回友好話術(shù),減輕對(duì)客戶體驗(yàn)的影響,但也有可能他們的請(qǐng)求,會(huì)一直無(wú)法得到有效處理,這時(shí)候耐心再好的客戶也會(huì)離開(kāi)及抱怨。

所以,我們 除了使用限流這招外,還得搭配其他的招數(shù)組合一起使用,從而讓 應(yīng)用系統(tǒng)能夠?qū)Y源進(jìn)行合理分配,避免資源浪費(fèi),減少正常請(qǐng)求被誤殺的情況。

第二招:降頻

降頻,是在一個(gè)時(shí)間窗口內(nèi),對(duì)同一特征的請(qǐng)求進(jìn)行速率控制  若請(qǐng)求達(dá)到提前設(shè)定的閾值時(shí),則會(huì)對(duì)請(qǐng)求進(jìn)行拒絕。

雖然和限流 有點(diǎn)類似,但存在著細(xì)微的差別。對(duì)限流而言,它并不關(guān)心請(qǐng)求方,而只對(duì)服務(wù)端的速率進(jìn)行控制,而對(duì)降頻而言,它會(huì)基于某種特征,對(duì)請(qǐng)求方的請(qǐng)求速率進(jìn)行控制。

而降頻的目的,是為了減少 應(yīng)用系統(tǒng)資源被不正常的請(qǐng)求所消耗,而導(dǎo)致正常的請(qǐng)求因限流被拒絕的情況發(fā)生 。它的實(shí)現(xiàn)方式也有多種,而且在前端和后端都可以使用。

識(shí)別不正常的請(qǐng)求是降頻的第一步,也是最關(guān)鍵的一步。一般會(huì)制定某種特征+某段時(shí)間+請(qǐng)求數(shù)量這種三段式的識(shí)別規(guī)則。

特征可以是賬號(hào)、會(huì)話、IP地址、設(shè)備號(hào)等,時(shí)間一般會(huì)是1秒,也可以設(shè)置更長(zhǎng)。賬號(hào)+1秒+5筆,意思就是同一個(gè)賬號(hào)在1秒內(nèi)可以發(fā)生5筆請(qǐng)求,但是這里請(qǐng)求數(shù)量與限流的設(shè)定參考依據(jù)不同。

限流大小主要依據(jù)性能來(lái)決定,而降頻中的請(qǐng)求數(shù)量,一般會(huì)以正常人的交互速率作為參考 。所以,并不能因?yàn)樾阅芎茫驮O(shè)定賬號(hào)+1秒+100筆這種識(shí)別規(guī)則,這不但不科學(xué)還會(huì)浪費(fèi)資源。

接下來(lái),有了識(shí)別規(guī)則還得搭配對(duì)應(yīng)的處置手段,常見(jiàn)的有兩種模式:挑戰(zhàn)和拒絕。

挑戰(zhàn)

彈出驗(yàn)證碼,輸入并驗(yàn)證通過(guò)后,可以繼續(xù)請(qǐng)求

僅適用于前端

拒絕

彈出“請(qǐng)求頻繁”提示,且這筆請(qǐng)求將直接被拒絕

適用于前端及后端

限流會(huì)發(fā)生誤殺,難道降頻就不會(huì)嗎,其實(shí)也會(huì)發(fā)生,特別是用戶的網(wǎng)絡(luò)環(huán)境是一個(gè)出口IP地址時(shí)。所以,如果是基于IP地址特征的識(shí)別規(guī)則,請(qǐng)求數(shù)量建議適當(dāng)放大。

在降頻策略方面,建議配置多層+漸進(jìn)式的方式  識(shí)別規(guī)則較為嚴(yán)格的 采用挑戰(zhàn)模式, 識(shí)別規(guī)則較為寬松的 采用拒絕模式,減少因 降頻而引發(fā)的誤殺情況,參考如下:

優(yōu)先級(jí)

識(shí)別規(guī)則

處置手段

1

賬號(hào)+1秒+5筆

挑戰(zhàn)

2

賬號(hào)+1秒+10筆

拒絕

3

IP地址+1秒+20筆

挑戰(zhàn)

4

IP地址+1秒+40筆

拒絕

降頻確實(shí)可以使應(yīng)用系統(tǒng)的資源,被合理地分配給請(qǐng)求方,但并不能保證萬(wàn)無(wú)一失,特別對(duì)于那些技術(shù)高超的軟件黨們,他們?nèi)匀豢梢酝ㄟ^(guò)其他方式繞開(kāi)這種控制手段。

不過(guò), 你可以將此視為一種攻防戰(zhàn),通過(guò)增強(qiáng)防守的方式,來(lái)提高攻擊者成本 ,而攻擊者一定會(huì)權(quán)衡成本和收益,當(dāng)成本大于收益時(shí),可能就不會(huì)有攻擊,畢竟沒(méi)有人會(huì)這么無(wú)聊透頂 

雖然有了限流和降頻這兩招,但仍可能無(wú)法應(yīng)對(duì)高并發(fā)的場(chǎng)景,況且在初期,限 流和 降頻的策略,也 無(wú)法 設(shè)計(jì)  非常完美。所以,有些時(shí)候還得使出最后一招。

第三招:降級(jí)

降級(jí),是當(dāng)應(yīng)用系統(tǒng)處理超載時(shí),對(duì)其服務(wù)進(jìn)行裁剪的一種機(jī)制 。常見(jiàn)的是應(yīng)用系統(tǒng) 處理阻塞時(shí),會(huì)關(guān)閉 非核心服務(wù),并將資源給到核心服務(wù),從而確保核心服務(wù)正常。?

經(jīng)常有人將它與熔斷混為一談,但并非一回事 。降級(jí)主要是針對(duì)應(yīng)用系統(tǒng)本身,若處理能力不足則可觸發(fā),而熔斷主要是針對(duì)應(yīng)用系統(tǒng)所調(diào)用的外部服務(wù),若外部服務(wù)不穩(wěn)定時(shí)則可觸發(fā)。

當(dāng)然,兩者也有一定的關(guān)系,因?yàn)楫?dāng)發(fā)生熔斷時(shí),也可以觸發(fā)降級(jí)機(jī)制,比如當(dāng)同步調(diào)用外部服務(wù)出現(xiàn)性能問(wèn)題時(shí),可以降級(jí)為異步調(diào)用,避免造成線程阻塞而癱瘓 

不過(guò)在降級(jí)前,必須得先梳理應(yīng)用系統(tǒng)中的核心服務(wù),可以采用經(jīng)典的二八原則,將服務(wù)劃分為 20%核心服務(wù)+ 80%非核心服務(wù)。  這種分法的意圖,是希望讓你找到真正重要的核心服務(wù),不然,你會(huì)覺(jué)得都很重要 

在梳理過(guò)程中,建議通過(guò)多個(gè)維度來(lái)進(jìn)行綜合評(píng)判,如下是我經(jīng)常采用的一種梳理方法,你可以將此作為一種參考,并結(jié)合自己的服務(wù)分類標(biāo)準(zhǔn)進(jìn)行調(diào)整。

首先,可以設(shè)計(jì)一張類似如下的矩陣圖,請(qǐng)盡量地簡(jiǎn)約它,將應(yīng)用系統(tǒng)中的各類服務(wù),按照矩陣所設(shè)定的不同屬性進(jìn)行分門別類。

操作類

查詢類

業(yè)務(wù)類

訂單下單訂單支付

訂單退貨...


商品查詢訂單查詢退貨進(jìn)度...

基礎(chǔ)類

用戶登錄用戶登出密碼修改頭像修改

...

用戶查詢歷史瀏覽我的收藏我的分享...


然后,將業(yè)務(wù)類+操作 類的挑選出來(lái)作為 核心服務(wù) ,你會(huì)不會(huì)認(rèn)為這就結(jié)束了。不好意思,游戲才剛剛開(kāi)始。不過(guò)你可以試想一下,假設(shè) 僅保留這些核心服務(wù),會(huì)出現(xiàn)什么問(wèn)題。

用戶登錄不了無(wú)法訂單支付,訂單查詢不了無(wú)法訂單退貨。所以, 我們還需引入服務(wù)關(guān)鍵路徑的概念,可以理解為在使用某個(gè)服務(wù)前,還必須要使用的其他服務(wù) 

分別對(duì)挑選出來(lái)的核心服務(wù),進(jìn)行服務(wù)關(guān)鍵路徑的 梳理。

路徑1 :用戶登錄——>商品查詢 —— > 訂單下單

路徑2: 用戶登錄—— > 商品查詢 —— > 訂單下單—— > 訂單支付

路徑3:用戶登錄—— >   查詢—— > 訂單退貨

待服務(wù)關(guān)鍵路徑梳理完成后,再對(duì)路徑上的所有服務(wù)進(jìn)行合并及去重,將會(huì)得到一組新的核心服務(wù):用戶登錄/商品查詢/訂單下單/訂單支付/訂單查詢/訂單退貨。

來(lái)計(jì)算下核心服務(wù)的占比,所有服務(wù)14個(gè)/核心服務(wù)6個(gè),占42.86%,遠(yuǎn)遠(yuǎn)超過(guò)了20%。所以,建議繼續(xù)從這些核心服務(wù)中,識(shí)別更核心的部分,但仍然以服務(wù)關(guān)鍵路徑為整體。

相比訂單下單/訂單支付/訂單退貨這三條服務(wù)關(guān)鍵路徑,我想訂單支付可能會(huì)更有價(jià)值。最后,我們可以僅將訂單支付這條服務(wù)關(guān)鍵路徑上的服務(wù)作為核心服務(wù)。

重新再來(lái)計(jì)算下核心服務(wù)的占比, 所有服務(wù)14個(gè)/核心服務(wù)4個(gè),占28.57%, 雖然還是超過(guò)了20%,但這并不是重點(diǎn),重點(diǎn)是我們已經(jīng)找到了最核心的服務(wù) 

其余的核心服務(wù),可以降級(jí)為準(zhǔn)核心服務(wù),重組后得到如下這份服務(wù)重要程度清單。

核心服務(wù)

準(zhǔn)核心服務(wù)

非核心服務(wù)

用戶登錄

商品查詢

訂單下單

訂單支付




訂單查詢

訂單退貨


退貨進(jìn)度

用戶登出

密碼修改

頭像修改

用戶查詢

歷史瀏覽

我的收藏

我的分享

當(dāng)擁有這份清單后,若 應(yīng)用系統(tǒng)處理阻塞時(shí) ,就 可以按照非核心服務(wù)>準(zhǔn) 核心服務(wù)> 核心服務(wù)這個(gè)順序依次進(jìn)行降級(jí) 。不過(guò), 降級(jí) 不一定要拒絕請(qǐng)求,也可以是限流請(qǐng)求,這樣可以減少對(duì)服務(wù)能力的裁剪力度 

以上只是一種相對(duì)較粗的降級(jí)策略, 如果你想要制定更精細(xì)化的降級(jí)策略,還需要 對(duì) 每個(gè)服務(wù)進(jìn)行優(yōu)先級(jí)的設(shè)定 ,高低依據(jù)可以結(jié)合自身需要來(lái)制定,例如: 歷史 服務(wù)使用情況。

當(dāng)有了限流、降頻、降級(jí)這三招,基本就能夠在資源有限的情況下,讓突發(fā)請(qǐng)求能夠被平滑地處理,將應(yīng)用系統(tǒng)的資源能夠被合理地分配,以及當(dāng)應(yīng)用系統(tǒng)處理堵塞時(shí), 確保核心服務(wù)正常。

取舍是一種權(quán)衡

現(xiàn)在,我們已經(jīng)基本了解了如何衡量性能的指標(biāo),以及大致掌握了如何保護(hù)應(yīng)用系統(tǒng)的招數(shù)。但這些就是高并發(fā)全部了嗎,我想說(shuō)這僅僅只是入門級(jí)別。

上述內(nèi)容,主要是為了讓你能夠清晰地看到應(yīng)用系統(tǒng)的性能水位在哪里,以及在資源有限下,當(dāng)面對(duì)突發(fā)請(qǐng)求時(shí)可以采取哪些招數(shù),能讓應(yīng)用系統(tǒng)安全地存活下來(lái)。

存活,即代表著可用性,它也是高并發(fā)的一個(gè)特性,而且是我認(rèn)為相對(duì)比較重要的特性 。設(shè)想一下,如果你的應(yīng)用系統(tǒng)連可用性都無(wú)法保證,那再高的性能又有何意義。

對(duì)于大部分應(yīng)用系統(tǒng)而言,大家都會(huì)比較關(guān)注應(yīng)用系統(tǒng)的可用性,99.9%不夠那就99.99%,甚至還有想做到99.999%的,畢竟可用性的不足會(huì)直接影響到業(yè)務(wù)運(yùn)作。

但對(duì)于 一個(gè)想成為高并發(fā)的應(yīng)用系統(tǒng)而言,僅單方面關(guān)注高可用,肯定無(wú)法稱得上這個(gè)頭銜 ,它仍然還需要在其他特性上具備極佳的表現(xiàn)。

讓我們拉回到最初的目標(biāo),性能是高并發(fā)的目標(biāo)之一, 不過(guò),這里我們不再談?wù)撔阅苤笜?biāo),而是來(lái)研究如何來(lái)提升性能。 因?yàn)椋咝阅苁歉卟l(fā)的另外一個(gè)重要特性。

想要提升性能,勢(shì)必投入成本。隨著成本不斷增加,性能提升幅度逐漸衰減。這兩句話,是不是覺(jué)得有點(diǎn)耳熟,但不管你是否還記得,先讓我在這里打個(gè)問(wèn)號(hào)再說(shuō)。

在架構(gòu)設(shè)計(jì)的過(guò)程中,你是否經(jīng)常會(huì)聽(tīng)到“取舍”的這個(gè)詞,它是 通過(guò)犧牲一種能力來(lái)?yè)Q取另外一種能力的方式 ,這些能力可以是性能、可用性、數(shù)據(jù)一致性或是其他能力。

等等,你是不是突然有意識(shí)到,提升性能并不只有投入成本這種方式,至少是在硬件資源方面,我們還可以通過(guò)犧牲一種能力去換取。 那到底選擇犧牲哪種能力呢,犧牲可用性,一般不會(huì)第一時(shí)間考慮,那是不是可以考慮犧牲數(shù)據(jù)一致性。

但在考慮前得先聲明一下, 所謂犧牲數(shù)據(jù)一致性,并不是完全不要,而是將數(shù)據(jù)強(qiáng)一致性降級(jí)為最終一致性  而對(duì)于數(shù)據(jù)最終一致性的理解,就是在數(shù)據(jù)更新后,要過(guò)一段時(shí)間后才能看到,而時(shí)間的長(zhǎng)短就代表著犧牲了多少。

但并不是說(shuō),所有情況都必須犧牲數(shù)據(jù)一致性來(lái)提升性能,有些時(shí)候也可以考慮犧牲其他能力。但在取舍前,得先弄清楚當(dāng)前要什么,但更需要弄清楚當(dāng)前可以失去什么, 不合理的取舍,不但無(wú)法換取收益,反而還會(huì)引來(lái)更多的問(wèn)題 

情況1:數(shù)據(jù)緩存

緩存,是高并發(fā)架構(gòu)設(shè)計(jì)中一種不可或缺的能力 ,一般是指那些經(jīng)常被訪問(wèn)的熱點(diǎn)數(shù)據(jù),可以將它放入緩存中,從而提升數(shù)據(jù)被讀取的效率。

但是否所有的數(shù)據(jù)都適合放入緩存中,如果是靜態(tài)數(shù)據(jù),那么你可以很安心地放入。原因很簡(jiǎn)單,靜態(tài)數(shù)據(jù)不會(huì)更新,那么緩存和數(shù)據(jù)源始終保持一致,而且就算緩存中的數(shù)據(jù)丟失了,至少還有一份在數(shù)據(jù)源。

通過(guò)將靜態(tài)數(shù)據(jù)緩存,可以很輕易地提升靜態(tài)數(shù)據(jù)的訪問(wèn)性能,甚至可能是幾十倍的效果。但應(yīng)用系統(tǒng)中還有大量的動(dòng)態(tài)數(shù)據(jù),僅提升靜態(tài)數(shù)據(jù)可能對(duì)總體的提升并不一定顯著。

你是不是想說(shuō),那就把動(dòng)態(tài)數(shù)據(jù)也放入緩存中不就行了。在下這個(gè)決定前,建議你先想一下,動(dòng)態(tài)數(shù)據(jù)是會(huì)更新的, 這就意味著動(dòng)態(tài)數(shù)據(jù)在放入緩存后,當(dāng)數(shù)據(jù)源中的數(shù)據(jù)被更新后,再次訪問(wèn)返回的都是更新前的數(shù)據(jù),這種效果你是否可以接受。

我想應(yīng)該沒(méi)有人會(huì)接受吧,而你是不是又想說(shuō),設(shè)置下緩存會(huì)過(guò)期不就能解決了。沒(méi)錯(cuò),但得等過(guò)期后才能解決,那還沒(méi)過(guò)期前呢,這種方式只能緩解,但并不能根治,而且還會(huì)引入一個(gè)新的問(wèn)題,請(qǐng)問(wèn)過(guò)期設(shè)置多久才合適。

設(shè)置緩存5秒鐘過(guò)期,可能永遠(yuǎn)無(wú)法命中緩存,而且不但沒(méi)有提升性能,還增加了代碼復(fù)雜度,有點(diǎn)畫(huà)蛇添足的感覺(jué)。 設(shè)置緩存5分鐘過(guò)期,命中緩存的幾率可能會(huì)提高,但緩存后在5分鐘內(nèi)的如果數(shù)據(jù)更新,要從緩存開(kāi)始往后推5分鐘才能看到。

即: 第1分鐘緩存,第1-6分鐘內(nèi)的任何數(shù)據(jù)更新,要第6分鐘后才能看到。

所以,如果你無(wú)法容忍這種情況,請(qǐng)你不要濫用緩存,雖然性能提高了,但問(wèn)題可能也出現(xiàn)了。反之,如果你可以容忍這種情況,那就可以這么操作,而至于過(guò)期設(shè)置多久,可以結(jié)合業(yè)務(wù)場(chǎng)景及使用頻率綜合來(lái)評(píng)估,畢竟不同的業(yè)務(wù)容忍度是不同的。

對(duì)于是否要將動(dòng)態(tài)數(shù)據(jù)進(jìn)行緩存,本質(zhì)上,其實(shí)就是一種取舍,是一種性能與數(shù)據(jù)一致性的權(quán)衡,而 緩存的過(guò)期時(shí)長(zhǎng),就像是保持這種平衡的支點(diǎn),從而讓這種犧牲變得更有意義 

情況2:?jiǎn)螜C(jī)限流

限流,前面已經(jīng)有介紹過(guò),它有兩種常用的限流算法, 漏桶算法和令牌桶算法。不過(guò) ,這兩種算法都僅支持單機(jī)限流,不支持全局限流。

單機(jī)限流,就是對(duì)單節(jié)點(diǎn)設(shè)定一個(gè)限流閾值,如果單節(jié)點(diǎn)上的請(qǐng)求到達(dá)閾值,則會(huì)拒絕請(qǐng)求。例如: 限流閾值=每秒100次請(qǐng)求,如果在1秒內(nèi)單節(jié)點(diǎn)上,有第101次的請(qǐng)求則拒絕。

全局限流,就是對(duì)一組節(jié)點(diǎn)設(shè)定一個(gè)限流總閾值,如果這組節(jié)點(diǎn)上的匯總請(qǐng)求到達(dá)閾值,則會(huì)拒絕請(qǐng)求。例如: 10個(gè)節(jié)點(diǎn)的限流總閾值=1000次請(qǐng)求,如果在1秒內(nèi)這組節(jié)點(diǎn)上,匯總有第1001次請(qǐng)求則拒絕,不過(guò)單節(jié)點(diǎn)上有超過(guò)第100次的請(qǐng)求也會(huì)接受。

這么看下來(lái),感覺(jué)單機(jī)限流控制能力更厲害一點(diǎn),它能保證單節(jié)點(diǎn)的請(qǐng)求不會(huì)超過(guò)100次。而全局限流在極端情況下,單節(jié)點(diǎn)都有可能在1秒內(nèi)會(huì)接受1000次請(qǐng)求。當(dāng)然,這種情況的可能性比較低,比如在突發(fā)請(qǐng)求時(shí),9個(gè)節(jié)點(diǎn)同時(shí)宕機(jī)。

既然如此,那全局限流有存在的意義嗎,難道這就是 漏桶算法和令牌桶算法都不支持全局限流的原因。全局限流就真的沒(méi)有存在的意義嗎。 存在即合理,既然存在,那就一定有它存在的道理 

換個(gè)情況,還是將 10個(gè)節(jié)點(diǎn)為一組,不過(guò)這次換成采用單機(jī)限流。問(wèn)題來(lái)了,每個(gè)節(jié)點(diǎn)的限流閾值該如何設(shè)定,如果采用平均分配,則 限流閾值=每秒100次請(qǐng)求,讓我們來(lái)測(cè)試一下,在1秒內(nèi)依次發(fā)出1000次請(qǐng)求,會(huì)發(fā)生什么現(xiàn)象。

結(jié)果是在第100次請(qǐng)求后,從第101次到第1000次的請(qǐng)求中,可能有些請(qǐng)求會(huì)發(fā)生被拒絕的情況,而且請(qǐng)求一會(huì)兒成功一會(huì)兒拒絕,沒(méi)有任何規(guī)律。原因可能是10個(gè)節(jié)點(diǎn)請(qǐng)求負(fù)載不均所引發(fā)的,導(dǎo)致某個(gè)節(jié)點(diǎn)提前超過(guò)了100次請(qǐng)求。

基于以上情況,最終1000次請(qǐng)求沒(méi)有全部成功,這種情況等同于降低了應(yīng)用系統(tǒng)的吞吐能力。而在實(shí)際情況中,就算采用 輪詢的負(fù)載算法,請(qǐng)求數(shù)不均的可能性仍然還是會(huì)存在的 。這么一看,單機(jī)限流好像也有缺陷。

估計(jì)你已經(jīng)被我說(shuō)暈了吧,讓我們整體再重新梳理一遍,并對(duì)  種不同限流模式的影響進(jìn)行對(duì)比。不過(guò),這次 還加上每秒不同的請(qǐng)求數(shù)量。

每秒請(qǐng)求

單機(jī)限流10*100筆/秒

全局限流1000筆/秒

100筆

無(wú)影響

無(wú)影 

1000筆

少量請(qǐng)求拒絕

耗時(shí)小幅波動(dòng)

10000筆

請(qǐng)求拒絕>9000

請(qǐng)求拒絕=9000耗時(shí)大幅波動(dòng)

注:每個(gè)節(jié)點(diǎn)的處理能力為100筆/秒

兩種限流對(duì)比下來(lái),單機(jī)限流更強(qiáng)調(diào)單機(jī)的控制范圍,但可能會(huì)造成額外的請(qǐng)求拒絕,但對(duì)單節(jié)點(diǎn)不會(huì)造成性能壓力,而全局限流更強(qiáng)調(diào)整體的控制范圍,雖不會(huì)造成額外的請(qǐng)求拒絕,但可能會(huì)對(duì)單節(jié)點(diǎn)造成性能壓力,引發(fā)性能過(guò)載。

除此之外, 全局限流還是一種采用中心化的設(shè)計(jì)思路 ,因此在網(wǎng)絡(luò)開(kāi)銷方面,還會(huì)產(chǎn)生額外的性能損耗,這種損耗在請(qǐng)求量少的時(shí)候估計(jì)還可以容忍,但在高并發(fā)的情況下可能是場(chǎng)災(zāi)難,因?yàn)樵诿看蜗蘖髋袛嗲埃€會(huì)產(chǎn)生一次網(wǎng)絡(luò)開(kāi)銷。

所以,不能為了想要實(shí)現(xiàn)更精準(zhǔn)的限流,就盲目地采用全局限流,它將在高并發(fā)的情況下?lián)p耗更多的性能。而單機(jī)限流所額外造成的少量請(qǐng)求拒絕,在某些情況下,可以考慮采用某些技術(shù)手段進(jìn)行補(bǔ)償。

不過(guò),不管是單機(jī)限流還是全局限流,似乎都和數(shù)據(jù)一致性沒(méi)有關(guān)系。但事實(shí)上,全局限流這種精準(zhǔn)限流的方式,也可以視為另一種一致性的表現(xiàn),而單機(jī)限流就是通過(guò)對(duì)這種一致性的犧牲,來(lái)減少性能損耗,何嘗不是提升性能的另一種方式。

以上,只是簡(jiǎn)單列舉了兩種不同情況下的取舍,而在高并發(fā)架構(gòu)上,可取舍的地方遠(yuǎn)不止這些。你得知道, 高并發(fā)的每一處設(shè)計(jì)或每一份設(shè)計(jì)方案的背后,都曾是通過(guò)不斷地取舍所獲得的 ,而沒(méi)有取舍的高并發(fā)架構(gòu)決策,將會(huì)顯得毫無(wú)說(shuō)服力。

取舍不但可以作為高并發(fā)架構(gòu)決策的有力武器,也將是驅(qū)動(dòng)架構(gòu)演進(jìn)最合理的一種方式 。但要切記,取舍的方向并不是一成不變的,而是會(huì)隨著外界環(huán)境的變化而變化,它將是一種獨(dú)特的藝術(shù)。

寫在最后

高并發(fā)的魅力之處,就在于它沒(méi)有唯一的答案,而答案是需要我們以不同的業(yè)務(wù)場(chǎng)景作為線索去不斷地尋找,這種尋找的過(guò)程也是一種不斷思考的過(guò)程 ,這就是我為什么說(shuō)高并發(fā)是一種架構(gòu)思維模式。

本文從淺到深依次講述了性能是實(shí)現(xiàn)高并發(fā)的基礎(chǔ)條件,控制是實(shí)現(xiàn)資源最大化利用的方式,以及如何通過(guò)取舍來(lái)?yè)Q取當(dāng)前應(yīng)用系統(tǒng)更所需的能力,但這些僅僅只是高并發(fā)世界里的一個(gè)角落。因篇幅有限,今天就暫告一段落。

最后想說(shuō), 高并發(fā)其實(shí)并不可怕,可怕的是你知其然而不知其所以然 。對(duì)于追求技術(shù)的你, 需要不斷地拓寬你的技術(shù)深度與廣度,才能更好地掌握高并 發(fā),以及運(yùn)用高并發(fā)的思維模式來(lái)提升應(yīng)用系統(tǒng)處理能力。

責(zé)任編輯:張燕妮 來(lái)源: 技術(shù)奇妙物語(yǔ)
相關(guān)推薦

2012-01-17 11:02:39

2013-09-04 12:38:56

架構(gòu)設(shè)計(jì)架構(gòu)設(shè)計(jì)構(gòu)思

2017-07-05 14:09:04

系統(tǒng)設(shè)計(jì)與架構(gòu)java云計(jì)算

2020-12-16 10:12:52

大數(shù)據(jù)小數(shù)據(jù)人工智能

2015-01-21 15:35:58

開(kāi)源

2015-08-03 09:36:01

賽迪翻譯

2015-08-31 09:27:21

語(yǔ)言界面UI

2016-12-23 21:11:05

深度學(xué)習(xí)思維方式大數(shù)據(jù)

2022-06-06 15:44:24

大數(shù)據(jù)數(shù)據(jù)分析思維模式

2019-07-22 15:59:21

2011-08-10 09:28:18

虛擬機(jī)虛擬網(wǎng)絡(luò)

2020-09-04 14:10:31

架構(gòu)軟件互聯(lián)網(wǎng)

2020-03-04 17:03:10

數(shù)據(jù)分析思維說(shuō)明

2012-08-13 10:26:53

云計(jì)算云服務(wù)

2012-07-30 09:58:53

2012-11-01 13:41:25

編程語(yǔ)言BasicPerl

2016-04-18 13:41:10

軟件IC網(wǎng)

2015-03-13 11:23:21

編程編程超能力編程能力

2017-07-13 16:43:23

DevOps持續(xù)集成業(yè)務(wù)

2022-09-27 08:04:37

Adapter?設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜精品一区二区三区在线视频 | 成人免费观看视频 | 男女羞羞视频网站 | 91九色婷婷| 岛国在线免费观看 | 毛片一级片 | 日本久久精品视频 | 国产精品日产欧美久久久久 | 国产精品国产三级国产a | 91资源在线观看 | 不卡一区二区在线观看 | 91精品国产91久久综合桃花 | 男人的天堂久久 | 日日噜噜夜夜爽爽狠狠 | 欧美激情视频一区二区三区免费 | 国产成人一区二区三区 | 精品国产伦一区二区三区观看方式 | 91久色| 欧美一级艳情片免费观看 | 久草福利 | 国产精品久久久久久久毛片 | 精品久久久久久久久久久久久久 | 91在线视频免费观看 | 国产精品免费一区二区三区 | 五月天婷婷激情 | 久久久av | 国产区在线| 精品国偷自产在线 | 伊人伊成久久人综合网站 | aa级毛片毛片免费观看久 | 国产美女网站 | av一区在线观看 | 视频三区 | 日韩在线日韩 | 噜啊噜在线 | 免费精品视频一区 | 成人av免费看 | 婷婷国产一区二区三区 | 色又黄又爽网站www久久 | 精品国产一区二区三区四区在线 | 欧美日韩1区2区 |