高并發(fā)下的限流策略

限流策略通常是用來在高qps下進行流量限制的,常見的方式有計數器、令牌桶、漏桶。在這次活動中我負責的模塊是控制的對下游的流量,我們可以讓那些請求選擇丟棄、等待或者降級這些限流算法可以自行實現也可以利用現有的限流工具,比如說Guava的令牌桶,具體看場景需求吧,下面來看一下這幾種限流策略,再說說我寫的限流方式。

1、計數器限流

這種方式比較粗暴,相當于有一個計數器來控制單秒請求數,也就是qps定義的方式。比如說限流2000,每秒鐘對于計數器進行置0操作,當一秒內到達2000時就不再接受請求了。這樣能保證較長時間短的流量均勻,但是單秒內部實際上是不均勻的,可能這2000個請求,在前0.1s就處理完成了,后面的都是被丟掉的,并且峰值qps 可能是達到2w的。

2、令牌桶限流

令牌桶限流是指我們可以設立一個令牌桶,然后以固定的速率往令牌桶中添加令牌,令牌桶滿則不添加。請求到來時檢查如果令牌桶中有令牌則取走令牌,發(fā)起請求。假設要限定 2000 qps,則1/2000 的速率向令牌桶添加令牌,也可以1/1000 一次性添加兩個令牌,以此類推。令牌桶在持續(xù)高qps 下是沒問題的,可以把流量限制的比較均勻。但是面對突發(fā)流量時,流量桶里是滿的,可能一瞬間把令牌搶空完成請求,這里的問題和計數器限流實際上是一樣的,峰值可能遠遠大于2000,所以對于突發(fā)流量是限不住的。下面看看令牌桶的示意圖:其實我感覺令牌桶更像是優(yōu)化后的計數器限流,只不過時間窗口由1s變的更細了

image.png

3、漏斗限流

這個是使用最多的一種限流算法,通常用來流量整形或者流量控制,看起來和令牌桶比較像,但是差異還是比較大的。漏斗往桶里加的是請求,不是令牌,相當于新請求到達時放到桶中,如果桶滿了則溢出請求,桶以勻速漏出請求進行處理,比如qps 2000,則1/2000 s 漏出一個請求進行處理。這種限流方式比較穩(wěn)定,但是需要維護一個請求隊列或者任務隊列。

image.png

漏斗&令牌桶比較:

  1. 令牌桶是按照固定速率往桶中添加令牌,請求是否被處理需要看桶中令牌是否足夠,當令牌數減為零時則拒絕新的請求;

  2. 漏桶則是按照常量固定速率流出請求,流入請求速率任意,當流入的請求數累積到漏桶容量時,則新流入的請求被拒絕;

  3. 令牌桶限制的是平均流入速率(允許突發(fā)請求,只要有令牌就可以處理,支持一次拿3個令牌,4個令牌),并允許一定程度突發(fā)流量;

  4. 漏桶限制的是常量流出速率(即流出速率是一個固定常量值,比如都是1的速率流出,而不能一次是1,下次又是2),從而平滑突發(fā)流入速率;

  5. 令牌桶允許一定程度的突發(fā),而漏桶主要目的是平滑流入速率;

  6. 兩個算法實現可以一樣,但是方向是相反的,對于相同的參數得到的限流效果是一樣的。

看完幾種限流策略原型之后,放到具體的業(yè)務場景中看算法的選擇及我們需要作出的改動。

業(yè)務端限流:

業(yè)務端做限流的話,請求來源于上有系統(tǒng),流量要求是比較平穩(wěn)的,峰值不能太高,否則可能一瞬間打掛系統(tǒng),令牌桶和計數器方式就不太合適了。因為如果流量直接打到業(yè)務系統(tǒng)我們是沒法進行預估的,大概率會有突發(fā)流量,所以選擇直接使用流量桶就比較合適了。

consumer 控制對下游流量:

我所處的業(yè)務場景是nginx + lua 打入redis 則認為成功,consumer端消費消息,然后持續(xù)固定qps對下游發(fā)起請求。這種場景下,把消費速率&對下游qps控制放在consumer端來做就比較合適了。首先我們從Redis或者日志文件中讀取了數據,并且拼接了請求任務放到任務隊列中。然后線程池從任務隊列中取任務發(fā)起請求,首先我們需要控制加入任務隊列的速率,因為加入的任務隊列的速度大于任務隊列的消費速度,肯定是會導致OOM產生的,

我這里使用的是類似令牌桶的方式,一個線程取n個任務,然后線程內串行,幾個線程并行,這樣就一定程度上保證了不會出現令牌桶的流量不均問題了,同時減少了鎖的爭用。實際上使用漏斗算法也是合適的,但是對于這個場景來說,溢出任務實際上是不太好控制,需要讓請求的加入速率與消費速度相對保持一致,這一點控制不好很容易oom的,所以直接采用任務隊列 + 令牌桶實現是最方便控制也是最容易實現的,采用線程內一次取多個,串行發(fā)起請求的方式是可以一定程度上控制住流量的 實踐證明效果不錯。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容