限流在實際使用場景中應(yīng)用十分廣泛,尤其針對并發(fā)場景下的高并發(fā),為了保證系統(tǒng)的可用性谴麦,我們需要采取一些限流措施降級蠢沿,以防止非預(yù)期的請求對系統(tǒng)壓力過大而引起的系統(tǒng)癱瘓。
對于過量的請求一般的措施就是丟掉多余的請求匾效,或者讓請求排隊搏予,再或者引流
下面說下常用的限流方式:
1.計數(shù)器方法
比如在1分鐘內(nèi)限制請求次數(shù)不超過100,那我們定義一個變量counter弧轧,每來一個請求則counter加1雪侥,如果在一分鐘之內(nèi)counter累計超過100,新來的請求則超過限制精绎。然后速缨,超過1s之后,這個counter就重置代乃。這是比較簡單的計數(shù)器法旬牲;
但是這種方法會有一個問題,那就是比如某個人在0:59秒的時候打了100個請求過來搁吓,然后原茅,在1min的時候counter就置零了,他又在1:01的時候打了100個請求過來堕仔,所以說擂橘,在最近的1min之內(nèi)其實是接收到200個請求,這明顯超出了我們的預(yù)期摩骨,所以說這種方法不滿足我們的需求通贞。
聰明的小伙伴一眼就能看出問題所在,其實是我們統(tǒng)計的精度太低了恼五,于是就引出下面的滑動窗口計數(shù)法昌罩;
2.滑動窗口
比如我們把1min劃分成6個小格,則每10s為一個分割單位灾馒,比如在0:35分鐘來了100個請求茎用,則會落在0:30-0:39這個區(qū)間內(nèi),當(dāng)1:01再來100個請求時睬罗,顯然轨功,最近1分鐘內(nèi)的請求次數(shù)超過了100,那么這100個請求則被限制住了傅物,這種是符合我們的預(yù)期夯辖。但是滑動窗口對存儲有比較大的需求,尤其在窗口比較小的情況下不滿足需求董饰。
3.漏桶算法
漏桶算法的思路就是蒿褂,水(請求)先進(jìn)入漏桶里圆米,漏桶以一定的速度出水(接口響應(yīng)時間),當(dāng)水流入速度(接口請求的速度)越來越大時啄栓,漏桶就會溢出娄帖,然后新來的請求就會被拒絕。無論請求量多大昙楚,漏洞的出水速率是不變的近速,所以針對突發(fā)的大流量場景,這種方案是不支持的堪旧。
4.令牌桶算法
令牌桶算法是我們?nèi)粘J褂帽容^多的方案削葱,它的基本方案是:系統(tǒng)以恒定速率向桶里放入令牌,淳梦,如果桶滿了則不加析砸。當(dāng)請求來的時候,從桶里拿走一個令牌爆袍,如果桶里沒有令牌則阻塞或者拒絕新的請求首繁。令牌桶的另外一個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率.?
可以參考RateLimiter類來進(jìn)行實際應(yīng)用。