介面限流演算法小記

2022-01-31 11:31:22 字數 853 閱讀 1558

高併發系統中保護系統的三把利器:快取、降級、限流

快取:快取的目的是提公升系統訪問速度和增大系統處理容量

降級:降級是當伺服器壓力劇增的情況下,根據當前業務情況及流量對一些服務和頁面有策略的降級,以此釋放伺服器資源以保證核心任務的正常執行

限流:限流的目的是通過對併發訪問/請求進行限速,或者對乙個時間視窗內的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務、排隊或等待、降級等處理

對於系統中的介面呼叫,如果不考慮限流,會成系統的連鎖反應,輕者響應緩慢,重者系統宕機,整個業務線崩潰。限流演算法通常是為了限制qps。主要有如下幾種:

只有數量維度,沒有時間維度。普通的併發訪問控制策略如鎖也屬於這種。

帶上了時間維度,但在兩個視窗的臨界點容易出現超出限流的情況,比如限制每分鐘10個請求,在00:59請求了10次,在01:01又請求了10次,而從00:30-01:30這個時間視窗來看,這一分鐘請求了20次,沒有控制好。為了避免這種情況,可以要求在最後乙個請求到來後的1/qps時間內部接受請求或讓請求等待延後,不過此法導致這個等待時間內資源浪費。

解決了fixed window沒解決的視窗臨界問題,主要有leak bucket演算法、token bucket演算法,前者不能應對突發流量(流量突發時對於超發請求只能丟棄或讓之排隊)。兩種演算法具體可參閱:

漏桶:出水速度恆定,意味著對於短時打流量將有大部分請求被丟棄掉(即所謂的溢位)。出水速度恆定,所以更適合用於整流場景,使流向下游的流量整體穩定。

令牌桶:生成令牌的速度恆定,而請求去拿令牌沒有速度限制。意味著面對瞬時大流量可以在短時間內請求拿到大量令牌,而且拿令牌的過程並不是消耗很大的事情。

上述限流演算法都是指單機下的限流演算法,對於分布式環境下不能直接適用。

介面限流演算法

在開發高併發系統時,有三把利器來保護系統 快取 降級和限流。下面來看看限流量的一些演算法 1.計數器法 它是限流演算法中最簡單最容易的一種演算法,比如我們要求某乙個介面,1分鐘內的請求不能超過10次,我們可以在開始時設定乙個計數器,每次請求,該計數器 1 如果該計數器的值大於10並且與第一次請求的時...

限流和限流演算法

目錄 一 什麼是限流 二 為什麼需要限流 三 那些場景需要用到限流 3.1 對外服務 3.2 對內服務 四 限流演算法 4.1 計數器演算法 4.2 漏桶演算法 4.3 令牌桶演算法 限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務...

php令牌桶演算法實現介面限流

前端每次請求從令牌桶取走令牌,後端勻速向桶內投遞令牌,如果前端取到令牌,則說明這次請求有效,否則讓前端再次請求或者等待。避免了大量請求下伺服器壓力過大導致的崩潰問題。令牌桶類 class token catch redi ception exception 令牌初始化 public function...