架构设计之「服务限流」
原文:架構(gòu)設(shè)計(jì)之「服務(wù)限流」
?
上一篇我們聊過(guò)了架構(gòu)設(shè)計(jì)中的「服務(wù)隔離」模式,今天我們繼續(xù)來(lái)探索一下在分布式系統(tǒng)架構(gòu)中的另一個(gè)常用的設(shè)計(jì):服務(wù)限流。
那么,什么是「服務(wù)限流」呢??
在解釋「服務(wù)限流」之前,我們來(lái)看一下前些時(shí)間網(wǎng)上很火的一個(gè)段子,說(shuō)的是新浪微博的一名工程師正在家里辦婚禮,突然接到公司的電話要緊急處理線上流量激增的問(wèn)題,那天應(yīng)該是某當(dāng)紅明星突然在微博上公布戀情,微博流量突增好幾倍,導(dǎo)致系統(tǒng)功能出現(xiàn)不穩(wěn)定,用戶訪問(wèn)不暢。然后這名工程師就只好晾開(kāi)新娘,在婚禮現(xiàn)場(chǎng)穿著西裝打開(kāi)筆記本調(diào)試代碼了。
當(dāng)時(shí)這名工程師內(nèi)心肯定是崩潰的,肯定在想:為啥要在今天公布戀情!等我把系統(tǒng)的擴(kuò)容和服務(wù)限流機(jī)制做好先啊。
哈哈,看完了段子,基本上服務(wù)限流的作用也就明白:?
服務(wù)限流其實(shí)是指當(dāng)系統(tǒng)資源不夠,不足以應(yīng)對(duì)大量請(qǐng)求,即系統(tǒng)資源與訪問(wèn)量出現(xiàn)矛盾的時(shí)候,我們?yōu)榱吮WC有限的資源能夠正常服務(wù),因此對(duì)系統(tǒng)按照預(yù)設(shè)的規(guī)則進(jìn)行流量限制或功能限制的一種方法。
一、為什么要做服務(wù)限流設(shè)計(jì)?
再舉一個(gè)我們生活中的例子:一些熱門的旅游景點(diǎn),往往會(huì)對(duì)每日的旅游參觀人數(shù)有嚴(yán)格的限制,比如廈門的鼓浪嶼、北京的故宮等,每天只會(huì)賣出固定數(shù)目的門票,如果你去的晚了,可能當(dāng)天的票就已經(jīng)賣完了,當(dāng)天就無(wú)法進(jìn)去游玩了。
為什么旅游景點(diǎn)要做這樣的限制呢?多賣一些門票多賺一些錢豈不是更好?
其實(shí)對(duì)于旅游景點(diǎn)而言,她們也很無(wú)奈,因?yàn)榫包c(diǎn)的服務(wù)資源有限嘛,每日能服務(wù)的人數(shù)是有限的,一旦放開(kāi)限制了,景點(diǎn)的工作人員就會(huì)不夠用,衛(wèi)生情況也得不到保障,安全也有隱患,超密集的人群也會(huì)嚴(yán)重的影響游客的體驗(yàn)。?
但由于景區(qū)名氣大,來(lái)游玩的旅客絡(luò)繹不絕,遠(yuǎn)超出了景區(qū)的承載能力,因此景區(qū)只好做出限制每日人員流量的舉措。
同理,在IT軟件行業(yè)中,系統(tǒng)服務(wù)也是這樣的。
如果你的系統(tǒng)理論是時(shí)間單位內(nèi)可服務(wù)100W用戶,但是今天卻突然來(lái)了300W用戶,由于用戶流量的隨機(jī)性,如果不加以限流,很有可能這300W用戶一下子就壓垮了系統(tǒng),導(dǎo)致所有人都得不到服務(wù)。
因此為了保證系統(tǒng)至少還能為100W用戶提供正常服務(wù),我們需要對(duì)系統(tǒng)進(jìn)行限流設(shè)計(jì)。
有的人可能會(huì)想,既然會(huì)有300W用戶來(lái)訪問(wèn),那為啥系統(tǒng)不干脆設(shè)計(jì)成能足以支撐這么大量用戶的集群呢?
這是個(gè)好問(wèn)題。如果系統(tǒng)是長(zhǎng)期有300W的用戶來(lái)訪問(wèn),肯定是要做上述升級(jí)的,但是常常面臨的情況是,系統(tǒng)的日常訪問(wèn)量就是100W,只不過(guò)偶爾有一些不可預(yù)知的特定原因?qū)е碌亩虝r(shí)間的流量激增,這個(gè)時(shí)候,公司往往出于節(jié)約成本的考慮,不會(huì)為了一個(gè)不常見(jiàn)的尖峰來(lái)把我們的系統(tǒng)擴(kuò)容到最大的尺寸。
二、服務(wù)限流應(yīng)該怎么做?
對(duì)系統(tǒng)服務(wù)進(jìn)行限流,一般有如下幾個(gè)模式:
這個(gè)模式是需要系統(tǒng)在設(shè)計(jì)之初,就要把熔斷措施考慮進(jìn)去。當(dāng)系統(tǒng)出現(xiàn)問(wèn)題時(shí),如果短時(shí)間內(nèi)無(wú)法修復(fù),系統(tǒng)要自動(dòng)做出判斷,開(kāi)啟熔斷開(kāi)關(guān),拒絕流量訪問(wèn),避免大流量對(duì)后端的過(guò)載請(qǐng)求。系統(tǒng)也應(yīng)該能夠動(dòng)態(tài)監(jiān)測(cè)后端程序的修復(fù)情況,當(dāng)程序已恢復(fù)穩(wěn)定時(shí),可以關(guān)閉熔斷開(kāi)關(guān),恢復(fù)正常服務(wù)。
將系統(tǒng)的所有功能服務(wù)進(jìn)行一個(gè)分級(jí),當(dāng)系統(tǒng)出現(xiàn)問(wèn)題,需要緊急限流時(shí),可將不是那么重要的功能進(jìn)行降級(jí)處理,停止服務(wù),這樣可以釋放出更多的資源供給核心功能的去用。?
例如在電商平臺(tái)中,如果突發(fā)流量激增,可臨時(shí)將商品評(píng)論、積分等非核心功能進(jìn)行降級(jí),停止這些服務(wù),釋放出機(jī)器和CPU等資源來(lái)保障用戶正常下單,而這些降級(jí)的功能服務(wù)可以等整個(gè)系統(tǒng)恢復(fù)正常后,再來(lái)啟動(dòng),進(jìn)行補(bǔ)單/補(bǔ)償處理。?
除了功能降級(jí)以外,還可以采用不直接操作數(shù)據(jù)庫(kù),而全部讀緩存、寫緩存的方式作為臨時(shí)降級(jí)方案。
這個(gè)模式需要在系統(tǒng)的前端設(shè)置一個(gè)流量緩沖池,將所有的請(qǐng)求全部緩沖進(jìn)這個(gè)池子,不立即處理。然后后端真正的業(yè)務(wù)處理程序從這個(gè)池子中取出請(qǐng)求依次處理,常見(jiàn)的可以用隊(duì)列模式來(lái)實(shí)現(xiàn)。這就相當(dāng)于用異步的方式去減少了后端的處理壓力,但是當(dāng)流量較大時(shí),后端的處理能力有限,緩沖池里的請(qǐng)求可能處理不及時(shí),會(huì)有一定程度延遲。
這個(gè)模式需要將用戶進(jìn)行分類,通過(guò)預(yù)設(shè)的分類,讓系統(tǒng)優(yōu)先處理需要高保障的用戶群體,其它用戶群的請(qǐng)求就會(huì)延遲處理或者直接不處理。
那在實(shí)際項(xiàng)目中,對(duì)訪問(wèn)流量的限制,可采用如下幾種技術(shù)方法:
- 熔斷技術(shù)
熔斷的技術(shù)可以重點(diǎn)參考Netflix的開(kāi)源組件hystrix的做法,主要有三個(gè)模塊:熔斷請(qǐng)求判斷算法、熔斷恢復(fù)機(jī)制、熔斷報(bào)警。
?
?
- 計(jì)數(shù)器方法
系統(tǒng)維護(hù)一個(gè)計(jì)數(shù)器,來(lái)一個(gè)請(qǐng)求就加1,請(qǐng)求處理完成就減1,當(dāng)計(jì)數(shù)器大于指定的閾值,就拒絕新的請(qǐng)求。?
基于這個(gè)簡(jiǎn)單的方法,可以再延伸出一些高級(jí)功能,比如閾值可以不是固定值,是動(dòng)態(tài)調(diào)整的。另外,還可以有多組計(jì)數(shù)器分別管理不同的服務(wù),以保證互不影響等。 - 隊(duì)列方法
就是基于FIFO隊(duì)列,所有請(qǐng)求都進(jìn)入隊(duì)列,后端程序從隊(duì)列中取出待處理的請(qǐng)求依次處理。?
基于隊(duì)列的方法,也可以延伸出更多的玩法來(lái),比如可以設(shè)置多個(gè)隊(duì)列以配置不同的優(yōu)先級(jí)。 - 令牌桶方法
首先還是要基于一個(gè)隊(duì)列,請(qǐng)求放到隊(duì)列里面。但除了隊(duì)列以外,還要設(shè)置一個(gè)令牌桶,另外有一個(gè)腳本以持續(xù)恒定的速度往令牌桶里面放令牌,后端處理程序每處理一個(gè)請(qǐng)求就必須從桶里拿出一個(gè)令牌,如果令牌拿完了,那就不能處理請(qǐng)求了。我們可以控制腳本放令牌的速度來(lái)達(dá)到控制后端處理的速度,以實(shí)現(xiàn)動(dòng)態(tài)流控。
?
三、服務(wù)限流的注意事項(xiàng)
我們?cè)谧龇?wù)限流的時(shí)候,還是有一些原則和事項(xiàng)需要注意的:
- 實(shí)時(shí)監(jiān)控:系統(tǒng)必須要做好全鏈路的實(shí)時(shí)監(jiān)控,才能保證限流的及時(shí)檢測(cè)和處理。
- 手動(dòng)開(kāi)關(guān):除系統(tǒng)自動(dòng)限流以外,還需要有能手動(dòng)控制的開(kāi)關(guān),以保證隨時(shí)都可以人工介入。
- 限流的性能:限流的功能理論上是會(huì)在一定程度影響到業(yè)務(wù)正常性能的,因此需要做到限流的性能優(yōu)化和控制。
系統(tǒng)故障常常都是不可預(yù)測(cè)且難以避免的,因此作為系統(tǒng)設(shè)計(jì)師的我們,必須要提前預(yù)設(shè)各種措施,以應(yīng)對(duì)隨時(shí)可能的系統(tǒng)風(fēng)險(xiǎn)。
?
?
posted on 2019-03-29 12:58 NET未來(lái)之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10620593.html
總結(jié)
以上是生活随笔為你收集整理的架构设计之「服务限流」的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么从前那些.NET开发者都不写单元测
- 下一篇: 简易promise的实现(二)