接口限流算法小記


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

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

 

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

基於信號量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

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

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

 

 

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

 

 

參考資料:

https://segmentfault.com/a/1190000015967922

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM