高併發之限流令牌桶和漏桶演算法(一)

2022-03-10 22:13:43 字數 1247 閱讀 1866

在開發高併發系統時有三把利器用來保護系統:快取、降級和限流

漏桶演算法思路很簡單,水(請求)先進入到漏桶裡,漏桶以一定的速度出水,當水流入速度過大會直接溢位,可以看出漏桶演算法能強行限制資料的傳輸速率。

下面時偽**:

public

class

tokenbucketdemo

else}}

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

對於很多應用場景來說,除了要求能夠限制資料的平均傳輸速率外,還要求允許某種程度的突發傳輸。這時候漏桶演算法可能就不合適了,令牌桶演算法更為適合。如圖所示,令牌桶演算法的原理是系統會以乙個恆定的速度往桶裡放入令牌,而如果請求需要被處理,則需要先從桶裡獲取乙個令牌,當桶裡沒有令牌可取時,則拒絕服務。

令牌桶演算法圖例

a. 按特定的速率向令牌桶投放令牌

b. 根據預設的匹配規則先對報文進行分類,不符合匹配規則的報文不需要經過令牌桶的處理,直接傳送;

c. 符合匹配規則的報文,則需要令牌桶進行處理。當桶中有足夠的令牌則報文可以被繼續傳送下去,同時令牌桶中的令牌 量按報文的長度做相應的減少;

d. 當令牌桶中的令牌不足時,報文將不能被傳送,只有等到桶中生成了新的令牌,報文才可以傳送。這就可以限制報文的流量只能是小於等於令牌生成的速度,達到限制流量的目的。

注意:當令牌不足時,這裡報文:

1、可以被丟棄

2、可以排放在佇列中以便當令牌桶中累積了足夠多的令牌時再傳輸

3、可以繼續傳送,但需要做特殊標記,網路過載的時候將這些特殊標記的包丟棄

偽**:

public

class

tokenbucketdemo

else}}

令牌桶演算法臨界問題思考:

場景:在0:59秒的時候有100個請求過來,此時令牌桶有100個token,瞬間通過。1:00的時候又有100個請求,但令牌放入令牌桶是有一定的速率的,假設rate<100,不可能100個請求都通過。避免了計數器演算法瞬間請求過大,壓垮系統。

令牌桶和漏桶對比:

參考:

限流演算法之漏桶演算法 令牌桶演算法

每個api介面都是有訪問上限的,當訪問頻率或者併發量超過其承受範圍時候,我們就必須考慮限流來保證介面的可用性或者降級可用性。即介面也需要安裝上保險絲,以防止非預期的請求對系統壓力過大而引起的系統癱瘓。通常的策略就是拒絕多餘的訪問,或者讓多餘的訪問排隊等待服務,或者引流。如果要準確的控制qps,簡單的...

限流演算法之漏桶演算法 令牌桶演算法

每個api介面都是有訪問上限的,當訪問頻率或者併發量超過其承受範圍時候,我們就必須考慮限流來保證介面的可用性或者降級可用性。即介面也需要安裝上保險絲,以防止非預期的請求對系統壓力過大而引起的系統癱瘓。通常的策略就是拒絕多餘的訪問,或者讓多餘的訪問排隊等待服務,或者引流。如果要準確的控制qps,簡單的...

常用的限流演算法 漏桶和令牌桶演算法

常用的限流演算法有兩種 漏桶演算法和令牌桶演算法。漏桶演算法與令牌桶演算法在表面看起來類似,很容易將兩者混淆。但事實上,這兩者具有截然不同的特性,且為不同的目的而使用。漏桶演算法與令牌桶演算法的區別在於 l 漏桶演算法能夠強行限制資料的傳輸速率。l 令牌桶演算法能夠在限制資料的平均傳輸速率的同時還允...