為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/ShiJiaqi。
https://www.cnblogs.com/shijiaqi1066/p/10508115.html
計數器算法
在一定時間內,對處理的請求數進行計數,每次到達時間臨界點則計數器清零。在一定時間間隔內,若計數器數字超限,則進行限流。
該算法的問題是,在兩端臨界點附加可能出現兩倍的流速。
滑動窗口算法
基於計數器算法那,把時間間隔分片。例如服務限流每秒處理100個請求,把1秒分為10個窗口。每100毫秒移動一次,內存中保留每次的請求次數。每次移動判斷一下總次數是否超限。
當滑動窗口的格子划分的越多,滑動窗口的滾動就越平滑,限流的統計就會越精確。
滑動窗口算法可以有效規避計數器算法中時間臨界點問題。但實現起來相對比較復雜。
Hystrix的限流基於滑動窗口算法實現。
令牌桶算法
系統已一個恆定的速率往桶放入令牌。若有請求需要處理,則從令牌桶里獲取令牌,當桶里沒有令牌,則拒絕服務。
令牌桶算法並不能實際的控制速率。比如,10秒往桶里放入10000個令牌桶,即10秒內只能處理10000個請求,那么qps就是100。但這種模型可以出現1秒內把10000個令牌全部消費完,即qps為10000。所以令牌桶算法實際是限制的平均流速。具體控制的粒度以放令牌的間隔和每次的量來決定。若想要把流速控制的更加穩定,就要縮短間隔時間。
Google Guava中的RateLimter就是利用的令牌桶原理。
漏桶算法
水滴先進入漏桶,漏桶以一定速度向外出水。當水流入速度過大,桶會直接溢出。
即Request進入一個固定容量的Queue,若Queue滿,則拒絕新的Request,可以阻塞,也可以拋異常。
這種模型其實非常類似MQ的思想,利用漏桶削峰填谷,使得Queue的下游具有一個穩定流量。
為了防止無良網站的爬蟲抓取文章,特此標識,轉載請注明文章出處。LaplaceDemon/ShiJiaqi。