乙個基於使用者的API限流策略 Rate Limit

2021-08-28 07:14:09 字數 1374 閱讀 2749

在開發高併發系統時,有很多種方法可用來保護系統:快取、降級、限流等。

限流不能亂用,否則正常流量會出現一些奇怪的問題,從而導致使用者抱怨。

常見限流演算法:技術器、令牌桶和漏桶演算法。

計數器是最簡單粗暴的演算法。例如:乙個服務每秒能處理100個請求。設定乙個1s的滑動視窗,視窗有10個格仔,每個格仔100ms,每100ms移動一次,每次移動都記錄當前服務請求的次數。記憶體中儲存最近10次的次數(linkedlist)。格仔每次移動的時候判斷一次,最後乙個格仔和第乙個格仔的次數是否相差100,如果超過,則進行限流。

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

計數器的實現簡單,但是是平均分配1秒鐘的請求,然而實際情況中的請求往往是動態的,流量不平滑的。

令牌桶演算法是乙個存放固定容量令牌(token)的桶,按照固定速率往桶裡新增令牌。令牌桶的主要概念如下:

令牌桶根據放令牌的速率(r tokens/s)去控制輸出的速率(to network)

令牌桶的另外乙個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種演算法則實時的計算應該增加的令牌的數量.

漏桶(leaky bucket)演算法思路很簡單,水(請求)先進入到漏桶裡,漏桶以一定的速度出水(介面有響應速率),當水流入速度過大會直接溢位(訪問頻率超過介面響應速率),然後就拒絕請求,可以看出漏桶演算法能強行限制資料的傳輸速率。

漏桶作為計量工具時,可用於流量整形和流量控制,漏桶的主要概念如下:

漏桶可以看做固定容量、固定流出速率的佇列,漏桶限制的是請求的流出速率,漏桶中裝的是請求

因為漏桶的漏出速率是固定的引數,所以,即使網路中不存在資源衝突(沒有發生擁塞),漏桶演算法也不能使流突發(burst)到埠速率.因此,漏桶演算法對於存在突發特性的流量來說缺乏效率.

令牌桶漏桶

請求何時拒絕

固定速率往桶中新增令牌,如果桶中令牌不夠,則拒絕新請求

流入請求速率任意,常量固定速率流出請求。當流入請求數積累到漏桶容量時,則拒絕新請求

速率限制

限制平均流入速率,允許一定程度的突發請求(支援一次拿多個令牌)

限制常量流出速率(流出速率是固定值),從而平滑突發流入速率

參考:基於redis的限流系統的設計

乙個API攔截的例子

閒來無事,做乙個api攔截的簡單程式,目標是攔截exploer.exe的createprocess.當開啟桌面程式時,執行自定義的 首先需要確認的是,explorer.exe建立程序是用了什麼函式,建立程序自然想到用createprocess createprocessa,createprocess...

實現乙個jQuery的API

一.首先 var div div div.addclass red 可將所有 div 的 class 新增乙個 red div.settext hi 可將所有 div 的 textcontent 變為 hijquery本質上就是乙個建構函式,我們需要給它輸入引數,就可以返回對應引數的jquery例項...

實現乙個jquery的api

新增多個classname的函式 nodes.addclass function classes 定義乙個偽陣列,用來存要操作的節點 if nodeorselector string 如果傳的是字串,則用選擇器去查詢 如果傳入的值是節點,返回的nodes也寫成偽陣列的形式 nodes.addclas...