大家都知道目前的常規的限流演算法有令牌桶和漏桶演算法.今天就這些限流常見的演算法給大家做乙個詳細的介紹與實現思路.這個演算法是最為簡單的乙個演算法,redis儲存key和value,key是任意的,value代表一秒內請求的值,設定乙個計時器每個一秒鐘將限流的key設定為0.
當有請求來臨時執行incr key,key超出了一定值後進行限流.
tcp就是使用的滑動視窗策略來限制傳送的速率.但是tcp的滑動視窗是基於傳送和接收的包的大小來限制傳送的速率.
我們根據其思想可以改為基於時間的滑動視窗.限制1s內最多請求多少次,且是滑動的.
設定兩個邊界:視窗大小設定為n
,視窗的左邊界left
右邊界right
.
固定且不可改變,在設定乙個指標point
.
point
指標和right
重合代表視窗關閉.
point
指標和left
指標重合代表視窗內沒有流量.不能超過left
和right
邊界.
根據業務請求量設定每隔x
秒point
指標向左移動1次.當有請求進入時point
指標向右移動1次.達到n
次後視窗關閉.
滑動視窗限流也可以避免漏桶出現的無法應對順時大流量的請求.
除此之外我們還可以設計一種可伸縮的視窗,根據不同的環境不同的時間對視窗進行縮放擴大,或者是提高降低point指標移動的速率.
漏桶演算法:入桶的速率可以不定,但是出桶的速率是恆定的.
實現很簡單的我們可以用佇列實現,按照固定頻次從佇列裡消費資料.
漏桶演算法可以很方便的將併發請求的大流量,轉換為平滑的流量.
當然我們需要額外的儲存空間儲存請求的資料.不像下述的演算法,只是限制流量不會做流量的整形.
按照一定的速率將令牌放入到桶當中,當請求來臨時先從桶獲取令牌,如果拿到了令牌則繼續請求,否則不執行請求.
桶滿後新增令牌被丟棄.
桶空或者桶滿後根據業務需要可以適當進行擴大和縮小.
令牌桶互動流程比較複雜,實現需要額外的一些令牌的儲存空間,漏桶演算法沒有那麼靈活且需要儲存等待處理請求的資訊.在面對較大的瞬時流量時,令牌桶和滑動視窗演算法有著很好的優勢,可以較好的應對瞬時流量,流量也可以瞬時傳輸,對於漏桶而言瞬時的大流量卻只能平均速率傳輸,因為輸出的速率是恆定的.
時間間隔的演算法沒有那麼平滑,時間滑動視窗演算法實現簡單且平滑,可以瞬時傳輸較大流量,不需要額外的儲存空間.
限流演算法 三種思路
限流演算法 常見的限流演算法有 令牌桶 漏桶 計數器。令牌桶限流 令牌桶是乙個存放固定容量令牌的桶,按照固定速率往桶裡新增令牌,填滿了就丟棄令牌,請求是否被處理要看桶中令牌是否足夠,當令牌數減為零時則拒絕新的請求。令牌桶允許一定程度突發流量,只要有令牌就可以處理,支援一次拿多個令牌。令牌桶中裝的是令...
限流和限流演算法
目錄 一 什麼是限流 二 為什麼需要限流 三 那些場景需要用到限流 3.1 對外服務 3.2 對內服務 四 限流演算法 4.1 計數器演算法 4.2 漏桶演算法 4.3 令牌桶演算法 限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務...
高併發處理思路與手段(五) 應用限流
限流不能亂用,否則正常流量會出現一些奇怪的問題,從而導致使用者抱怨。假設有130w到140w的資料插入到資料庫中,如果沒有做限流,資料庫的主庫會突然接收到130w的插入操作。首先是網路上的開銷,很可能直接把頻寬佔滿,導致其他請求無法正常傳輸和處理,其次會是資料庫的負載突然增高,導致無法處理某些資料庫...