限速之令牌桶和漏桶算法

限速是大型服務裏面必備的功能,目的是對併發控制和請求進行限速來保護系統,讓系統不會由於單位時間內的請求數量太大,被打爆。對於超過了限速的那些請求,處理方法每每是:直接拒絕服務,排隊等待,或者降級處理。
算法


對於限速來講,最經常使用的兩個算法是:令牌桶算法和漏桶算法,下面咱們便來看下它們是怎麼回事。
api


1、令牌桶:緩存


令牌桶這種控制機制基於令牌桶中是否存在令牌來指示何時能夠發送流量。令牌桶中的每個令牌都表明一個字節(對於流量整形來講表明一個bit,就traffic policing來說表明一個byte。)。若是令牌桶中存在令牌,則容許發送流量;而若是令牌桶中不存在令牌,則不容許發送流量。所以,若是突發門限被合理地配置而且令牌桶中有足夠的令牌,那麼流量就能夠以峯值速率發送。服務器

https://baike.baidu.com/item/token%20bucket/4315253微信


令牌桶的工做過程:
1.令牌根據時間勻速的產生令牌數量,這裏假設是r,存入到令牌桶中.
併發

2.令牌桶在初始化的時候,會分配必定數量的令牌數capicity。
ui

3.消息到來以後,會從令牌桶裏面取出令牌消費掉,這裏假設是d,若是獲取不到令牌的話,就直接觸發限速保護策略,每每是直接丟棄。
spa


當前時間t內能夠消費的令牌數量爲:.net

 當前令牌桶剩餘的令牌數(這裏最大是capicity) + r*t 
blog


2、漏桶


漏桶能夠看做是一個帶有常量服務時間的單服務器隊列,若是漏桶(包緩存)溢出,那麼數據包會被丟棄。

漏桶算法強制一個常量的輸出速率而無論輸入數據流的突發性。當輸入空閒時,該算法不執行任何動做。

https://baike.baidu.com/item/%E6%BC%8F%E6%A1%B6%E7%AE%97%E6%B3%95


漏斗有一個入水口,一個出水口,出水口按照必定的速率出水,而且有一個最大出水速率。

    1.入水速率小於等於出水速率的時候,漏斗內不會積水;

    2.入水速率大於出水速率的時候,漏斗內會存在積水。

在漏斗內有水的狀況下:

  1. 出水口按照最大速率出水;

  2. 漏斗未滿的狀況下,多出來的水會存在漏斗中;

  3. 漏斗滿了的話,還有水進入漏斗,水會溢出。


3、兩種算法的區別


這兩種算法的主要區別在於「漏桶算法」可以強行限制數據的傳輸速率,而「令牌桶算法」在可以限制數據的平均傳輸數據外,還容許某種程度的突發傳輸。在「令牌桶算法」中,只要令牌桶中存在令牌,那麼就容許突發地傳輸數據直到達到用戶配置的門限,所以它適合於具備突發特性的流量。



本文分享自微信公衆號 - 灰子學技術(huizixueguoxue)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索