限流算法的原理


為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/ShiJiaqi。

https://www.cnblogs.com/shijiaqi1066/p/10508115.html 

 

 

 

計數器算法

在一定時間內,對處理的請求數進行計數,每次到達時間臨界點則計數器清零。在一定時間間隔內,若計數器數字超限,則進行限流。

img

該算法的問題是,在兩端臨界點附加可能出現兩倍的流速。

 

滑動窗口算法

基於計數器算法那,把時間間隔分片。例如服務限流每秒處理100個請求,把1秒分為10個窗口。每100毫秒移動一次,內存中保留每次的請求次數。每次移動判斷一下總次數是否超限。

當滑動窗口的格子划分的越多,滑動窗口的滾動就越平滑,限流的統計就會越精確。

img

滑動窗口算法可以有效規避計數器算法中時間臨界點問題。但實現起來相對比較復雜。

Hystrix的限流基於滑動窗口算法實現。

 

令牌桶算法

系統已一個恆定的速率往桶放入令牌。若有請求需要處理,則從令牌桶里獲取令牌,當桶里沒有令牌,則拒絕服務。

 

令牌桶算法並不能實際的控制速率。比如,10秒往桶里放入10000個令牌桶,即10秒內只能處理10000個請求,那么qps就是100。但這種模型可以出現1秒內把10000個令牌全部消費完,即qps為10000。所以令牌桶算法實際是限制的平均流速。具體控制的粒度以放令牌的間隔和每次的量來決定。若想要把流速控制的更加穩定,就要縮短間隔時間。

Google Guava中的RateLimter就是利用的令牌桶原理。

 

漏桶算法

水滴先進入漏桶,漏桶以一定速度向外出水。當水流入速度過大,桶會直接溢出。

即Request進入一個固定容量的Queue,若Queue滿,則拒絕新的Request,可以阻塞,也可以拋異常。

這種模型其實非常類似MQ的思想,利用漏桶削峰填谷,使得Queue的下游具有一個穩定流量。

 

 

為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/ShiJiaqi。

https://www.cnblogs.com/shijiaqi1066/p/10508115.html 


免責聲明!

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



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