三種常見的限流演算法

2022-03-13 17:01:17 字數 2264 閱讀 9560

在開發高併發系統時,有三把利器用來保護系統:快取、降級和限流。那麼何為限流呢?顧名思義,限流就是限制流量,就像你寬頻包了1個g的流量,用完了就沒了。通過限流,我們可以很好地控制系統的qps,從而達到保護系統的目的。本篇文章將會介紹一下常用的限流演算法以及他們各自的特點。

1、計數器演算法

計數器演算法是限流演算法裡最簡單也是最容易實現的一種演算法。比如我們規定,對於a介面來說,我們1分鐘的訪問次數不能超過100個。那麼我們可以這麼做:在一開 始的時候,我們可以設定乙個計數器counter,每當乙個請求過來的時候,counter就加1,如果counter的值大於100並且該請求與第乙個 請求的間隔時間還在1分鐘之內,那麼說明請求數過多;如果該請求與第乙個請求的間隔時間大於1分鐘,且counter的值還在限流範圍內,那麼就重置 counter,具體演算法的示意圖如下:

具體的偽**如下:

public

class

countertest

else

}public

long

getnowtime()

}

這個演算法雖然簡單,但是有乙個十分致命的問題,那就是臨界問題,我們看下圖:

從上圖中我們可以看到,假設有乙個惡意使用者,他在0:59時,瞬間傳送了100個請求,並且1:00又瞬間傳送了100個請求,那麼其實這個使用者在 1秒裡面,瞬間傳送了200個請求。我們剛才規定的是1分鐘最多100個請求,也就是每秒鐘最多1.7個請求,使用者通過在時間視窗的重置節點處突發請求, 可以瞬間超過我們的速率限制。使用者有可能通過演算法的這個漏洞,瞬間壓垮我們的應用。

聰明的朋友可能已經看出來了,剛才的問題其實是因為我們統計的精度太低。那麼如何很好地處理這個問題呢?或者說,如何將臨界問題的影響降低呢?我們可以看下面的滑動視窗演算法。

滑動視窗

滑動視窗,又稱rolling window。為了解決這個問題,我們引入了滑動視窗演算法。如果學過tcp網路協議的話,那麼一定對滑動視窗這個名詞不會陌生。下面這張圖,很好地解釋了滑動視窗演算法:

在上圖中,整個紅色的矩形框表示乙個時間視窗,在我們的例子中,乙個時間視窗就是一分鐘。然後我們將時間視窗進行劃分,比如圖中,我們就將滑動視窗 劃成了6格,所以每格代表的是10秒鐘。每過10秒鐘,我們的時間視窗就會往右滑動一格。每乙個格仔都有自己獨立的計數器counter,比如當乙個請求 在0:35秒的時候到達,那麼0:30~0:39對應的counter就會加1。

那麼滑動視窗怎麼解決剛才的臨界問題的呢?我們可以看上圖,0:59到達的100個請求會落在灰色的格仔中,而1:00到達的請求會落在橘黃色的格 子中。當時間到達1:00時,我們的視窗會往右移動一格,那麼此時時間視窗內的總請求數量一共是200個,超過了限定的100個,所以此時能夠檢測出來觸 發了限流。

我再來回顧一下剛才的計數器演算法,我們可以發現,計數器演算法其實就是滑動視窗演算法。只是它沒有對時間視窗做進一步地劃分,所以只有1格。

由此可見,當滑動視窗的格仔劃分的越多,那麼滑動視窗的滾動就越平滑,限流的統計就會越精確。

2、令牌桶演算法

令牌桶演算法是比較常見的限流演算法之一,大概描述如下:

1)、所有的請求在處理之前都需要拿到乙個可用的令牌才會被處理;

2)、根據限流大小,設定按照一定的速率往桶裡新增令牌;

3)、桶設定最大的放置令牌限制,當桶滿時、新新增的令牌就被丟棄或者拒絕;

4)、請求達到後首先要獲取令牌桶中的令牌,拿著令牌才可以進行其他的業務邏輯,處理完業務邏輯之後,將令牌直接刪除;

5)、令牌桶有最低限額,當桶中的令牌達到最低限額的時候,請求處理完之後將不會刪除令牌,以此保證足夠的限流;

3、漏桶演算法

漏桶演算法其實很簡單,可以粗略的認為就是注水漏水過程,往桶中以一定速率流出水,以任意速率流入水,當水超過桶流量則丟棄,因為桶容量是不變的,保證了整體的速率。

限流演算法 三種思路

限流演算法 常見的限流演算法有 令牌桶 漏桶 計數器。令牌桶限流 令牌桶是乙個存放固定容量令牌的桶,按照固定速率往桶裡新增令牌,填滿了就丟棄令牌,請求是否被處理要看桶中令牌是否足夠,當令牌數減為零時則拒絕新的請求。令牌桶允許一定程度突發流量,只要有令牌就可以處理,支援一次拿多個令牌。令牌桶中裝的是令...

三種nginx限流方式

通過檢視nginx官方文件,小弟檢視到了三種nginx限流方式。前兩種只能對客戶端 即單一ip限流 並且文件也很全,但是經過測試發現,還是無法達到官方文件所說的結果 可能小弟的測試方法有問題 這裡先簡單的介紹一下前兩種 1 limit conn zone 1.1nginx配置 其中 limit co...

三種常見的排序演算法

剛開始的時候也聽過學長說什麼什麼排序之類的,到剛聽得時候是各種姿勢懵逼啊,學習了一段時間的c語言之後,才有點明白所謂的排序是什麼,現在就來羅列一下三種常用的排序法氣泡排序法,插入排序法和選擇排序法。氣泡排序啊,這是我聽過最多的乙個排序方法了,他的基本思想也比較簡單,就是不斷比較相鄰的兩個數,讓較小的...