漏桶和令牌桶算法差異及適用場景


漏桶算法與令牌桶算法在表面看起來相似,很容易將二者混淆。但事實上,這二者具備大相徑庭的特性,且爲不一樣的目的而使用。漏桶算法與令牌桶算法的區別在於:l 漏桶算法可以強行限制數據的傳輸速率。l 令牌桶算法可以在限制數據的平均傳輸速率的同時還容許某種程度的突發傳輸。須要說明的是:在某些狀況下,漏桶算法不可以有效地使用網絡資源。由於漏桶的漏出速率是固定的,因此即便網絡中沒有發生擁塞,漏桶算法也不能使某一個單獨的數據流達到端口速率。所以,漏桶算法對於存在突發特性的流量來講缺少效率。而令牌桶算法則可以知足這些具備突發特性的流量。一般,漏桶算法與令牌桶算法結合起來爲網絡流量提供更高效的控制。
算法

1、問題描述  

某天A君忽然發現本身的接口請求量忽然漲到以前的10倍,沒多久該接口幾乎不可以使用,並引起連鎖反應致使整個系統崩潰。如何應對這種狀況呢?生活給了咱們答案:好比老式電閘都安裝了保險絲,一旦有人使用超大功率的設備,保險絲就會燒斷以保護各個電器不被強電流給燒壞。同理咱們的接口也須要安裝上「保險絲」,以防止非預期的請求對系統壓力過大而引發的系統癱瘓,當流量過大時,能夠採起拒絕或者引流等機制。 後端

2、經常使用的限流算法

      經常使用的限流算法有兩種:漏桶算法和令牌桶算法。微信

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


圖1 漏桶算法示意圖架構

      對於不少應用場景來講,除了要求可以限制數據的平均傳輸速率外,還要求容許某種程度的突發傳輸。這時候漏桶算法可能就不合適了,令牌桶算法更爲適合。如圖2所示,令牌桶算法的原理是系統會以一個恆定的速度往桶裏放入令牌,而若是請求須要被處理,則須要先從桶裏獲取一個令牌,當桶裏沒有令牌可取時,則拒絕服務。spa

圖2 令牌桶算法示意圖.net

 

並不能說明令牌桶必定比漏洞好,她們使用場景不同。令牌桶能夠用來保護本身,主要用來對調用者頻率進行限流,爲的是讓本身不被打垮。因此若是本身自己有處理能力的時候,若是流量突發(實際消費能力強於配置的流量限制),那麼實際處理速率能夠超過配置的限制。而漏桶算法,這是用來保護他人,也就是保護他所調用的系統。主要場景是,當調用的第三方系統自己沒有保護機制,或者有流量限制的時候,咱們的調用速度不能超過他的限制,因爲咱們不能更改第三方系統,因此只有在主調方控制。這個時候,即便流量突發,也必須捨棄。由於消費能力是第三方決定的。orm

總結起來:若是要讓本身的系統不被打垮,用令牌桶。若是保證被別人的系統不被打垮,用漏桶算法。blog

本文分享自微信公衆號 - 互聯網後端架構(fullstack888)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。接口

相關文章
相關標籤/搜索