限流算法(漏桶算法、令牌桶算法)

漏桶算法:

有个桶,比如最大能进2个单位的水(请求),桶底有个洞,每个单位的水都会在桶里待3秒后漏下去。
那么这个桶就可以同时处理2个单位的水。
如果进水太多,同一时间进水多出2个单位的水就溢出来了,也就是拒绝请求或阻塞。

令牌桶算法:

有个桶,每个固定时间会向桶里放令牌,放满就不放了,而每次请求都会从桶里去拿令牌,拿到才能正常请求。
如果拿的速度大于放的速度,那么就会出现拿不到令牌的情况,请求就会被拒绝或阻塞。

基于漏桶算法的典型实现:java.util.concurrent.Semaphore
基于令牌桶算法是典型实现:com.google.common.util.concurrent.RateLimiter

1、Semaphore(漏桶算法)

Semaphore更倾向于限制并发量,比如系统只支持2个并发,那么就设置:
Semaphore semaphore = new Semaphore(2);
每次请求前,执行semaphore.acquire();相当于将水放在水桶里,最多放2个
请求结束前,执行semaphore.release();相当于把水漏掉
那么效果就是系统每秒只能支持两个请求,只有等这某个请求执行完,并且释放掉,才能接收新的请求

2、RateLimiter(令牌桶算法)

RateLimiter更倾向于限制访问速率,比如系统每秒2次请求,那就设置:
RateLimiter limiter = RateLimiter.create(2.0);
每次请求前,执行limiter.acquire();相当于从桶里取令牌
那效果就是每秒只能有两个请求取到令牌,其他请求只能阻塞住,等待下一秒

刚开始看这两种限流算法,有些人会混淆,感觉不到太大的差别,那就试试跑跑下面的例子,感受一下:
    public static void main(String[] args) {RateLimiter limiter = RateLimiter.create(2.0); // 这里的2表示每秒允许处理的量为2个for (int i = 1; i <= 10; i++) {limiter.acquire();// 拿令牌,拿不到就阻塞log.info("执行。。。" + i);}}
    public static void main(String[] args) {Semaphore semaphore = new Semaphore(2);//这里的2表示并发数是2for(int i=0;i<10;i++) {new Thread(()->{try {semaphore.acquire();//入桶,放不下就阻塞log.info(Thread.currentThread().getName()+"执行");Thread.sleep(3000);//睡3秒} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();//释放}},"线程"+i).start();}}

注意比对结果,看for循环里每个执行的速度,你会发现:
使用Semaphore限流的,设置的并发数是2个,那么就是一下子两个一起执行,完了3秒后都执行完,释放掉,后两个再一起执行。重点是一批一批的。
使用RateLimiter限流的,每个执行都是匀速的,设置的每秒2个请求,那就基本上是0.5秒一个,匀速执行。重点是匀速。

具体执行结果可以看下图:

这个是RateLimiter,可以看到是匀速的执行,0.5秒一个。

这个是Semaphore,是两个两个的执行,每3秒2个。

注意

这两种都是单机版的,分布式环境可以使用redis等分布式唯一存储来记录这些值,原理都基本差不多

限流算法(漏桶算法、令牌桶算法)对比相关推荐

  1. 信号量与令牌桶_限流的4种方式令牌桶实战

    限流的4种方式 正文 限流 限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机.常用的限流算法有令牌桶和和漏桶,而Google开源项目Guava ...

  2. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?

    什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...

  3. 令牌桶算法和漏桶算法python_限流之漏桶算法与令牌桶算法

    在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流 缓存:缓存的目的是提升系统访问速度和增大系统处理容量 降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降 ...

  4. 带你快速了解:限流中的漏桶和令牌桶算法

    在前文 <限流熔断是什么,怎么做,不做行不行?>中针对 "限流" 动作,有提到流量控制其内部对应着两种常用的限流算法. 其分别对应漏桶算法和令牌桶算法.因此会有的读者会 ...

  5. 高并发策略之限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)

    导读 网站高可用指的就是:在绝大多的时间里,网站一直处于可以对外提供服务的正常状态. 一般以"年"为单位来统计,"9"的个数越多,代表一年中允许的不可用时间就越 ...

  6. 【面试大全-高并发】-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景

    参考思路:限流算法常用的几种实现方式有如下四种:计数器.滑动窗口.漏桶和令牌桶: ● 计数器: ○ 思想:在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清 ...

  7. 限流的4种策略--固定窗口、滑动窗口、漏桶、令牌桶

    01 Why 分布式系统中,由于接口API无法控制上游调用方的行为,因此当瞬时请求量突增时,会导致服务器占用过多资源,发生响应速度降低.超时.乃至宕机,甚至引发雪崩造成整个系统不可用. 限流,Rate ...

  8. 【229期】Spring Boot 使用令牌桶算法+拦截器+自定义注解+自定义异常实现简单的限流...

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  9. 面试必备:4种经典限流算法讲解

    最近,我们的业务系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法实现的,而令牌桶是非常经典的限流算法.本文将跟大家一起学习几种经典的限流算法. 公众号:捡田螺的小男孩 限流是什 ...

  10. 详解4种经典的限流算法

    最近,我们的业务系统引入了Guava的RateLimiter限流组件,它是基于令牌桶算法实现的,而令牌桶是非常经典的限流算法.本文将跟大家一起学习几种经典的限流算法. 限流是什么? 维基百科的概念如下 ...

最新文章

  1. 网站被黑你隔了多久才知道?
  2. posix自己搭建消息队列_蘑菇街消息系统上云实践
  3. Spring : ListableBeanFactory
  4. Windows错误代码转换成文字信息描述
  5. 函数计算 GB 镜像秒级启动
  6. 移动开发不能不知道的事-meta
  7. paip.判断字符是否中文与以及判读是否是汉字uapi python java php
  8. C#即时通讯客户端源码【源码免费分享】
  9. android绘制矢量图地图,Android 高级 UI 进阶之路 (七) SVG 基础使用 + 绘制中国地图...
  10. 设计模式——行为型模式
  11. 数据分析新人如何面对繁杂且突然的数据需求
  12. 跨文化交际复习题及答案(超全的)
  13. 利用python代码 之将指定网易云歌单保存到Excel中
  14. 蓝鲸作业流程编排--参数使用
  15. 迅雷CTO李金波:致创业者的一封信
  16. Web3 网络效应:五种心智模型
  17. 【开发工具】IDEA-DeBug 调试模式使用
  18. YLAN_TRANSLATE ABAP程序批量翻译工具
  19. proxy(初级运用)
  20. fractal php,一文读懂Fractal共识协议:iChing之精妙

热门文章

  1. 循环队列的介绍与实现
  2. 去掉input密码框自动补全功能
  3. python FOR循环
  4. 老李谈HTTP1.1的长连接
  5. [Android源码]Android源码之高仿飞鸽传书WIFI热点搜索与创建(一)
  6. sixxpack破解的文章!【转】
  7. 深入Atlas系列:综合示例(1) - 调用服务器端方法时直接获得客户端具体类型...
  8. 【剑指offer】面试题39:数组中出现次数超过一半的数字
  9. linux open 头文件_linux下通过共享内存和mmap实现进程间通讯
  10. windows 获取命令执行后的结果_法院判决以后,老赖欠钱不还,递交强制执行申请多久后有结果?...