nodejs接口如何限流?


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

 

 

nodejs接口可以采用下面的幾種方法進行限流:

1、計數器算法
計數器算法是限流算法里最簡單也是最容易實現的一種算法。

比如我們規定,對於A接口來說,我們1分鍾的訪問次數不能超過100個。那么我們可以這么做:在一開 始的時候,我們可以設置一個計數器counter,每當一個請求過來的時候,counter就加1,如果counter的值大於100並且該請求與第一個 請求的間隔時間還在1分鍾之內,那么說明請求數過多;如果該請求與第一個請求的間隔時間大於1分鍾,且counter的值還在限流范圍內,那么就重置 counter,具體算法的示意圖如下:

具體的偽代碼如下:

public class CounterTest { public long timeStamp = getNowTime(); public int reqCount = 0; public final int limit = 100; // 時間窗口內最大請求數 public final long interval = 1000; // 時間窗口ms public boolean grant() { long now = getNowTime(); if (now < timeStamp + interval) { // 在時間窗口內 reqCount++; // 判斷當前時間窗口內是否超過最大請求控制數 return reqCount <= limit; } else { timeStamp = now; // 超時后重置 reqCount = 1; return true; } } public long getNowTime() { return System.currentTimeMillis(); } }

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

從上圖中我們可以看到,假設有一個惡意用戶,他在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格。

由此可見,當滑動窗口的格子划分的越多,那么滑動窗口的滾動就越平滑,限流的統計就會越精確。

廣州品牌設計公司https://www.houdianzi.com

2、令牌桶算法
令牌桶算法是比較常見的限流算法之一,大概描述如下:
1)、所有的請求在處理之前都需要拿到一個可用的令牌才會被處理;
2)、根據限流大小,設置按照一定的速率往桶里添加令牌;
3)、桶設置最大的放置令牌限制,當桶滿時、新添加的令牌就被丟棄或者拒絕;
4)、請求達到后首先要獲取令牌桶中的令牌,拿着令牌才可以進行其他的業務邏輯,處理完業務邏輯之后,將令牌直接刪除;
5)、令牌桶有最低限額,當桶中的令牌達到最低限額的時候,請求處理完之后將不會刪除令牌,以此保證足夠的限流;

 

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


免責聲明!

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



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