限流(一)限流算法
在高並發系統中,我們常常提到的幾個詞匯“緩存”,“限流”,“降級”等。本文涉及到的是其中“限流”的部分,顧名思義,限流是一種限制流量的手段(我們可以粗粒度地理解為,限制請求的數量或者速度)。
在限流特技中,常見的限流算法有兩種:
1)令牌桶算法;
2)漏桶算法;
當然,我們也可以粗暴地采用計數器的方式來進行限流。
一、令牌桶算法
如圖所示:
1、桶裏每秒鐘會產生十個令牌,當然令牌總數不能超過桶的最大容量。
1)令牌產生的速度是均勻的,也就是說系統能夠接收的請求是均勻的,比如每秒鐘接收10個請求。
2)令牌桶表示請求的容納範圍,比如0 - 100個請求。
2、發起一個請求,如果桶裏面有足夠的令牌,那麽該請求就能夠被處理(同時刪除桶裏面的一個令牌),否則被丟棄或者緩存。
1)令牌產生的速度是均勻的,所以接收的請求是均勻的,但是被處理的請求卻不一定均勻。比如,令牌桶裏面有60個令牌,當前這秒鐘有60個請求進來,這時候就會瞬間要處理60個請求。而不是每秒10個請求,所以令牌桶算法是允許瞬間爆發的請求數量的。
2)也就是說,只要令牌桶裏面有足夠的令牌,那麽請求都能夠被處理,令牌桶算法只是限制了請求的接收而不是請求的處理。
二、漏桶算法
如圖:
1、任意數量的請求被發起,進入容器裏面,當然依然不能超過容器的最大值(比如:100個請求);
1)這裏表示,接收請求除了容器最大值,是沒有速度限制的。
2、而容器裏面的請求則是按照固定的速度均勻的被處理(比如每秒處理10個請求);
三、令牌桶和漏桶算法的區別
1、最重要的點在於,令牌桶限制的是流入(接收請求)漏桶限制的是流出(處理請求)。
2、由於漏桶限制的是流出,所以相對令牌桶來說平滑了流入的速率。
3、令牌桶算法允許瞬間爆發,而漏桶算法處理請求的速度永遠是一致的。
4、兩種算法只是實現方案不同,如果參數相同的話,最終限流效果是一樣的。
四、計數器限流
除了以上兩種限速的算法,其實還可以簡單地采用計數器來限數。
只要請求數量達到最大值,那麽就丟棄或者緩存。
計數器限流的方式比較粗暴,因為它不限制流入速度,也不限制流出速度。所以只要未達到最大值它就會接收並處理請求,因此,如果並發情況下,它可能導致系統一定時間段內維持在峰值
參考:
http://jinnianshilongnian.iteye.com/blog/2305117
限流(一)限流算法