2019独角兽企业重金招聘Python工程师标准>>>

一、常见的限流算法

目前常用的限流算法有两个:漏桶算法和令牌桶算法。

1.漏桶算法

漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出,漏桶算法可以强制限制数据的传输速度。

2.令牌桶算法

令牌桶算法的原理是系统以一定速率向桶中放入令牌,如果有请求时,请求会从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务。这种算法可以应对突发程序的请求,因此比漏桶算法好。

在Wikipedia上,令牌桶算法是这么描述的:

  • 每秒会有r个令牌放入桶中,或者说,每过1/r 秒桶中增加一个令牌
  • 桶中最多存放b个令牌,如果桶满了,新放入的令牌会被丢弃
  • 当一个n字节的数据包到达时,消耗n个令牌,然后发送该数据包
  • 如果桶中可用令牌小于n,则该数据包将被缓存或丢弃

二、RateLimiter

Guava中开源出来一个令牌桶算法的工具类RateLimiter,可以轻松实现限流的工作。RateLimiter对简单的令牌桶算法做了一些工程上的优化,具体的实现是SmoothBursty。需要注意的是,RateLimiter的另一个实现SmoothWarmingUp,就不是令牌桶了,而是漏桶算法。也许是出于简单起见,RateLimiter中的时间窗口能且仅能为1S,如果想搞其他时间单位的限流,只能另外造轮子。

RateLimiter有一个有趣的特性是[前人挖坑后人跳],也就是说RateLimiter允许某次请求拿走了超出剩余令牌数的令牌,但是下一次请求将为此付出代价,一直等到令牌亏空补上,并且桶中有足够本次请求使用的令牌为止。这里面就涉及到一个权衡,是让前一次请求干等到令牌够用才走掉呢,还是让它走掉后面的请求等一等呢?Guava的设计者选择的是后者,先把眼前的活干了,后面的事后面再说。

测试代码:

public class RateLimiterMain {public static void main(String[] args) {RateLimiter rateLimiter = RateLimiter.create(2);System.out.println(rateLimiter.acquire(5));System.out.println(rateLimiter.acquire(2));System.out.println(rateLimiter.acquire(1));}
}

输出内容:

0.0
2.496889
0.992149

可以看出,令牌桶每秒只能产生2个令牌,我们可以第一次取出5个,但是第二次再去取令牌的时候,需要等2.5s,也就是第一次令牌取完后,需要等2.5s才能取到令牌。同样的,第三次取1个令牌的时候,也需要等待第二次的1s的时间。也就是,取的速率可以超过令牌产生的速率,但是下一次再次去取的时候,需要阻塞等待。

当然也可以使用tryAcquire来非阻塞的获取,可以实时返回结果。另外tryAcquire也可以传入参数,也就是等待的时间,超时直接返回false。这点等同于常见的lock,tryLock。

三、并发控制Semapphore

一般来说,在网关系统中,还有一个参数叫并发控制,就是某一个资源可以被同时访问的个数。这种情况下,我们可以使用Semaphore来控制。

Semaphore不同于互斥锁。互斥锁是某个资源只能支持同时一个访问,而Semaphore可以支持多个访问,但是加上了总数的控制。

四、实战

4.1 在pom中加入guava依赖

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version>
</dependency>

把限流服务封装到一个类中AccessLimitService,提供tryAcquire()方法,用来尝试获取令牌,返回true表示获取到,如下所示:

@Service
public class AccessLimitService {//每秒只发出5个令牌RateLimiter rateLimiter = RateLimiter.create(5.0);/*** 尝试获取令牌* @return*/public boolean tryAcquire(){return rateLimiter.tryAcquire();}
}

调用方是个普通的controller,每次收到请求的时候都尝试去获取令牌,获取成功和失败打印不同的信息,如下:

@Controller
public class HelloController {private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Autowiredprivate AccessLimitService accessLimitService;@RequestMapping("/access")@ResponseBodypublic String access(){//尝试获取令牌if(accessLimitService.tryAcquire()){//模拟业务执行500毫秒try {Thread.sleep(500);}catch (InterruptedException e){e.printStackTrace();}return "aceess success [" + sdf.format(new Date()) + "]";}else{return "aceess limit [" + sdf.format(new Date()) + "]";}}
}

转载于:https://my.oschina.net/u/2484728/blog/2056331

【Guava】使用Guava的RateLimiter做限流相关推荐

  1. 使用Guava的RateLimiter做限流

