限流算法之令牌桶法(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.


分享到:


相關文章: