令牌桶和漏桶

轉自: http://www.cnblogs.com/shanyou/p/4280546.html


在早期的計算機領域,限流技術(time limiting)被用作控制網絡接口收發通信數據的速率。 可以用來優化性能,減少延遲和提高帶寬等。 現在在互聯網領域,也借鑑了這個概念, 用來爲服務控制請求的速率, 如果雙十一的限流, 12306的搶票等。 即使在細粒度的軟件架構中,也有類似的概念。

兩種常用算法

令牌桶(Token Bucket)和漏桶(leaky bucket)是 最常用的兩種限流的算法。

漏桶算法

它的主要目的是控制數據注入到網絡的速率,平滑網絡上的突發流量。漏桶算法提供了一種機制,通過它,突發流量可以被整形以便爲網絡提供一個穩定的流量。 漏桶可以看作是一個帶有常量服務時間的單服務器隊列,如果漏桶(包緩存)溢出,那麼數據包會被丟棄。 用說人話的講:

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

在某些情況下,漏桶算法不能夠有效地使用網絡資源。因爲漏桶的漏出速率是固定的參數,所以,即使網絡中不存在資源衝突(沒有發生擁塞),漏桶算法也不能使某一個單獨的流突發到端口速率。因此,漏桶算法對於存在突發特性的流量來說缺乏效率。而令牌桶算法則能夠滿足這些具有突發特性的流量。通常,漏桶算法與令牌桶算法可以結合起來爲網絡流量提供更大的控制。

令牌桶算法

令牌桶算法的原理是系統會以一個恆定的速度往桶裏放入令牌,而如果請求需要被處理,則需要先從桶裏獲取一個令牌,當桶裏沒有令牌可取時,則拒絕服務。 令牌桶的另外一個好處是可以方便的改變速度。 一旦需要提高速率,則按需提高放入桶中的令牌的速率。 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種算法則實時的計算應該增加的令牌的數量, 比如華爲的專利"採用令牌漏桶進行報文限流的方法"(CN 1536815 A),提供了一種動態計算可用令牌數的方法, 相比其它定時增加令牌的方法, 它只在收到一個報文後,計算該報文與前一報文到來的時間間隔內向令牌漏桶內注入的令牌數, 並計算判斷桶內的令牌數是否滿足傳送該報文的要求。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章