如果流量突然飆大征懈,總有一個(gè)資源會(huì)遇到瓶頸颜屠。按照經(jīng)驗(yàn)大概出問題地方是DB,磁盤io猾浦、CPU炼邀、帶寬魄揉、連接數(shù)、內(nèi)存其中的一個(gè)或幾個(gè)拭宁。不同的業(yè)務(wù)洛退,不同的系統(tǒng)設(shè)計(jì),出問題的地方會(huì)有所不同杰标。如果流量增大數(shù)倍兵怯,勢(shì)必某個(gè)資源會(huì)在瞬間被榨干,然后所有的服務(wù)都會(huì)“開小差”腔剂,引起用戶的抱怨媒区。而解決問題的關(guān)鍵,是在問題發(fā)生時(shí),盡量減少出問題的資源被訪問袜漩。
1绪爸、流量暴漲的原因
一般情況下,引起網(wǎng)站流量暴增大致為以下兩種情況
1宙攻、不可預(yù)測(cè)流量(網(wǎng)站被惡意刷量奠货;CDN回源抓取數(shù)據(jù);合作業(yè)務(wù)平臺(tái)調(diào)取平臺(tái)數(shù)據(jù)等)
2座掘、可預(yù)測(cè)流量(突然爆發(fā)的社會(huì)熱點(diǎn)递惋,營銷活動(dòng)的宣傳;)
不管是可預(yù)測(cè)流量還是不可預(yù)測(cè)流量都會(huì)表現(xiàn)在帶寬和網(wǎng)站整體架構(gòu)的應(yīng)對(duì)方案上
如果由于帶寬原因引起溢陪,由于網(wǎng)站的并發(fā)量太高萍虽,達(dá)到服務(wù)器的吞吐極限,導(dǎo)致服務(wù)器宕機(jī)形真,這時(shí)需要做臨時(shí)申請(qǐng)加大帶寬杉编,然后負(fù)載均衡分流。
如果由于外網(wǎng)請(qǐng)求數(shù)據(jù)庫没酣,導(dǎo)致數(shù)據(jù)庫頻繁讀寫王财,數(shù)據(jù)庫處理能力低,導(dǎo)致大量請(qǐng)求積壓裕便;如果是這種情況,就需要優(yōu)化SQL见咒,存儲(chǔ)過程等偿衰,如果是請(qǐng)求過大,就要考慮做集群等改览。
可預(yù)測(cè)流量的暴增也會(huì)拖慢網(wǎng)頁的打開速度下翎,甚至導(dǎo)致網(wǎng)站服務(wù)器宕機(jī)。要應(yīng)對(duì)正常流量暴增宝当,在流量高峰期到來之前就可以適當(dāng)?shù)恼{(diào)整视事,一般針對(duì)應(yīng)用服務(wù)器的調(diào)整可以防止單點(diǎn),負(fù)載均衡庆揩,高可用俐东,增加后端web應(yīng)用服務(wù)器數(shù)量,數(shù)據(jù)庫讀寫分離订晌,拆庫拆表等虏辫,防止流量暴增導(dǎo)致服務(wù)器掛掉,下面具體說明:
2锈拨、防止流量暴漲預(yù)備方案
凡事預(yù)則立不預(yù)則廢砌庄,做任何事情,都要未雨綢繆,如果等到大軍打到家門口娄昆,再迎戰(zhàn)就只能被人宰割了佩微。
2.1、流量估算
作為一個(gè)經(jīng)驗(yàn)充足的老運(yùn)維萌焰,可以把設(shè)計(jì)流量*3作為系統(tǒng)壓力的下限喊衫,即實(shí)現(xiàn)完了要壓測(cè),壓測(cè)得到的結(jié)果要達(dá)到設(shè)計(jì)流量 * 3( * 4杆怕, * 5都可以)族购,比如服務(wù)器在IDC機(jī)房,在簽合同之前就可以說明當(dāng)流量異常的時(shí)候陵珍,提供一定的緩沖帶寬寝杖,如果是云服務(wù)器,可以臨時(shí)加帶寬互纯。
關(guān)鍵是要給系統(tǒng)留些緩沖瑟幕。一旦發(fā)生了什么,不至于掛的太慘留潦。此時(shí)只盹,一般會(huì)得到一個(gè)帶緩存的業(yè)務(wù)服務(wù)系統(tǒng)⊥迷海考慮到緩存高于后臺(tái)服務(wù)2~3個(gè)數(shù)量級(jí)的性能優(yōu)勢(shì)殖卑,多撐幾倍流量一般不成問題。
2.2坊萝、降級(jí)方案
降級(jí)總得是用戶可以買賬的方式才行孵稽,不能瞎降。能降級(jí)成什么樣十偶,顯示成什么樣子菩鲜,都得預(yù)先設(shè)計(jì)好。UI上有的要配圖惦积,有的要出警告語提示接校。而作為后臺(tái)服務(wù)器,需要有對(duì)應(yīng)的實(shí)時(shí)開關(guān)狮崩,一旦設(shè)置蛛勉,立刻進(jìn)入降級(jí)方案。
但是厉亏,如果核心服務(wù)就是熱點(diǎn)本身董习,就沒得降級(jí),比如爱只,電商的雙十一皿淋,用戶的購買招刹,下單等行為,下單就是下單窝趣,不能下一半疯暑,不能砍掉支付,不能隨機(jī)性有的能買有的不能買哑舒,是涉及到大量寫操作妇拯,而且是核心鏈路,無法降級(jí)的洗鸵,這個(gè)時(shí)候越锈,限流就比較重要了。
2.2膘滨、限流方案
限流的常用方式
限流的常用處理手段有:計(jì)數(shù)器甘凭、滑動(dòng)窗口、漏桶火邓、令牌丹弱。
計(jì)數(shù)器
計(jì)數(shù)器是一種比較簡單的限流算法,用途比較廣泛铲咨,在接口層面躲胳,很多地方使用這種方式限流。在一段時(shí)間內(nèi)纤勒,進(jìn)行計(jì)數(shù)坯苹,與閥值進(jìn)行比較,到了時(shí)間臨界點(diǎn)踊东,將計(jì)數(shù)器清0北滥。
局限性:
這里需要注意的是,存在一個(gè)時(shí)間臨界點(diǎn)的問題闸翅。舉個(gè)栗子,在12:01:00到12:01:58這段時(shí)間內(nèi)沒有用戶請(qǐng)求菊霜,然后在12:01:59這一瞬時(shí)發(fā)出100個(gè)請(qǐng)求坚冀,OK,然后在12:02:00這一瞬時(shí)又發(fā)出了100個(gè)請(qǐng)求鉴逞。這里你應(yīng)該能感受到记某,在這個(gè)臨界點(diǎn)可能會(huì)承受惡意用戶的大量請(qǐng)求,甚至超出系統(tǒng)預(yù)期的承受构捡。
滑動(dòng)窗口
由于計(jì)數(shù)器存在臨界點(diǎn)缺陷液南,后來出現(xiàn)了滑動(dòng)窗口算法來解決。
局限性:
滑動(dòng)窗口的意思是說把固定時(shí)間片勾徽,進(jìn)行劃分滑凉,并且隨著時(shí)間的流逝,進(jìn)行移動(dòng),這樣就巧妙的避開了計(jì)數(shù)器的臨界點(diǎn)問題畅姊。也就是說這些固定數(shù)量的可以移動(dòng)的格子咒钟,
將會(huì)進(jìn)行計(jì)數(shù)判斷閥值,因此格子的數(shù)量影響著滑動(dòng)窗口算法的精度若未。
漏桶
雖然滑動(dòng)窗口有效避免了時(shí)間臨界點(diǎn)的問題朱嘴,但是依然有時(shí)間片的概念,而漏桶算法在這方面比滑動(dòng)窗口而言粗合,更加先進(jìn)萍嬉。
有一個(gè)固定的桶,進(jìn)水的速率是不確定的隙疚,但是出水的速率是恒定的壤追,當(dāng)水滿的時(shí)候是會(huì)溢出的。
令牌桶
注意到甚淡,漏桶的出水速度是恒定的大诸,那么意味著如果瞬時(shí)大流量的話,將有大部分請(qǐng)求被丟棄掉(也就是所謂的溢出)贯卦。為了解決這個(gè)問題资柔,令牌桶進(jìn)行了算法改進(jìn)。
局限性:
生成令牌的速度是恒定的撵割,而請(qǐng)求去拿令牌是沒有速度限制的贿堰。這意味,面對(duì)瞬時(shí)大流量啡彬,該算法可以在短時(shí)間內(nèi)請(qǐng)求拿到大量令牌羹与,而且拿令牌的過程并不是消耗很大的事情。(有一點(diǎn)生產(chǎn)令牌庶灿,消費(fèi)令牌的意味)
不論是對(duì)于令牌桶拿不到令牌被拒絕纵搁,還是漏桶的水滿了溢出,都是為了保證大部分流量的正常使用往踢,而犧牲掉了少部分流量腾誉,這是合理的,如果因?yàn)闃O少部分流量需要保證的話峻呕,那么就可能導(dǎo)致系統(tǒng)達(dá)到極限而掛掉利职,得不償失。
限流神器:Guava RateLimiter
Guava不僅僅在集合瘦癌、緩存猪贪、異步回調(diào)等方面功能強(qiáng)大,而且還給我們封裝好了限流的API讯私!
Guava RateLimiter基于令牌桶算法热押,我們只需要告訴RateLimiter系統(tǒng)限制的QPS是多少西傀,那么RateLimiter將以這個(gè)速度往桶里面放入令牌,然后請(qǐng)求的時(shí)候楞黄,通過tryAcquire()方法向RateLimiter獲取許可(令牌)