RateLimiter源码阅读

    俗话说得好,缓存,限流和降级是系统的三把利剑。刚好项目中每天早上导出数据时因调订单接口频率过高,订单系统担心会对用户侧的使用造成影响,让我们对调用限速一下,所以就正好用上了。
    常用的限流算法有2种:漏桶算法和令牌桶算法。

    漏桶算法

    漏桶算法:请求先进入“桶”中,然后桶以一定的速率处理请求。如果请求的速率过快会导致桶溢出。根据描述可以知道,漏桶算法会强制限制请求处理的速度。任你请求的再快还是再慢,我都是以这种速率来处理。
    但是对于很多情况下,除了要求能够限制平均处理速度外,还要求能允许一定程度的的突发情况。这样的话,漏桶算法就不合适了,用令牌桶算法更合适。

     令牌桶算法

    令牌桶算法的原理是:系统以恒定的速率往桶里丢一定数量的令牌,请求只有拿到了令牌才能处理。当桶里没有令牌时便可拒绝服务。
    Guava中的Ratelimiter便是实现的令牌桶算法,同时能支持一定程度的突发请求。

private static RateLimiter one=RateLimiter.create(2);//每秒2个
    private static RateLimiter two=RateLimiter.create(2);//每秒2个
    private RateLimitUtil(){};


    public static void acquire(RateLimiter r,int num){
        double time =r.acquire(num);
        System.out.println("wait time="+time);
    }

    public static void main(String[] args) throws InterruptedException {
        acquire(one,1);
        acquire(one,1);
        acquire(one,1);
        System.out.println("-----");
        acquire(two,10);
        acquire(two,1);

    }

    输出结果:

wait time=0.0
wait time=0.499163
wait time=0.489308
-----
wait time=0.0
wait time=4.497819

    可以看到,我们以每秒2个请求的速度生成令牌。对one来说

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值