限流演算法
阿新 • • 發佈:2021-08-13
計數器(固定視窗)演算法
計數器演算法是使用計數器在週期內累加訪問次數,當達到設定的限流值時,觸發限流策略。下一個週期開始時,進行清零,重新計數。
此演算法在單機還是分散式環境下實現都非常簡單,使用redis的incr原子自增性和執行緒安全即可輕鬆實現。
這個演算法通常用於QPS限流和統計總訪問量,對於秒級以上的時間週期來說,會存在一個非常嚴重的問題,那就是臨界問題,如下圖:
假設1min內伺服器的負載能力為100,因此一個週期的訪問量限制在100,然而在第一個週期的最後5秒和下一個週期的開始5秒時間段內,分別湧入100的訪問量,雖然沒有超過每個週期的限制量,但是整體上10秒內已達到200的訪問量,已遠遠超過伺服器的負載能力,由此可見,計數器演算法方式限流對於週期比較長的限流,存在很大的弊端。
滑動視窗演算法
滑動視窗演算法是將時間週期分為N個小週期,分別記錄每個小週期內訪問次數,並且根據時間滑動刪除過期的小週期。
如下圖,假設時間週期為1min,將1min再分為2個小週期,統計每個小週期的訪問數量,則可以看到,第一個時間週期內,訪問數量為75,第二個時間週期內,訪問數量為100,超過100的訪問則被限流掉了
由此可見,當滑動視窗的格子劃分的越多,那麼滑動視窗的滾動就越平滑,限流的統計就會越精確。此演算法可以很好的解決固定視窗演算法的臨界問題。
漏桶演算法
漏桶演算法是訪問請求到達時直接放入漏桶,如當前容量已達到上限(限流值),則進行丟棄(觸發限流策略)。漏桶以固定的速率進行釋放訪問請求(即請求通過),直到漏桶為空。
令牌桶演算法
令牌桶演算法是程式以r(r=時間週期/限流值)的速度向令牌桶中增加令牌,直到令牌桶滿,請求到達時向令牌桶請求令牌,如獲取到令牌則通過請求,否則觸發限流策略