前面2篇說過限速算法,可以參考以下:
令牌桶算計介紹
今天簡單解釋另一種令牌桶法,系統會以一定的速率往桶裡添加令牌,處理請求前,則需要先從桶裡獲取一個令牌,當桶裡沒有令牌可取時,則返回失敗。
大概描述如下:
- 所有的請求在處理之前都需要拿到一個可用的令牌才會被處理;
- 獲取不到令牌,則請求返回失敗
- 根據限流大小,設置按照一定的速率往桶裡添加令牌;
- 桶設置最大的放置令牌限制,當桶滿時、新添加的令牌就被丟棄或者拒絕;
下面就是一個簡單的示意圖:
實現一個簡單的令牌桶算法
實現關鍵點:
- 初始化固定數量的令牌放入令牌桶中
- 初始化和開啟一個定時的任務,定時往令牌桶添加令牌
- 提供一個獲取令牌的方法,獲取一個令牌,令牌桶中減一,如果令牌桶中為空,返回失敗
還是說幹就幹,以下就是簡單的實現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.