接口限流算法小記

高併發系統中保護系統的三把利器:緩存、降級、限流html

緩存:緩存的目的是提高系統訪問速度和增大系統處理容量
降級:降級是當服務器壓力劇增的狀況下,根據當前業務狀況及流量對一些服務和頁面有策略的降級,以此釋放服務器資源以保證核心任務的正常運行
限流:限流的目的是經過對併發訪問/請求進行限速,或者對一個時間窗口內的請求進行限速來保護系統,一旦達到限制速率則能夠拒絕服務、排隊或等待、降級等處理算法

 

對於系統中的接口調用,若是不考慮限流,會成系統的連鎖反應,輕者響應緩慢,重者系統宕機,整個業務線崩潰。限流算法一般是爲了限制qps。主要有以下幾種:segmentfault

基於信號量Semaphore

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

基於固定窗口(fixed window)

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

基於滑動窗口(rolling window)

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

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

令牌桶:生成令牌的速度恆定,而請求去拿令牌沒有速度限制。意味着面對瞬時大流量能夠在短期內請求拿到大量令牌,並且拿令牌的過程並非消耗很大的事情。高併發

 

 

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

 

 

參考資料:htm

http://www.javashuo.com/article/p-obqbsxba-bk.html

https://blog.wangqi.love/articles/Java/%E9%99%90%E6%B5%81%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.html

相關文章
相關標籤/搜索