首页 > 其他分享 >RateLimiter限流锁

RateLimiter限流锁

时间:2023-03-13 21:02:00浏览次数:41  
标签:令牌 RateLimiter SmoothWarmingUp 限流 time Wait

基础使用

// 初始化一个限流器
RateLimiter rateLimiter = RateLimiter.create(2);

// 执行限流方法
void doSomething(){
rateLimiter.acquire();
// do something
}

使用 com.google.common.util.concurrent.RateLimiter#create(double) 创建一个限流器,参数为每秒允许的执行次数。

使用 com.google.common.util.concurrent.RateLimiter#acquire() 执行限流方法,获取不到令牌时底层会通过sleep等待。

1)RateLimiter 基于令牌桶算法,即以用户设定的恒定速率向令牌桶内放置令牌,用户来执行任务时,只有拿到令牌才能执行。

2)RateLimiter 对于持续生成令牌,采用的不是定时任务的方式(过于耗费资源,不适合高并发),而是使用延迟计算的方式,即在获取令牌时计算上一次时间 nextFreeTicketMicros 和当前时间之间的差值,计算这段时间之内按照用户设定的速率可以生产多少令牌。

3)RateLimiter 是一个抽象类,它有两个子类 SmoothBursty 和 SmoothWarmingUp。SmoothBursty 允许突发流量的平滑限流器,它使用了令牌桶算法。SmoothWarmingUp 是平滑预热限流器,它使用了漏桶算法。

效果测试

RateLimiter一主要有2种实例对象,SmoothBurstySmoothWarmingUp

根据不同的初始化参数会生成不同的实例,使用上的区别主要在于限流的模式和效果,即平滑突发限流和平滑预热限流。

  • 平滑突发限流(SmoothBursty)是指在没有请求时,会累积一些许可证,当有突发的请求时,可以快速响应,但是随后的请求会被平均分配到固定的时间间隔中。这种模式适用于对响应时间敏感的场景。
  • 平滑预热限流(SmoothWarmingUp)是指在开始时,许可证的发放速度较慢,然后逐渐提升到稳定状态。这种模式适用于需要避免冷启动问题的场景。

创建和使用方法如下:

// 创建一个每秒生成2个令牌的限流器
RateLimiter rateLimiter = RateLimiter.create(2);

// 创建一个预热时间为10毫秒,每秒生成5个令牌的限流器
RateLimiter rateLimiter = RateLimiter.create(5, 10, TimeUnit.MILLISECONDS);

// 请求服务时,调用 acquire 方法获取令牌,并返回等待时间
double waitTime = rateLimiter.acquire();
System.out.println("Wait time: " + waitTime + " seconds");

// 或者调用 tryAcquire 方法尝试获取令牌,并返回是否成功
boolean success = rateLimiter.tryAcquire();
System.out.println("Success: " + success);

其中RateLimiter的默认实现即是已经存储1个令牌的限流器

可以用以下代码测试:

@Test
public void testRateLimiter() throws InterruptedException {
    RateLimiter rateLimiter = RateLimiter.create(2);
    // 情况一:连续请求10次
    for (int i = 0; i < 5; i++) {
        // 获取许可证并打印等待时间
        double waitTime = rateLimiter.acquire();
        System.out.println("Wait time: " + waitTime);
    }
    RateLimiter smoothWarmingUp = RateLimiter.create(2, 3, TimeUnit.SECONDS);
    for (int i = 0; i < 10; i++) {
        // 获取许可证并打印等待时间
        double waitTime = smoothWarmingUp.acquire();
        System.out.println("SmoothWarmingUp Wait time: " + waitTime);
    }
}

Wait time: 0.0
Wait time: 0.497882
Wait time: 0.4902
Wait time: 0.494686
Wait time: 0.494838
SmoothWarmingUp Wait time: 0.0
SmoothWarmingUp Wait time: 1.33317
SmoothWarmingUp Wait time: 0.996481
SmoothWarmingUp Wait time: 0.665705
SmoothWarmingUp Wait time: 0.496102
SmoothWarmingUp Wait time: 0.495545
SmoothWarmingUp Wait time: 0.498759
SmoothWarmingUp Wait time: 0.498779
SmoothWarmingUp Wait time: 0.495724
SmoothWarmingUp Wait time: 0.495912

参考资料

  1. Guava RateLimiter – Throttling Explained
  2. Guava源码:com.google.common.util.concurrent.SmoothRateLimiter
  3. A Guide to Guava’s RateLimiter

标签:令牌,RateLimiter,SmoothWarmingUp,限流,time,Wait
From: https://www.cnblogs.com/lyInfo/p/17212853.html

相关文章

  • ASP.NET Core Web API 接口限流
    前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间范围......
  • 服务降级&熔断&限流
    服务降级&熔断&限流一、高并发&高可用其实我们讲过所有的SpringCloud知识,都为了解决两个问题:一个是高并发,一个是高可用。解决高并发&高可用问题的方法有很多,比如:从应......
  • gateway整合Sentinel实现资源限流
    转:整合Sentinel实现资源限流整合Sentinel实现资源限流 SpringCloudGateway默认为我们提供了一种限流方法:RequestRateLimiterGatewayFilterFactory。但这种方法实......
  • 接口限流常见算法方案原理 及其 实现(Guava RateLimiter,Redis+AOP+Lua)
    (目录)什么是限流?为什么要限流?限流,这个词其实并不陌生,在我们生活中也随处可见。做核酸时,工作人员会在核酸检测点的空地上摆放着弯弯曲曲的围栏,人们排着队左拐右拐的往前......
  • 限流算法汇总
    计数器算法:原理:在指定时间周期内累加访问次数,达到设定的阈值时,触发限流策略。下一个时间周期进行访问时,访问次数清零。实现:此算法无论是在单机还是分布式环境下......
  • 高并发场景下常见的限流算法及方案介绍
    作者:京东科技康志兴应用场景现代互联网很多业务场景,比如秒杀、下单、查询商品详情,最大特点就是高并发,而往往我们的系统不能承受这么大的流量,继而产生了很多的应对措施:CD......
  • 高并发系统设计之限流
    本文已收录至Github,推荐阅读......
  • 高并发系统设计之限流
    本文已收录至Github,推荐阅读......
  • k8s~ingress限流机制
    Ingress限流限速的注解定义了对连接和传输速率的限制。这些可以用来减轻DDoS攻击。它采用了“漏斗”算法实现限制。主要参数nginx.ingress.kubernetes.io/limit-co......
  • 面试官:限流算法有哪些?
    限流的实现算法有很多,但常见的限流算法有三种:计数器算法、漏桶算法和令牌桶算法。1.计数器算法计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,......