博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google出品的限流术RateLimiter
阅读量:7221 次
发布时间:2019-06-29

本文共 1221 字,大约阅读时间需要 4 分钟。

限流

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

令牌桶算法

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

Image.jpg

过程描述如下:

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

RateLimiter

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

1.png
2.png

应用

场景:向第三方服务发送多笔查询请求,如果是单线程发送请求,效率很慢;如果使用多线程发送,第三方服务处理能力有限,直接返回失败。
解决:使用RateLimiter限制发送请求的频率,假设第三方服务每秒可处理5笔请求,示例代码如下

List
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毫秒,实现了限流。

转载地址:http://zihym.baihongyu.com/

你可能感兴趣的文章
HBase中Scan类属性maxResultSize的说明
查看>>
关于version和edition
查看>>
LDAP操作过程中出现的错误代码
查看>>
降低手机开发人员门槛的必须性
查看>>
强大的rsync
查看>>
.NET简谈组件程序设计之(详解NetRemoting结构)
查看>>
我的友情链接
查看>>
javascript异常捕获笔记
查看>>
运维工程师的职责和前景
查看>>
sizeof系列——struct class union
查看>>
适合NetScaler AG部署的 WI 定制站点开发
查看>>
windows10安装体验(win8.1升级win10)
查看>>
Eclipse插件checkstyle安装使用
查看>>
笔记本在公司内部分工位有线连接不识别无法上网
查看>>
mybatis问题
查看>>
调用系统相册和拍照,取得返回文件
查看>>
android View 1
查看>>
Zabbix 监控windows的网卡流量
查看>>
Oracle 查询当前系统时间的几种方式
查看>>
python 爬虫系列(1) --- requests库入门
查看>>