首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Google出品的限流术RateLimiter

Google出品的限流术RateLimiter

作者头像
JavaQ
发布于 2018-04-04 09:17:43
发布于 2018-04-04 09:17:43
2.6K0
举报
文章被收录于专栏:JavaQJavaQ

限流

通过对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。常用的限流算法有令牌桶和和漏桶,而Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。

令牌桶算法

有一个固定容量用于存储令牌的桶,按照设定的频率向桶中放入令牌,过程如下图所示。

过程描述如下:

  • 如果设定每秒向桶中放入5个令牌,则将会以每200毫秒的固定速率向桶中放入一个令牌;
  • 桶中最多存放n个令牌,如果桶满了,则新放入的令牌将会被丢弃;
  • 当一个m字节的数据包到达时,将会使用m个令牌,然后将该数据包发出;
  • 如果桶中可用令牌数小于k,则该数据包将需要等待或丢弃。

RateLimiter

RateLimiter实现的令牌桶算法,不仅可以应对正常流量的限速,而且可以处理突发暴增的请求,实现平滑限流。RateLimiter方法摘要如下。

修饰符和类型

方法和描述

double

acquire()从RateLimiter获取一个令牌,该方法会被阻塞直到获取到令牌

double

acquire(int permits)从RateLimiter获取指定数量令牌,该方法会被阻塞直到获取到指定数量令牌

static RateLimiter

create(double permitsPerSecond)根据指定的吞吐量(permitsPerSecond)创建RateLimiter,permitsPerSecond指每秒可执行的数量,也指每秒放入的令牌数

static RateLimiter

create(double permitsPerSecond, long warmupPeriod, TimeUnit unit)根据指定的吞吐量(permitsPerSecond)和预热期(warmupPeriod)来创建RateLimiter,permitsPerSecond指每秒可执行的数量,也指每秒放入的令牌数 ,在这段预热时间内,RateLimiter每秒加入的令牌数会平稳地增长直到预热期结束时达到其最大速率。

double

getRate()返回RateLimiter设置的固定频率,该频率指每秒加入的令牌数

void

setRate(double permitsPerSecond)设置RateLimite的固定频率

boolean

tryAcquire()尝试立即获取令牌,获取不到返回false,获取到返回true

boolean

tryAcquire(int permits)尝试立即获取permits个令牌,获取不到返回false,获取到返回true

boolean

tryAcquire(int permits, long timeout, TimeUnit unit)在以unit为时间单位的timeout时间范围内,尝试获取permits个令牌,获取不到返回false,获取到返回true

boolean

tryAcquire(long timeout, TimeUnit unit)在以unit为时间单位的timeout时间范围内,尝试获取1个令牌,获取不到返回false,获取到返回true

应用

场景:向第三方服务发送多笔查询请求,如果是单线程发送请求,效率很慢;如果使用多线程发送,第三方服务处理能力有限,直接返回失败。

方案:使用RateLimiter限制发送请求的频率,假设第三方服务每秒可处理5笔请求,示例代码如下。

