1. 程式人生 > >常用的限流算法

常用的限流算法

緩沖 bucket 允許 icp 流量整形 使用計數 時間段 線程池 進行

  常用的限流算法大致有三種:令牌桶算法,漏桶算法,計數器算法

令牌桶算法

  令牌桶算法是一個存放固定容量令牌的桶,按照固定速率往桶裏添加令牌。令牌桶算法的描述如下:

  1.假設限制2r/s,則按照500毫秒的固定速率往桶中添加令牌

  2.桶中最多存放b個令牌,當桶滿時,新添加的令牌被丟棄或拒絕

  3.當一個n個字節大小的數據包到達,將從桶中刪除n個令牌,接著數據包被發送到網絡上

  4.如果桶中的令牌不足n個,則不會刪除令牌,且該數據包將被限流(要麽丟棄,要麽緩沖區等待)

漏桶算法

  漏桶作為計量工具(The Leaky Bucket Algorithm as a Meter)時,可以用於流量整形(Traffic Shaping)和流量控制(TrafficPolicing),漏桶算法的描述如下:

  1.一個固定容量的漏桶,按照常量固定速率流出水滴

  2.如果桶是空的,則不需流出水滴

  3.可以以任意速率流入水滴到漏桶

  4.如果流入水滴超出了桶的容量,則流入的水滴溢出了(被丟棄),而漏桶容量是不變的

  有時候我們還使用計數器來進行限流,主要用來限制總並發數,比如數據庫連接池、線程池、秒殺的並發數;只要全局總請求數或者一定時間段的總請求數設定的閥值則進行限流,是簡單粗暴的總數量限流,而不是平均速率限流。

令牌桶和漏桶對比:

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

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

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

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

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

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

常用的限流算法