架構設計之服務限流

2021-09-07 19:59:59 字數 2776 閱讀 2438

限流可以認為服務降級的一種,限流就是限制系統的輸入和輸出流量已達到保護系統的目的。一般來說系統的吞吐量是可以被測算的,為了保證系統的穩定執行,一旦達到的需要限制的閾值,就需要限制流量並採取一些措施以完成限制流量的目的。比如:延遲處理,拒絕處理,或者部分拒絕處理等等。

在介紹限流概念之前,我們先來聊聊身邊有哪些限流,如果有在帝都的碼農估計對限流是最深有感觸的,帝都但凡開個***會議,各大地鐵站都會限流。

每年的雙11都是剁手族的天堂,11月11號0點0幾秒的時候,下面這些場景或許你曾經遇到過。

當然,這幾年雙11各大電商對併發的支援做的越來越好,這裡只是借鑑雙11剛推出之際,常常需要應對的一些問題。

通過這兩個場景,基本上服務限流的作用也就明白:

「服務限流」其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務,因此對系統按照預設的規則進行流量限制或功能限制的一種方法。

再舉乙個我們生活中的例子:一些熱門的旅遊景點,往往會對每日的旅遊參觀人數有嚴格的限制,比如北京的故宮、歡樂谷等,每天只會賣出固定數目的門票,如果你去的晚了,可能當天的票就已經賣完了,當天就無法進去遊玩了,即使你進去了,排隊也能排到你懷疑人生。

為什麼旅遊景點要做這樣的限制呢?多賣一些門票多賺一些錢豈不是更好?

其實對於旅遊景點而言,她們也很無奈,因為景點的服務資源有限嘛,每日能服務的人數是有限的,一旦放開限制了,景點的工作人員就會不夠用,衛生情況也得不到保障,安全也有隱患,超密集的人群也會嚴重的影響遊客的體驗。但由於景區名氣大,來遊玩的旅客絡繹不絕,遠超出了景區的承載能力,因此景區只好做出限制每日人員流量的舉措。

同理,在it軟體行業中,系統服務也是這樣的。

如果你的系統理論是時間單位內可服務100w使用者,但是今天卻突然來了300w使用者,由於使用者流量的隨機性,如果不加以限流,很有可能這300w使用者一下子就壓垮了系統,導致所有人都得不到服務。

因此為了保證系統至少還能為100w使用者提供正常服務,我們需要對系統進行限流設計。

有的人可能會想,既然會有300w使用者來訪問,那為啥系統不乾脆設計成能足以支撐這麼大量使用者的集群呢?

這是個好問題。如果系統是長期有300w的使用者來訪問,肯定是要做上述公升級的,但是常常面臨的情況是,系統的日常訪問量就是100w,只不過偶爾有一些不可預知的特定原因導致的短時間的流量激增,這個時候,公司往往出於節約成本的考慮,不會為了乙個不常見的尖峰來把我們的系統擴容到最大的尺寸。

對系統服務進行限流,一般有如下幾個模式:

1. 熔斷:

這個模式是需要系統在設計之初,就要把熔斷措施考慮進去。當系統出現問題時,如果短時間內無法修復,系統要自動做出判斷,開啟熔斷開關,拒絕流量訪問,避免大流量對後端的過載請求。系統也應該能夠動態監測後端程式的修復情況,當程式已恢復穩定時,可以關閉熔斷開關,恢復正常服務。

2. 服務降級:

將系統的所有功能服務進行乙個分級,當系統出現問題,需要緊急限流時,可將不是那麼重要的功能進行降級處理,停止服務,這樣可以釋放出更多的資源供給核心功能的去用。

3. 延遲處理:

這個模式需要在系統的前端設定乙個流量緩衝池,將所有的請求全部緩衝進這個池子,不立即處理。然後後端真正的業務處理程式從這個池子中取出請求依次處理,常見的可以用佇列模式來實現。這就相當於用非同步的方式去減少了後端的處理壓力,但是當流量較大時,後端的處理能力有限,緩衝池裡的請求可能處理不及時,會有一定程度延遲。

4. 特權處理:

這個模式需要將使用者進行分類,通過預設的分類,讓系統優先處理需要高保障的使用者群體,其它使用者群的請求就會延遲處理或者直接不處理。

那在實際專案中,對訪問流量的限制,可採用如下幾種技術方法:

♛ 熔斷技術

熔斷的技術可以重點參考netflix的開源元件hystrix的做法,主要有三個模組:熔斷請求判斷演算法、熔斷恢復機制、熔斷報警。

來自hystrix github

wiki

檢視大圖

♛ 計數器方法

系統維護乙個計數器,來乙個請求就加1,請求處理完成就減1,當計數器大於指定的閾值,就拒絕新的請求。

基於這個簡單的方法,可以再延伸出一些高階功能,比如閾值可以不是固定值,是動態調整的。另外,還可以有多組計數器分別管理不同的服務,以保證互不影響等。

♛ 佇列方法

就是基於fifo佇列,所有請求都進入佇列,後端程式從佇列中取出待處理的請求依次處理。

基於佇列的方法,也可以延伸出更多的玩法來,比如可以設定多個佇列以配置不同的優先順序。

♛ 令牌桶方法

首先還是要基於乙個佇列,請求放到佇列裡面。但除了佇列以外,還要設定乙個令牌桶,另外有乙個指令碼以持續恆定的速度往令牌桶裡面放令牌,後端處理程式每處理乙個請求就必須從桶裡拿出乙個令牌,如果令牌拿完了,那就不能處理請求了。我們可以控制指令碼放令牌的速度來達到控制後端處理的速度,以實現動態流控。

我們在做服務限流的時候,還是有一些原則和事項需要注意的:

系統故障常常都是不可**且難以避免的,因此作為系統設計師的我們,必須要提前預設各種措施,以應對隨時可能的系統風險。

作  者:請叫我頭頭哥出  處:

一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

架構設計之 服務限流

當時這名工程師內心肯定是崩潰的,肯定在想 為啥要在今天公布戀情!等我把系統的擴容和服務限流機制做好先啊。哈哈,看完了段子,基本上服務限流的作用也就明白 服務限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務,因此對系統按照預設的規則進...

架構設計之 服務限流

當時這名工程師內心肯定是崩潰的,肯定在想 為啥要在今天公布戀情!等我把系統的擴容和服務限流機制做好先啊。哈哈,看完了段子,基本上服務限流的作用也就明白 服務限流 其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務,因此對系統按照預設的規則...

架構設計之 服務限流

當時這名工程師內心肯定是崩潰的,肯定在想 為啥要在今天公布戀情!等我把系統的擴容和服務限流機制做好先啊。哈哈,看完了段子,基本上服務限流的作用也就明白 服務限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務,因此對系統按照預設的規則進...