List<String> queryNos = newArrayList("1", "2", "3", "4", "5", "6", "7"); RateLimiter limiter = RateLimiter.create(5); ExecutorService executorService = Executors.newFixedThreadPool(5); for (final String queryNo : queryNos) { limiter.acquire(); executorService.submit(new Runnable() { public void run() { //...发送请求 System.out.println(queryNo + ":" + Calendar.getInstance().getTimeInMillis()); } }); }

结果输出如下:

1:1499333845323

2:1499333845505

3:1499333845704

4:1499333845904

5:1499333846105

6:1499333846304

7:1499333846504

可以看到每个请求间隔差不多200毫秒,实现了限流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Guava RateLimiter限流源码解析和实例应用
Guava有两种限流模式,一种为稳定模式(SmoothBursty:令牌生成速度恒定),一种为渐进模式(SmoothWarmingUp:令牌生成速度缓慢提升直到维持在一个稳定值) 两种模式实现思路类似,主要区别在等待时间的计算上,本篇重点介绍SmoothBursty
算法之名
2019/08/20
8840
Guava RateLimiter限流源码解析和实例应用
高并发之限流,到底限的什么鬼 (精品长文)
你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可。我们接下来系统性的给它归个小类,希望对你有所帮助。
xjjdog
2019/07/10
1.2K0
高并发之限流,到底限的什么鬼 (精品长文)
限流算法(Guava RateLimiter)
这种算法很好实现, 但是会出现限流不准确问题。比如每秒通过 5 个请求,时间窗口的大小为 1 秒,当前时间窗口周期内的后半秒正常通过了 5 个请求,下一个时间窗口周期内的前半秒正常通过了 5 个请求,在这两个窗口内都没有超过限制。 但是在这两个窗口的中间那一秒实际上通过了 10 个请求,显然不满足每秒 5 个请求的限制。
leobhao
2022/06/28
8860
限流算法(Guava RateLimiter)
限流原理解读之guava中的RateLimiter
RateLimiter.create做了两件事情创建Bursty对象和设置了速率,至次初始化过程结束
爬蜥
2019/07/08
1.7K0
Guava RateLimiter详解以及源码分析
首先你需要明白限流的概念,在高并发、高流量的场景中,我们的系统有时候会通过限流的手段来防止自己的系统被外部的流量打挂,是一种自我保护措施。
用户7634691
2021/08/12
1.1K0
面试官:来谈谈限流-RateLimiter源码分析
RateLimiter有两个实现类:SmoothBursty和SmoothWarmingUp,其都是令牌桶算法的变种实现,区别在于SmoothBursty加令牌的速度是恒定的,而SmoothWarmingUp会有个预热期,在预热期内加令牌的速度是慢慢增加的,直到达到固定速度为止。其适用场景是,对于有的系统而言刚启动时能承受的QPS较小,需要预热一段时间后才能达到最佳状态。
李红
2019/08/13
8200
Guava RateLimiter单机实战指南
想象一下你是一位大厨,正在烹饪美味佳肴。突然之间,前来就餐的人潮如潮水般涌入,如果没有明智的限流策略,你可能会被厨房的热潮吞噬。现在,想象Guava的RateLimiter就像是一把魔法调味剂,帮助你在这个数字厨房中优雅地掌握料理节奏。本文将引领你走进这个美食的实战之旅。
一只牛博
2025/05/30
700
Guava RateLimiter单机实战指南
SpringBoot整合RateLimiter实现限流
在和某学长炫耀在自己会用Redis+Lua实现滑动窗口限流时,他说现在都用RateLimiter,所以就我就想搞个Demo,但是度娘了一下,感觉我搜索到的博客有几个个人认为不太完善的地方,比如只贴了部分代码,没贴依赖。尤其是你用AOP实现的时候,其实依赖哪个还有有讲究的;还有一个问题就是大多都是基于AOP实现,拦截器实现也是一个不错的方式,所以此处用拦截器HandlerInterceptorAdapter实现。
CBeann
2023/12/25
4840
限速神器RateLimiter源码解析
Tech 导读 在软件系统中,面对高并发的场景,经常需要通过限流来降低系统压力、保护系统不被压垮;另外在交易处理的场景中,也经常因下游要求或其他原因需控制处理速率。RateLimiter是谷歌开源的一款轻巧限流限速组件,简单实用,设计精妙,本文结合示例对其源码进行了相关分析解读,包括代码层级、处理流程、数据流转、计算逻辑等, 希望能够帮助大家了解和使用。
京东技术
2023/08/22
6160
限速神器RateLimiter源码解析
Guava RateLimiter 实现 API 限流,这才是正确的姿势!
Guava提供的RateLimiter可以限制物理或逻辑资源的被访问速率,咋一听有点像java并发包下的Samephore,但是又不相同,RateLimiter控制的是速率,Samephore控制的是并发量。
JAVA葵花宝典
2021/10/20
10.9K0
超详细的Guava RateLimiter限流原理解析
 限流是保护高并发系统的三把利器之一,另外两个是缓存和降级。限流在很多场景中用来限制并发和请求量,比如说秒杀抢购,保护自身系统和下游系统不被巨型流量冲垮等。
程序员历小冰
2019/03/31
18.7K0
超详细的Guava RateLimiter限流原理解析
使用Guava RateLimiter限流以及源码解析
首先通过RateLimiter.create(1);创建一个限流器,参数代表每秒生成的令牌数,通过limiter.acquire(i);来以阻塞的方式获取令牌,当然也可以通过tryAcquire(int permits, long timeout, TimeUnit unit)来设置等待超时时间的方式获取令牌,如果超timeout为0,则代表非阻塞,获取不到立即返回。
用户6182664
2020/05/08
1.4K0
使用Guava RateLimiter限流以及源码解析
提升编程效率的利器: 解析Google Guava库之RateLimiter优雅限流(十)
RateLimiter基于令牌桶算法(Token Bucket Algorithm)实现。该算法通过以恒定的速度向桶中添加令牌,并且每当有请求来时,需要从桶中取出一个或多个令牌才能继续执行。如果桶中没有足够的令牌,请求将被限流,即延迟处理或拒绝服务。
公众号:码到三十五
2024/03/19
2.1K0
源码分析RateLimiter SmoothWarmingUp 实现原理(文末附流程图)
上一篇详细介绍了 SmoothBursty 的实现原理,本文将介绍带有预热机制的限速器实现原理。
丁威
2020/03/31
1.5K0
源码分析RateLimiter SmoothWarmingUp 实现原理(文末附流程图)
分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket
对于web应用的限流,光看标题,似乎过于抽象,难以理解,那我们还是以具体的某一个应用场景来引入这个话题吧。在日常生活中,我们肯定收到过不少不少这样的短信,“双11约吗?,千款….”,“您有幸获得唱读卡,赶快戳链接…”。这种类型的短信是属于推广性质的短信。为什么我要说这个呢?听我慢慢道来。一般而言,对于推广营销类短信,它们针对某一群体(譬如注册会员)进行定点推送,有时这个群体的成员量比较大,甚至可以达到千万级别。因此相应的,发送推广短信的量也会增大。然而,要完成这些短信发送,我们是需要调用服务商的接口来完成的。倘若一次发送的量在200万条,而我们的服务商接口每秒能处理的短信发送量有限,只能达到200条每秒。那么这个时候就会产生问题了,我们如何能控制好程序发送短信时的速度昵?于是限流这个功能就得加上了
用户6182664
2020/05/11
6K0
高性能限流器 Guava RateLimiter
陈某的《Spring Cloud Alibaba实战项目》 视频教程已经录完了,涉及到Alibaba的各种中间件实战,戳这里--->Spring Cloud Alibaba 实战 视频专栏 开放订阅~
码猿技术专栏
2023/05/01
3610
高性能限流器 Guava RateLimiter
令牌桶算法原理及应用
最近在参与一个业务迁移的项目。走读代码时,接触到一些限流相关的代码。向老司机请教后了解到,有些业务承载了很高量级的扣款请求,尤其对于一些热点商户,其单点的请求量很大,但某些瓶颈系统的处理能力有限,因此需要做好限流,以保障业务流程中各系统的稳定性。
张乘辉
2022/01/24
4.3K0
令牌桶算法原理及应用
基本限流算法与GuavaRateLimiter实现
总结: 固定窗口算法适用于对请求速率有明确要求且流量相对稳定的场景,但对于突发流量和请求分布不均匀的情况,可能需要考虑其他更灵活的限流算法。
leobhao
2024/08/07
2020
基本限流算法与GuavaRateLimiter实现
实战限流(guava的RateLimiter)
程序员欣宸
2018/01/04
2.3K0
实战限流(guava的RateLimiter)
使用RateLimiter完成简单的大流量限流,抢购秒杀限流
RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率。
天涯泪小武
2019/01/17
1.1K0
相关推荐
Guava RateLimiter限流源码解析和实例应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档