滑动窗口限流 java_限流算法之令牌桶法(Java实现)

6d375d6869c9712b45959d34ed895c7d.png

限流算法之令牌桶法(Java实现)

前面2篇说过限速算法,可以参考以下:

限流算法之计数器算法(Java实现)

限流算法之滑动窗口法(Java实现)

令牌桶算计介绍

今天简单解释另一种令牌桶法,系统会以一定的速率往桶里添加令牌,处理请求前,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则返回失败。

大概描述如下:

  • 所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
  • 获取不到令牌,则请求返回失败
  • 根据限流大小,设置按照一定的速率往桶里添加令牌;
  • 桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;

下面就是一个简单的示意图:

2404083506718de5bc81d5edd7f5ca9d.png

令牌桶算法示意图

实现一个简单的令牌桶算法

实现关键点:

  1. 初始化固定数量的令牌放入令牌桶中
  2. 初始化和开启一个定时的任务,定时往令牌桶添加令牌
  3. 提供一个获取令牌的方法,获取一个令牌,令牌桶中减一,如果令牌桶中为空,返回失败

还是说干就干,以下就是简单的实现TokenLimiter,

8db7ba01633c8cbae04d72b151ee2d3e.png

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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值