在開發高併發系統時有三把利器用來保護系統:快取、降級和限流。今天我們要聊的就是限流(rate limit),限流的目的很簡單,就是為了保護系統不被瞬時大流量沖垮,
需要用到限流,特別是類似秒殺這種瞬時流量非常大但實際成單率低的業務場景。
目前比較常用的限流演算法有三種
計數器固定視窗演算法是最簡單的限流演算法,實現方式也比較簡單。就是通過維護乙個單位時間內的計數值,每當乙個請求通過時,就將計數值加1,當計數值超過預先設定的閾值時,就拒絕單位時間內的其他請求。如果單位時間已經結束,則將計數器清零,開啟下一輪的計數。
但是這種實現會有乙個問題,舉個例子:
假設我們設定1秒內允許通過的請求閾值是200,如果有使用者在時間視窗的最後幾毫秒傳送了200個請求,緊接著又在下乙個時間視窗開始時傳送了200個請求,那麼這個使用者其實在一秒內成功請求了400次,顯然超過了閾值但並不會被限流。其實這就是臨界值問題,那麼臨界值問題要怎麼解決呢?
計數器滑動視窗法就是為了解決上述固定視窗計數存在的問題而誕生,學過tcp協議的同學應該對滑動視窗不陌生,其實還是不太一樣的,下文我們要說的滑動視窗是基於時間來劃分視窗的。而tcp的滑動視窗指的是能夠接受的位元組數,並且大小是可變的(擁塞控制)
滑動視窗是怎麼做的?
前面說了固定視窗存在臨界值問題,要解決這種臨界值問題,顯然只用乙個視窗是解決不了問題的。假設我們仍然設定1秒內允許通過的請求是200個,但是在這裡我們需要把1秒的時間分成多格,假設分成5格(格數越多,流量過渡越平滑),每格視窗的時間大小是200毫秒,每過200毫秒,就將視窗向前移動一格。為了便於理解,可以看下圖
圖中將視窗劃為5份,每個小視窗中的數字表示在這個視窗中請求數,所以通過觀察上圖,可知在當前時間快(200毫秒)允許通過的請求數應該是20而不是200(只要超過20就會被限流),因為我們最終統計請求數時是需要把當前視窗的值進行累加,進而得到當前請求數來判斷是不是需要進行限流。
那麼滑動視窗限流法是完美的嗎?
細心觀察的我們應該能馬上發現問題,滑動視窗限流法其實就是計數器固定視窗演算法的乙個變種。流量的過渡是否平滑依賴於我們設定的視窗格數也就是統計時間間隔,格數越多,統計越精確,但是具體要分多少格我們也說不上來呀...
上面所介紹的兩種演算法都不能非常平滑的過渡,下面就是漏桶演算法登場了
什麼是漏桶演算法?
漏桶演算法以乙個常量限制了出口流量速率,因此漏桶演算法可以平滑突發的流量。其中漏桶作為流量容器我們可以看做乙個fifo的佇列,當入口流量速率大於出口流量速率時,因為流量容器是有限的,當超出流量容器大小時,超出的流量會被丟棄。
下圖比較形象的說明了漏桶演算法的原理,其中水龍頭是入口流量,漏桶是流量容器,勻速流出的水是出口流量。
漏桶演算法的特點
不過因為漏桶演算法限制了流出速率是乙個固定常量值,所以漏桶演算法不支援出現突發流出流量。但是在實際情況下,流量往往是突發的。
令牌桶演算法是漏桶演算法的改進版,可以支援突發流量。不過與漏桶演算法不同的是,令牌桶演算法的漏桶中存放的是令牌而不是流量。
那麼令牌桶演算法是怎麼突發流量的呢?
最開始,令牌桶是空的,我們以恆定速率往令牌桶裡加入令牌,令牌桶被裝滿時,多餘的令牌會被丟棄。當請求到來時,會先嘗試從令牌桶獲取令牌(相當於從令牌桶移除乙個令牌),獲取成功則請求被放行,獲取失敗則阻塞活拒絕請求。
令牌桶演算法的特點
令牌桶演算法限制的是平均流量,因此其允許突發流量(只要令牌桶中有令牌,就不會被限流)
至此,基本把以上4種限流演算法的原理都解釋清楚了。每種限流演算法都有其固定特點,及各自適用的場景,其中計數器演算法是其中最簡單的,相當於滑動視窗演算法的簡化版,令牌桶演算法相比漏桶演算法對資源的利用率更高(允許突發流量)
參考:sentinel原始碼解析一(流程總覽)
sentinel原始碼解析二(slot總覽)
sentinel原始碼解析三(滑動視窗流量統計)
sentinel原始碼解析四(流控策略和流控效果)
常用的限流演算法
常用的限流演算法大致有三種 令牌桶演算法,漏桶演算法,計數器演算法 令牌桶演算法 令牌桶演算法是乙個存放固定容量令牌的桶,按照固定速率往桶裡新增令牌。令牌桶演算法的描述如下 1.假設限制2r s,則按照500毫秒的固定速率往桶中新增令牌 2.桶中最多存放b個令牌,當桶滿時,新新增的令牌被丟棄或拒絕 ...
限流和限流演算法
目錄 一 什麼是限流 二 為什麼需要限流 三 那些場景需要用到限流 3.1 對外服務 3.2 對內服務 四 限流演算法 4.1 計數器演算法 4.2 漏桶演算法 4.3 令牌桶演算法 限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務...
常用限流演算法與應用場景
限流是在微服務介面時,面對高併發場景必須考慮的問題。現在限流演算法主要有以下幾種 其中令牌桶演算法變種還可以分為 單速率三色標記演算法 雙速率三色標記演算法 計數器法是限流演算法裡最簡單也是最容易實現的一種演算法。一般是限制一段時間能夠通過的請求數,比如某個介面規定5秒鐘的訪問次數不能超過10次,那...