限速是大型服務裡面必備的功能,目的是對併發控制和請求進行限速來保護系統,讓系統不會因為單位時間內的請求數量太大,被打爆。對於超過了限速的那些請求,處理方法往往是:直接拒絕服務,排隊等待,或者降級處理。
對於限速來說,最常用的兩個演算法是:令牌桶演算法和漏桶演算法,下面我們便來看下它們是怎麼回事。
一、令牌桶:
令牌桶這種控制機制基於令牌桶中是否存在令牌來指示什麼時候可以傳送流量。令牌桶中的每乙個令牌都代表乙個位元組(對於流量整形來說代表乙個bit,就traffic policing來講代表乙個byte。)。如果令牌桶中存在令牌,則允許傳送流量;而如果令牌桶中不存在令牌,則不允許傳送流量。因此,如果突發門限被合理地配置並且令牌桶中有足夠的令牌,那麼流量就可以以峰值速率傳送。
令牌桶的工作過程:
1.令牌根據時間勻速的產生令牌數量,這裡假設是r,存入到令牌桶中.
2.令牌桶在初始化的時候,會分配一定數量的令牌數capicity。
3.訊息到來之後,會從令牌桶裡面取出令牌消費掉,這裡假設是d,如果獲取不到令牌的話,就直接觸發限速保護策略,往往是直接丟棄。
當前時間t內可以消費的令牌數量為:
當前令牌桶剩餘的令牌數(這裡最大是capicity) + r*t
二、漏桶
漏桶可以看作是乙個帶有常量服務時間的單伺服器佇列,如果漏桶(包快取)溢位,那麼資料報會被丟棄。
漏桶演算法強制乙個常量的輸出速率而不管輸入資料流的突發性。當輸入空閒時,該演算法不執行任何動作。
漏斗有乙個入水口,乙個出水口,出水口按照一定的速率出水,並且有乙個最大出水速率。
1.入水速率小於等於出水速率的時候,漏斗內不會積水;
2.入水速率大於出水速率的時候,漏斗內會存在積水。
在漏斗內有水的情況下:
出水口按照最大速率出水;
漏斗未滿的情況下,多出來的水會存在漏斗中;
漏斗滿了的話,還有水進入漏斗,水會溢位。
三、兩種演算法的區別
這兩種演算法的主要區別在於「漏桶演算法」能夠強行限制資料的傳輸速率,而「令牌桶演算法」在能夠限制資料的平均傳輸資料外,還允許某種程度的突發傳輸。在「令牌桶演算法」中,只要令牌桶中存在令牌,那麼就允許突發地傳輸資料直到達到使用者配置的門限,因此它適合於具有突發特性的流量。
漏桶演算法和令牌桶演算法
漏桶演算法 水 請求 先進入漏桶裡,漏桶以一定的速度出水 介面迴圈去獲取請求 當水流入速度過大會直接溢位,然後拒絕請求。可見這裡有兩個變數,乙個是桶的大小,支援流量最大時可以存放多少的水 請求 另乙個是水桶漏洞的大小,在某些情況下,漏桶演算法不能有效地使用網路資源,因為漏桶的漏出速率是固定的引數,所...
漏桶演算法與令牌桶演算法
漏桶演算法 leaky bucket 是網路世界中流量整形 traffic shaping 或速率限制 rate limiting 時經常使用的一種演算法,它的主要目的是控制資料注入到網路的速率,平滑網路上的突發流量。漏桶演算法提供了一種機制,通過它,突發流量可以被整形以便為網路提供乙個穩定的流量。...
令牌桶演算法在限速中的應用
令牌桶中有初始容量,每來乙個請求從桶中獲取乙個令牌,並且在一定時間間隔中可以生成令牌,多餘的令牌被丟棄。可以實現限速功能。主要針對不同使用者的請求進行限速,如果單獨使用google的ratelimiter可以控制請求的速率,如果超過限定的速率則進行等待,但是無法獲取使用者的請求速率。如果下可以根據不...