四种限流算法

四种限流算法

为什么要限流

限流是为了防止系统突然收到大量请求,后台面对大量并发请求对cpu和内存,网络io产生巨大压力,可能将一些服务如mysql,redis等打崩,引发系统故障,服务瘫痪。

固定窗口:Fixed Window Rate Limiting Algorithm

将时间分为固定窗口,将请求按时间顺序放入时间窗口,如果超过设置时间窗口的阈值就返回限流结果,但是在两个时间窗口替换间隙可能会有2n请求并发。

优点:实现简单,便于理解

缺点:存在明显的临界问题,切换间隙可产生产生2n请求:0.75秒-1.0秒产生n个请求,刷新,1.0-1.5s又产生n个请求,这n个请求各自窗口满足要求,但是再它门组成的窗口中并发量达到了2n

public class FixedWindow {//窗口大小private final static Integer timeUnit=1000;//请求计数private  AtomicInteger count=new AtomicInteger();private  Long lastTime=0L;private Integer  threshold=10;public boolean fixedWindow(){long currentTime=System.currentTimeMillis();if(currentTime-lastTime>timeUnit){count.set(0);lastTime=currentTime;}if(count.get()>=threshold) //初始计数是0 ,所以是大于等于刚好执行十次{return false;}count.getAndIncrement();return true;}public static void main(String[] args) {FixedWindow fixedWindow=new FixedWindow();for(int i=0;i<20;i++){System.out.println(fixedWindow.fixedWindow());}}}

滑动窗口:Sliding Windows Algorithm

将单位时间周期又划分成n个小周期,分别根据每个小周期内接口的访问次数,并根据时间滑动自动删除过期的小周期(tcp就是根据这个来实现对发送字节的大小控制)

优点: 简单易懂,精度高可以调整时间粒度来调节限流效果,可拓展性,可与和其他限流算法结合使用

缺点:无法应对突发请求,突发请求会被大量拒绝,会损失大量请求

public class SlidingWindow {private final int maxRequests; // 最大请求数private final long timeWindowMillis; // 时间窗口(毫秒)private final Queue<Long> requests; // 请求队列public SlidingWindow(int maxRequests, long timeWindowMillis) {this.maxRequests = maxRequests;this.timeWindowMillis = timeWindowMillis;this.requests = new LinkedList<>();}public synchronized boolean tryAcquire() {// 移除超出时间窗口的请求while (!requests.isEmpty() && System.currentTimeMillis() - requests.peek() > timeWindowMillis) {requests.poll();}// 判断当前窗口内的请求数量是否超过最大请求数if (requests.size() < maxRequests) {// 添加新请求到队列requests.offer(System.currentTimeMillis());return true;} else {return false;}}public static void main(String[] args) throws InterruptedException {SlidingWindow rateLimiter = new SlidingWindow(5, 1000); // 每秒最多5个请求for (int i = 0; i < 20; i++) {System.out.println("Request " + (i + 1) + ": " + (rateLimiter.tryAcquire() ? "Accepted" : "Rejected"));}}
}

漏桶算法:Leaky Bucket Algorithm

控制流入网络的速率速度,以防止网络堵塞。核心思想就是将请求比作小水滴,漏桶看作固定容量的水桶,数据包从顶部进入漏桶,漏桶底部以匀速形式流出数据包。水满则溢,拒绝请求。

优点:可以十分平滑的处理请求,对瞬间增加的请求有一定的承载能力

缺点:需要对请求进行缓存,会增加服务器的内存消耗。面对突发流量无法进行快速处理请求。

public class LeakyBucket {private int capacity = 10;private int rate = 1;  //每ms多少个private int total = 0;private long lastTime = System.currentTimeMillis();private synchronized boolean leakBucket(Integer water) throws InterruptedException {long time=System.currentTimeMillis();long escapeTime=time-lastTime;long leakWater=escapeTime*rate;if(leakWater>0){total=(int) Math.max(0,total-leakWater);lastTime=time;}if(total+water>capacity){Thread.sleep(4);return false;}total=total+water;return true;}public static void main(String[] args) throws InterruptedException {LeakyBucket leakyBucket=new LeakyBucket();for (int i = 0; i < 20; i++) {System.out.println(leakyBucket.leakBucket(2));}}
}

令牌桶算法:Token Bucket Algorithm

系统以一定的速率向令牌桶中添加令牌,请求到来时先去尝试获取令牌,拿到令牌就正常请求并消耗这个令牌,拿不到就拒绝服务。

优点:可以应对突发流量,具有弹性处理请求的特点,稳定性好。精度高:可以根据请求动态调节生成令牌桶的速率

缺点:实现复杂,时间精度控制要求比较高

public class TokenBucket {private long capacity = 5;//令牌总数private long lastTime=System.currentTimeMillis();private long  rate=5;//每毫秒发放令牌private long  total=capacity;private synchronized boolean tokenBucket() throws InterruptedException {long now=System.currentTimeMillis();long gap=now-lastTime;long add=gap*rate;if(total<20){total=Math.min(total+add,capacity);lastTime=now;}if(total-1<0){Thread.sleep(1);return false;}total--;return true;}public static void main(String[] args) throws InterruptedException {TokenBucket tokenBucket=new TokenBucket();for (int i = 0; i < 20; i++) {System.out.println(tokenBucket.tokenBucket());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core mvc中的viewdata和viewbag的用法

在ASP.NET Core MVC中&#xff0c;ViewData和ViewBag都是用于在控制器中传递数据给视图的方式&#xff0c;但它们在实现上有一些区别。 ViewData是一个ViewDataDictionary对象&#xff0c;它是一个字典&#xff0c;可以通过键值对的方式传递数据。你可以像这样在控制器中设置V…

关于Python里xlwings库对Excel表格的操作(三十)

这篇小笔记主要记录如何【如何使用“Chart类”、“Api类"和“Axes函数”为新图表设置标题文本内容、字体、字号、粗细、正斜、颜色、坐标轴主要网格线】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】…

LeetCode每周五题_2024/01/01~2024/01/05

文章目录 1599. 经营摩天轮的最大利润 [2024/01/01]题目题解 466. 统计重复个数 [2024/01/02]题目题解 2487. 从链表中移除节点 [2024/01/03]题目题解 1599. 经营摩天轮的最大利润 [2024/01/01] 题目 1599. 经营摩天轮的最大利润 你正在经营一座摩天轮&#xff0c;该摩天轮共…

Maple 各版本安装指南

Maple 下载链接 https://pan.baidu.com/s/11hKo1XxZGa0xv3Ivj6fbEA?pwd0531 1.鼠标右击【Maple 2023】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Maple 2023】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以管理员身…

计算机毕业设计------SSM的公寓房屋出租系统

项目介绍 该项目分为前后台&#xff0c;分为普通用户与管理员两种角色。 前台主要功能包括&#xff1a; 普通用户的注册、登录,房屋列表展示&#xff0c;租房&#xff0c;我的订单、用户中心等功能模块&#xff1b; 后台主要功能包括&#xff1a; 系统设置&#xff1a;菜单管…

记一次docker中安装redis的过程

1. Docker搜索redis镜像 docker search redis2. Docker搜索redis镜像 docker pull redis3.Docker挂载配置文件 挂载 redis 的配置文件挂载 redis 的持久化文件&#xff08;为了数据的持久化&#xff09;。 conf文件位置&#xff1a; /home/redis/myredis/redis.conf data文件…

线程池的运行原理和使用案例

在日常开发中&#xff0c;如果需要使用到多线程&#xff0c;最简单的方式是 new Thread&#xff0c;但是这种方式有很大弊端&#xff1a; 首先new Thread 是比较消耗系统性能的&#xff0c;性能比较差&#xff1b;线程缺乏统一的管理&#xff0c;会无限制的创建新线程&#xf…

57个Linux常用命令含参数介绍和使用示例

点击下载《57个Linux常用命令含参数介绍和使用示例》 1. pwd 作用&#xff1a;显示当前所在的工作目录的全路径名称 //显示当前目录 pwd该命令无需任何参数&#xff0c;只需在终端窗口中输入 pwd 命令即可使用。 2. cd 作用&#xff1a;更改当前工作目录。 //跳转目录至D…

航空业数字化展翅高飞,开源网安专业服务保驾护航

​某知名航空公司是中国首批民营航空公司之一&#xff0c;运营国内外航线200多条&#xff0c;也是国内民航最高客座率的航空公司之一。在数字化发展中&#xff0c;该航空公司以数据驱动决策&#xff0c;通过精细化管理、数字创新和模式优化等方式&#xff0c;实现了精准营销和个…

day58算法训练|单调栈part01

参考&#xff1a;代码随想录 单调栈的使用情况&#xff1a; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。 单调栈的本质是空间换时间&#xff0c;因为在遍历…

依赖属性(Dependency Properties)和常规的 CLR 属性

在 WPF 中&#xff0c;有两种主要的属性类型可以用于数据绑定&#xff1a;依赖属性&#xff08;Dependency Properties&#xff09;和常规的 CLR 属性&#xff0c;后者通常与 INotifyPropertyChanged 接口结合使用。 依赖属性&#xff08;Dependency Properties&#xff09; …

10款值得推荐的Blazor UI组件库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里问有什么好用的Blazor UI组件库推荐的&#xff0c;本文将分享一些开源、实用、美观的Blazor UI组件库&#xff0c;提供给广大C#/.NET开发者们学习和使用&#xff08;注意&#xff1a;排名不分先后&#xff0c;都是十分优秀…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第2章 信息技术发展(一)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

Python内置类属性__module__属性的使用教程

概要 在Python中&#xff0c;每个对象都有一些内置的属性&#xff0c;这些属性提供了有关对象的一些信息。其中一个内置属性是__module__属性。__module__属性是一个字符串&#xff0c;它表示定义了类或函数的模块的名称。在本篇文章中&#xff0c;我们将详细介绍__module__属…

BUUCTF——Reverse——[GXYCTF2019]luck_guy

1、题目 2、工具 Exeinfo PE&#xff1a;查壳工具。IDA&#xff1a;是一款功能强大的反汇编工具&#xff0c;用于分析和逆向工程二进制文件。python&#xff1a;编写自动化脚本。 3、方法 下载压缩包&#xff0c;解压得到一个没有后缀的文件。 用Exeinfo PE查询该文件是否加…

sql:定时执行存储过程(嵌套存储过程、使用游标)

BEGINDeclare FormNo nvarchar(20) --单号Declare Type nvarchar(50) --类型Declare PickedQty float -Declare OutQty float Declare 生产量 floatDeclare 已装箱数量 float Declare 已入库数量 floatDeclare 损耗数量 float Declare 退货品出库数量 intdeclare k c…

C++面向对象编程与泛型编程(GP)

C既支持面向对象编程&#xff0c;又支持泛型编程 1.面向对象编程 将数据结构与处理方法&#xff08;容器与算法&#xff09;组成对象封装在一个类中&#xff0c;通过类的封装隐藏内部细节&#xff0c;可以使用继承&#xff0c;多态等方法。 注意&#xff1a;list容器本身带有…

基于SpringBoot的有光摄影分享网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的有光摄影分享网站,java…

【计算机毕业设计】SSM实现的在线农产品商城

项目介绍 本项目分为前后台&#xff0c;且有普通用户与管理员两种角色。 用户角色包含以下功能&#xff1a; 用户登录,查看首页,按分类查看商品,查看新闻资讯,查看关于我们,查看商品详情,加入购物车,查看我的订单,提交订单,添加收获地址,支付订单等功能。 管理员角色包含以…

LiveGBS国标GB/T28181流媒体平台功能-国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话

LiveGBS国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话 1、GB/T28181级联是什么2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入LiveGBS示例 4、配置国标…