如何將接口進行限流


1、計算器算法

采用計數器實現限流有點簡單粗暴,一般我們會限 制一秒鍾的能夠通過的請求數,比如限流qps為100,算法的實現思路就是從第一個請求進來開始計時,在接下去的1s內,每來一個請求,就把計數加1,如果累加的數字達到了100,那么后續的請求就會被全部拒絕。等到1s結束后,把計數恢復成0,重新開始計數。

 

具體的實現可以是這樣的:對於每次服務調用,可以通過 AtomicLong#incrementAndGet()方法來給計數器加1並返回最新值,通過這個最新值和閾值進行比較。

 

這種實現方式,相信大家都知道有一個弊端:如果我在單位時間1s內的前10ms,已經通過了100個請求,那后面的990ms,只能眼巴巴的把請求拒絕,我們把這種現象稱為“突刺現象”

2、漏桶算法

為了消除"突刺現象",可以采用漏桶算法實現限流,漏桶算法這個名字就很形象,算法內部有一個容器,類似生活用到的漏斗,當請求進來時,相當於水倒入漏斗,然后從下端小口慢慢勻速的流出。不管上面流量多大,下面流出的速度始終保持不變。

 

不管服務調用方多么不穩定,通過漏桶算法進行限流,每10毫秒處理一次請求。因為處理的速度是固定的,請求進來的速度是未知的,可能突然進來很多請求,沒來得及處理的請求就先放在桶里,既然是個桶,肯定是有容量上限,如果桶滿了,那么新進來的請求就丟棄。


在算法實現方面,可以准備一個隊列,用來保存請求,另外通過一個線程池定期從隊列中獲取請求並執行,可以一次性獲取多個並發執行。

這種算法,在使用過后也存在弊端:無法應對短時間的突發流量。

3、令牌桶算法

從某種意義上講,令牌桶算法是對漏桶算法的一種改進,桶算法能夠限 制請求調用的速率,而令牌桶算法能夠在限 制調用的平均速率的同時還允許一定程度的突發調用。

 

在令牌桶算法中,存在一個桶,用來存放固定數量的令牌。算法中存在一種機制,以一定的速率往桶中放令牌。每次請求調用需要先獲取令牌,只有拿到令牌,才有機會繼續執行,否則選擇選擇等待可用的令牌、或者直接拒絕。

 

放令牌這個動作是持續不斷的進行,如果桶中令牌數達到上限,就丟棄令牌,所以就存在這種情況,桶中一直有大量的可用令牌,這時進來的請求就可以直接拿到令牌執行,比如設置qps為100,那么限流器初始化完成一秒后,桶中就已經有100個令牌了,這時服務還沒完全啟動好,等啟動完成對外提供服務時,該限流器可以抵擋瞬時的100個請求。所以,只有桶中沒有令牌時,請求才會進行等待,最后相當於以一定的速率執行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM