限流演算法
一、什麼是限流:
限制流量請求的頻率(每秒處理多少個請求)。一般來說,當請求流量超過系統的瓶頸,則丟棄掉多餘的請求流量,保證系統的可用性。
二、解決的問題:
高併發情況下,保證系統的可用性,不會被擊垮。
三、目前主流的兩種限流演算法:
1、漏桶限流演算法;
2、令牌桶限流演算法。
四、漏桶限流演算法:
不論流量流入的情況如何,流量流出按照一定的頻率。如果流入過大的流量,超過桶的大小,則丟棄掉多餘的流量。
優點:保證的流量流入頻率,原理簡單。
缺點:無法應對突發的大流量。因為流出的是固定頻率,其他流量只是放在桶中,並沒有流出。
五、令牌桶限流演算法:
令牌桶演算法是按照恆定速率往桶中放入令牌,每當一個請求進入的時候需要消耗一個或多個令牌。當令牌數為0的時候,請求會被阻塞或者拋棄。當生產速度高於消費速度,桶滿了就不會再增加令牌了。
優點:保證的流量流入頻率,同時可以應對突然的大流量(比如當桶中的令牌比較多的時候,就可以同時給很多請求發出令牌,從而保證突然大流量的處理)。相對漏桶演算法更高階。
缺點:演算法相對複雜。
六、總結:
漏桶保證流量流出的頻率。後續服務只需要支援最大請求量:漏桶流出頻率。
令牌桶只是保證令牌的產生頻率。後續服務只需要支援最大請求量:桶最大值的流出頻率。
(1)當令牌消費速度遠遠高於產生速度時(桶中令牌基本處於空的狀態),漏桶演算法效果基本一樣,保證流量流出的頻率;
(2)當令牌消費速度小於產生速度時(桶中令牌會變多直至填滿),這時就可以應對突發的大流量請求,但是後續的服務要能支撐起桶大小請求量的極端請求情況。
七、使用場景:
漏桶演算法、令牌桶演算法,其實無所謂哪個更好,要看適用的場景。
當需要處理突然的大流量的時候,令牌桶演算法更適用;
當只需要保證系統的單位時間流量、或者更注重系統的穩定性的時候,漏桶演算法更適用。