    一.问题描述   某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃.如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦 ...

  2. RateLimiter google限流组件试析(SmoothBursty/SmoothWarmingUp)

    RateLimiter google限流组件试析(SmoothBursty/SmoothWarmingUp) RateLimiter是guava包里的限流组件,位于com.google.common. ...

  3. Rabbitmq专题:rabbitmq消费端如何做限流?

    文章目录 1. 什么是消费端的限流? 2. 解决方案 3. 代码示例 1. 什么是消费端的限流? 场景:在订单高峰期,rabbitmq上已经堆积了很多消息等待消费,如果没有任何限流措施,贸然启动一个消 ...

  4. 系统不做限流,我看你是对中国人口数量有什么误解

    目录 限流 怎么做限流? 获得系统能力上限.处理被限制流量 具体如何限流? 固定窗口 滑动窗口 漏桶 令牌桶 做限流的最佳实践 分布式系统中带来的新挑战 纵 在软件架构领域,"限流" ...

  5. 面试官 | 讲一下如何给高并发系统做限流?

    作者 | nick hao 来源 | uee.me/cDuRD 在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.本文结合作者的一些经验介绍限流的相关概念.算法和常规的实现方式. 缓存 缓存 ...

  6. RateLimiter实现限流

    简介 令牌桶算法则是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌.桶中存放的令牌数有最大上限,超出之后就被丢弃或者拒绝.当流量或者网络请求到达时,每个请求都要获取一个令牌,如果能够获取到,则直 ...

  7. 程序员修神之路--高并发优雅的做限流(有福利)

    点击上方蓝色字体,关注我们 菜菜哥,有时间吗? YY妹,什么事? 我最近的任务是做个小的秒杀活动,我怕把后端接口压垮,X总说这可关系到公司的存亡 简单呀,你就做个限流呗 这个没做过呀,菜菜哥,帮妹子写 ...

  8. 1命名规则 sentinel_Sentinel实战:为系统做限流保护

    我们已经知道了 Sentinel 的三大功能:限流 降级 系统保护.现在让我们来了解下具体的使用方法,以限流来演示具体的步骤. 引入依赖 首先肯定是要先引入需要的依赖,如下所示: com.alibab ...

  9. 超详细的Guava RateLimiter限流原理解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 限流是保护高并发系统的三把利器之一,另外两个是缓存和降级.限流在很多场景中用来限制并发和请求量,比 ...

最新文章

  1. R语言ggplot2可视化使用ggplot2包patchwork包在可视化结果(右上角)中插入logo图片
  2. 经常造轮子的 AI 工程师水平通常不会太差
  3. hellowolrd 的系统调用
  4. jQuery循环使用相同类的元素
  5. 首批互联网地图服务牌照发放 图吧地图获得甲级服务资质
  6. Tomcat 怎么停止服务的?
  7. MOCTF-Web-登录就对了
  8. 关于虚拟机下linux共享Windows文件的解决方案
  9. 2021汉语言文学对高考成绩查询,2021汉语言文学专业就业前景怎么样
  10. 异步udpserver接收rtp转html5(一)
  11. @propertysource 读不到properties_敢不敢来挑战,读对一班就是学霸
  12. 自动类型转化的鲜为人知的陷阱
  13. 悬镜安全宣布完成数千万元Pre-A轮融资
  14. 软件工程总结笔记——软件详细设计(五)
  15. python因子分析法详细步骤_Python——因子分析
  16. 03前端-05 JS提升
  17. Word排版的正确姿势!(Word论文排版教学)
  18. 计算机q的n次方怎么表示什么,次幂
  19. UnityShader---光照(衰减和阴影))(内置渲染管线)---10
  20. python怎么爬取excel_求教! Python爬取的数据 怎么写入Excel表格中

热门文章

  1. python待遇如何-老男孩学Python后就业如何?Python待遇高吗?
  2. python xpath语法-Python Xpath语法
  3. python是什么编程教程-编程零基础应当如何开始学习 Python?
  4. python编程爱心-用python 打印出爱心
  5. python 3.5-安装python3.5
  6. 成都理工大学计算机报告,[2017年整理]成都理工大学通信工程计算机网络综合课程设计报告.doc...
  7. roaringbitmap java,BitMap、RoaringBitmap与JavaEWAH
  8. lua学习笔记之闭包
  9. mybatis中的mapper设计与原理
  10. Android之自定义View以及画一个时钟