限流算法的原理

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

http://www.javashuo.com/article/p-qvsokmha-eb.html 算法

 

 

 

計數器算法

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

img

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

 

滑動窗口算法

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

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

img

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

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

 

令牌桶算法

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

 

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

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

 

漏桶算法

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

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

這種模型其實很是相似MQ的思想,利用漏桶削峯填谷,使得Queue的下游具備一個穩定流量。

 

 

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

http://www.javashuo.com/article/p-qvsokmha-eb.html 

相關文章
相關標籤/搜索