限流算法之令牌桶法(Java實現)

限流算法之令牌桶法(Java實現)

限流算法之令牌桶法(Java實現)

前面2篇說過限速算法,可以參考以下:

限流算法之計數器算法(Java實現)

限流算法之滑動窗口法(Java實現)

令牌桶算計介紹

今天簡單解釋另一種令牌桶法,系統會以一定的速率往桶裡添加令牌,處理請求前,則需要先從桶裡獲取一個令牌,當桶裡沒有令牌可取時,則返回失敗。

大概描述如下:

  • 所有的請求在處理之前都需要拿到一個可用的令牌才會被處理;
  • 獲取不到令牌,則請求返回失敗
  • 根據限流大小,設置按照一定的速率往桶裡添加令牌;
  • 桶設置最大的放置令牌限制,當桶滿時、新添加的令牌就被丟棄或者拒絕;

下面就是一個簡單的示意圖:

限流算法之令牌桶法(Java實現)

令牌桶算法示意圖

實現一個簡單的令牌桶算法

實現關鍵點:

  1. 初始化固定數量的令牌放入令牌桶中
  2. 初始化和開啟一個定時的任務,定時往令牌桶添加令牌
  3. 提供一個獲取令牌的方法,獲取一個令牌,令牌桶中減一,如果令牌桶中為空,返回失敗

還是說幹就幹,以下就是簡單的實現TokenLimiter,

限流算法之令牌桶法(Java實現)

TokenLimiter

Google提供的Guava中的SmoothRateLimiter就是用來限流的,算法就是令牌桶算法,有時間分析一下SmoothRateLimiter的實現原理。RateLimiter類的註解如下:

A rate limiter. Conceptually, a rate limiter distributes permits at a configurable rate. Each acquire() blocks if necessary until a permit is available, and then takes it. Once acquired, permits need not be released.


分享到:


相關文章: