限流算法实现



原理介绍

Leaky Bucket 与 Token Bucket 算法

实现方式

1. 简单实现,无burst控制

public enum APIRateLimiter {
    
    long minIntervalMilis;
    private AtomicLong lastRequestTime = new AtomicLong(0);

    public boolean acquire() {
        int maxAttempts = 5;
        while (maxAttempts-- > 0) {
            long lastRequestMils = lastRequestTime.longValue();
            long awaitTime = minIntervalMilis - (System.currentTimeMillis() - lastRequestMils);
            if (awaitTime > 0) {
                try {
                    //Log.out("sleep %s mili seconds to aquire lease ...", awaitTime);
                    Thread.sleep(awaitTime);                    
                } catch (InterruptedException e) {
                }
            } else {
                if (lastRequestTime.compareAndSet(lastRequestMils, System.currentTimeMillis())) {
                    return true;
                }
            }
        }
        return false;
    }
}

2. 有burst控制

Google Guava中的RateLimiter,实际上就实现了Token Bucket的算法。Google搜索看到有些开源项目的issues,要把自己写的Limiter换成了它。

它支持两种获取permits接口,一种是如果拿不到立刻返回false,一种会阻塞等待一段时间看能不能拿到。

Leacky Bucket算法默认一开始水桶是空的,可以立即就接收最多burst的请求,而Token Bucket就要设置初始Token的数量。
RateLimiter有两个子类,一个是WarmingUp,一个是Bursty。

  • WarmingUp,burst = warmUp时间/固定token添加间隔,初始token数量 = burst,有算法保证系统总是相对平滑。
  • Bursty, burst = rate或另外的参数设置,初始token数量 = 0 ,当系统冷了一段时间,支持突发到burst。

Guava以micros为时间单位,计算token的变化。


参考文章

https://github.com/springside/springside4/wiki/Rate-Limiter

http://xiaobaoqiu.github.io/blog/2015/07/02/ratelimiter/



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值