高并發(fā)架構(gòu)系列:什么是流量削峰?如何解決秒殺業(yè)務(wù)的削峰場(chǎng)景

流量削峰的由來(lái)

主要是還是來(lái)自于互聯(lián)網(wǎng)的業(yè)務(wù)場(chǎng)景,例如,馬上即將開(kāi)始的春節(jié)火車票搶購(gòu),大量的用戶需要同一時(shí)間去搶購(gòu);以及大家熟知的阿里雙11秒殺, 短時(shí)間上億的用戶涌入,瞬間流量巨大(高并發(fā)),比如:200萬(wàn)人準(zhǔn)備在凌晨12:00準(zhǔn)備搶購(gòu)一件商品,但是商品的數(shù)量缺是有限的100-500件左右。

這樣真實(shí)能購(gòu)買到該件商品的用戶也只有幾百人左右, 但是從業(yè)務(wù)上來(lái)說(shuō),秒殺活動(dòng)是希望更多的人來(lái)參與,也就是搶購(gòu)之前希望有越來(lái)越多的人來(lái)看購(gòu)買商品。

但是,在搶購(gòu)時(shí)間達(dá)到后,用戶開(kāi)始真正下單時(shí),秒殺的服務(wù)器后端缺不希望同時(shí)有幾百萬(wàn)人同時(shí)發(fā)起搶購(gòu)請(qǐng)求。

我們都知道服務(wù)器的處理資源是有限的,所以出現(xiàn)峰值的時(shí)候,很容易導(dǎo)致服務(wù)器宕機(jī),用戶無(wú)法訪問(wèn)的情況出現(xiàn)。

這就好比出行的時(shí)候存在早高峰和晚高峰的問(wèn)題,為了解決這個(gè)問(wèn)題,出行就有了錯(cuò)峰限行的解決方案。

同理,在線上的秒殺等業(yè)務(wù)場(chǎng)景,也需要類似的解決方案,需要平安度過(guò)同時(shí)搶購(gòu)帶來(lái)的流量峰值的問(wèn)題,這就是流量削峰的由來(lái)。

怎樣來(lái)實(shí)現(xiàn)流量削峰方案

削峰從本質(zhì)上來(lái)說(shuō)就是更多地延緩用戶請(qǐng)求,以及層層過(guò)濾用戶的訪問(wèn)需求,遵從“最后落地到數(shù)據(jù)庫(kù)的請(qǐng)求數(shù)要盡量少”的原則。

1.消息隊(duì)列解決削峰

要對(duì)流量進(jìn)行削峰,最容易想到的解決方案就是用消息隊(duì)列來(lái)緩沖瞬時(shí)流量,把同步的直接調(diào)用轉(zhuǎn)換成異步的間接推送,中間通過(guò)一個(gè)隊(duì)列在一端承接瞬時(shí)的流量洪峰,在另一端平滑地將消息推送出去。

消息隊(duì)列中間件主要解決應(yīng)用耦合,異步消息, 流量削鋒等問(wèn)題。常用消息隊(duì)列系統(tǒng):目前在生產(chǎn)環(huán)境,使用較多的消息隊(duì)列有 ActiveMQ、RabbitMQ、 ZeroMQ、Kafka、MetaMQ、RocketMQ 等。

在這里,消息隊(duì)列就像“水庫(kù)”一樣,攔蓄上游的洪水,削減進(jìn)入下游河道的洪峰流量,從而達(dá)到減免洪水災(zāi)害的目的。

具體的消息隊(duì)列MQ選型和應(yīng)用場(chǎng)景可以參考我的往期文章:《高并發(fā)架構(gòu)系列:詳解分布式之消息隊(duì)列的特點(diǎn)、選型、及應(yīng)用場(chǎng)景》

2.流量削峰漏斗:層層削峰

針對(duì)秒殺場(chǎng)景還有一種方法,就是對(duì)請(qǐng)求進(jìn)行分層過(guò)濾,從而過(guò)濾掉一些無(wú)效的請(qǐng)求。

分層過(guò)濾其實(shí)就是采用“漏斗”式設(shè)計(jì)來(lái)處理請(qǐng)求的,如下圖所示:

這樣就像漏斗一樣,盡量把數(shù)據(jù)量和請(qǐng)求量一層一層地過(guò)濾和減少了。

1)分層過(guò)濾的核心思想

通過(guò)在不同的層次盡可能地過(guò)濾掉無(wú)效請(qǐng)求。

通過(guò)CDN過(guò)濾掉大量的圖片,靜態(tài)資源的請(qǐng)求。

再通過(guò)類似Redis這樣的分布式緩存,過(guò)濾請(qǐng)求等就是典型的在上游攔截讀請(qǐng)求。

2)分層過(guò)濾的基本原則

對(duì)寫(xiě)數(shù)據(jù)進(jìn)行基于時(shí)間的合理分片,過(guò)濾掉過(guò)期的失效請(qǐng)求。

對(duì)寫(xiě)請(qǐng)求做限流保護(hù),將超出系統(tǒng)承載能力的請(qǐng)求過(guò)濾掉。

涉及到的讀數(shù)據(jù)不做強(qiáng)一致性校驗(yàn),減少因?yàn)橐恢滦孕r?yàn)產(chǎn)生瓶頸的問(wèn)題。

對(duì)寫(xiě)數(shù)據(jù)進(jìn)行強(qiáng)一致性校驗(yàn),只保留最后有效的數(shù)據(jù)。

最終,讓“漏斗”最末端(數(shù)據(jù)庫(kù))的才是有效請(qǐng)求。例如:當(dāng)用戶真實(shí)達(dá)到訂單和支付的流程,這個(gè)是需要數(shù)據(jù)強(qiáng)一致性的。

總結(jié)

1.對(duì)于秒殺這樣的高并發(fā)場(chǎng)景業(yè)務(wù),最基本的原則就是將請(qǐng)求攔截在系統(tǒng)上游,降低下游壓力。如果不在前端攔截很可能造成數(shù)據(jù)庫(kù)(mysql、oracle等)讀寫(xiě)鎖沖突,甚至導(dǎo)致死鎖,最終還有可能出現(xiàn)雪崩等場(chǎng)景。

2.劃分好動(dòng)靜資源,靜態(tài)資源使用CDN進(jìn)行服務(wù)分發(fā)。

3.充分利用緩存(redis等):增加QPS,從而加大整個(gè)集群的吞吐量。

4.高峰值流量是壓垮系統(tǒng)很重要的原因,所以需要Kafka等消息隊(duì)列在一端承接瞬時(shí)的流量洪峰,在另一端平滑地將消息推送出去。

以上是就是流量削峰的詳解。

覺(jué)得不錯(cuò)請(qǐng)點(diǎn)贊支持,歡迎留言或進(jìn)我的個(gè)人群179961551領(lǐng)取【架構(gòu)資料專題目合集90期】、【BATJTMD大廠JAVA面試真題1000+】,本群專用于學(xué)習(xí)交流技術(shù)、分享面試機(jī)會(huì),拒絕廣告,我也會(huì)在群內(nèi)不定期答題、探討。

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

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

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