当前位置: 首页 > news >正文

RateLimiter限流

使用场景

限流是高并发的处理方法之一。

高并发处理方案: 
缓存:缓存的目的是提升系统访问速度和增大系统处理容量。
降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开。
限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。

令牌桶算法、漏桶算法

限流常见的算法:

令牌桶算法:
  • 一个存放固定容量令牌的桶
  • 按照固定速率往桶里添加令牌。
  • 桶中最多存放指定个数的令牌,当桶满时,新添加的令牌被丢弃或拒绝;
  • 令牌桶允许突发的多个请求,只要有令牌就可以处理,支持一次拿3个令牌,4个令牌。
漏桶算法:
  • 一个固定容量的漏桶
  • 按照常量固定速率流出水滴;
  • 如果流入水滴超出了桶的容量,则流入的水滴溢出了,而漏桶容量是不变的。

注意:

RateLimiter限流属于单体版的限流,如果是高并发的分布式系统,需要用分布式限流。

Maven依赖包:

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

RateLimiter限流

  • RateLimiter初始化:
   RateLimiter limiter = RateLimiter.create(5);
  • RateLimiter令牌桶的方法:
create():每秒创建多少令牌;
acquire():获取一个令牌;
acquire(int permits):获取指定个数的令牌;     
tryacquire():尝试获取令牌;
tryacquire():尝试获取一个令牌,如果获取不到立即返回;
tryacquire(int permits, long timeout, TimeUnit unit):尝试获取permits个令牌,如果获取不到等待timeout时间;

示例:

    public static void runRateLimiter() {Long start = System.currentTimeMillis();// 每秒产生10个令牌,也就是说每秒最多执行10个任务RateLimiter limiter = RateLimiter.create(10);for(int i = 1; i < 100; i ++ ) {// 请求RateLimiter, 超过permits(也就是create方法的参数,比如上面的10)会被阻塞,然后等待获取令牌limiter.acquire();System.out.println("acquire:" + i );}Long end = System.currentTimeMillis();System.out.println("限流后总耗时:" + (end - start));}

参考资料:

https://www.iteye.com/blog/jinnianshilongnian-2305117
https://www.jianshu.com/p/5d4fe4b2a726

http://www.lryc.cn/news/211540.html

相关文章:

  • PMP适合哪些人去考?
  • 钡铼技术 工控机中的X86和ARM处理器:哪个更具可扩展性?
  • 软考 系统架构设计师系列知识点之软件构件(3)
  • 中科驭数亮相2023中国移动全球合作伙伴大会
  • WebGIS国产化(信创)研发流程一:数据库的调研与介绍
  • [Shell] ${} 的多种用法
  • 基于SpringBoot的社区医院管理系统设计与实现
  • Spring的执行流程与Bean的生命周期
  • 使用 SQL 的方式查询消息队列数据以及踩坑指南
  • 拿下国家级信创认证 中科驭数KPU SWIFT-2200N成为国内首款满足金融业严苛要求的DPU产品
  • centos怎么禁用和关闭selinux
  • 【LeetCode刷题日志】88.合并两个有序数组
  • 计算机考研 | 2013年 | 计算机组成原理真题
  • [Unity][VR]透视开发系列4-解决只看得到Passthrough但看不到Unity对象的问题
  • 电气工程 自动化 机械工科学生来看看
  • NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)
  • null,undefined的区别?
  • 2.flink编码第一步(maven工程创建)
  • Unit1_1:分治问题之时间复杂度求解
  • React hooks的闭包陷阱
  • 20.3 OpenSSL 对称AES加解密算法
  • 一文详解防御DDoS攻击的几大有效办法
  • Python二级 每周练习题24
  • MySQL - Buffer Pool
  • c++ 拆分函数返回值和参数类型
  • Ubuntu 23.10安装TeXlive并安装CTEX中文支持
  • SpringBoot中CommandLineRunner详解(含源码)
  • 通信基础(一):数据传输基础
  • 故障诊断模型 | Maltab实现BiLSTM双向长短期记忆神经网络故障诊断
  • 物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?