1. 程式人生 > >限流(一)限流算法

限流(一)限流算法

常常 最重要的 img 參數 tar 特技 alt AR 容器

在高並發系統中,我們常常提到的幾個詞匯“緩存”,“限流”,“降級”等。本文涉及到的是其中“限流”的部分,顧名思義,限流是一種限制流量的手段(我們可以粗粒度地理解為,限制請求的數量或者速度)。

在限流特技中,常見的限流算法有兩種:

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

限流(一)限流算法