Java常见限流方式

news2024/9/25 23:12:24

Java常见限流方式

    • 1、计数限流
    • 2、固定窗口限流
    • 3、滑动窗口限流
    • 4、漏桶算法
    • 5、令牌桶算法

1、计数限流

例如系统能同时处理 100 个请求,保存一个计数器,处理了一个请求,计数器就加一,一个请求处理完毕之后计数器减一。

每次请求来的时候看看计数器的值,如果超过阈值就拒绝。

非常简单粗暴,计数器的值要是存内存中就算单机限流算法。

如果放在第三方存储里,例如 Redis 中,集群机器访问就算分布式限流算法。

优点就是:简单粗暴,单机在 Java 中可用 Atomic 等原子类、分布式就 Redis incr。

缺点就是:假设我们允许的阈值是1万,此时计数器的值为 0, 当 1 万个请求在前 1 秒内一股脑儿的都涌进来,这突发的流量可是顶不住的。

缓缓地增加流量处理和一下子涌入对于程序来说是不一样的。
图片

计数器限流伪代码实现
而且一般的限流都是为了限制在指定时间间隔内的访问量,因此还有个算法叫固定窗口。

2、固定窗口限流

它相比于计数限流主要是多了个时间窗口的概念,计数器每过一个时间窗口就重置。规则如下:

请求次数小于阈值,允许访问并且计数器 +1;
请求次数大于阈值,拒绝访问;
这个时间窗口过了之后,计数器清零;
在这里插入图片描述

固定窗口限流伪代码实现
看起来好像很完美,实际上还是有缺陷的。

固定窗口临界问题
假设系统每秒允许 100 个请求,假设第一个时间窗口是 0-1s,在第 0.55s 处一下次涌入 100 个请求,过了 1 秒的时间窗口后计数清零,此时在 1.05 s 的时候又一下次涌入100个请求。

虽然窗口内的计数没超过阈值,但是全局来看在 0.55s-1.05s 这 0.1 秒内涌入了 200 个请求,这其实对于阈值是 100/s 的系统来说是无法接受的。

![图片](https://img-blog.csdnimg.cn/611cef1816e14c028cb3ede4651355f2.png

为了解决这个问题引入了滑动窗口限流。

3、滑动窗口限流

滑动窗口限流解决固定窗口临界值的问题,可以保证在任意时间窗口内都不会超过阈值。

相对于固定窗口,滑动窗口除了需要引入计数器之外还需要记录时间窗口内每个请求到达的时间点,因此对内存的占用会比较多。

规则如下,假设时间窗口为 1 秒:

记录每次请求的时间
统计每次请求的时间 至 往前推1秒这个时间窗口内请求数,并且 1 秒前的数据可以删除。
统计的请求数小于阈值就记录这个请求的时间,并允许通过,反之拒绝。
图片
图片
但是滑动窗口和固定窗口都无法解决短时间之内集中流量的突击。

我们所想的限流场景是:

每秒限制 100 个请求。希望请求每 10ms 来一个,这样我们的流量处理就很平滑,但是真实场景很难控制请求的频率,因此可能存在 5ms 内就打满了阈值的情况。

当然对于这种情况还是有变型处理的,例如设置多条限流规则。不仅限制每秒 100 个请求,再设置每 10ms 不超过 2 个。

再多说一句,这个滑动窗口可与TCP的滑动窗口不一样。

TCP的滑动窗口是接收方告知发送方自己能接多少“货”,然后发送方控制发送的速率。

接下来再说说漏桶,它可以解决时间窗口类的痛点,使得流量更加平滑。

4、漏桶算法

如下图所示,水滴持续滴入漏桶中,底部定速流出。

如果水滴滴入的速率大于流出的速率,当存水超过桶的大小的时候就会溢出。

规则如下:

请求来了放入桶中
桶内请求量满了拒绝请求
服务定速从桶内拿请求处理
图片

在这里插入图片描述

可以看到水滴对应的就是请求。

它的特点就是宽进严出,无论请求多少,请求的速率有多大,都按照固定的速率流出,对应的就是服务按照固定的速率处理请求。

“他强任他强,老子尼克杨”。

看到这想到啥,是不是和消息队列思想有点像,削峰填谷。

一般而言漏桶也是由队列来实现的,处理不过来的请求就排队,队列满了就开始拒绝请求。

看到这又想到啥,线程池不就是这样实现的嘛?

经过漏洞这么一过滤,请求就能平滑的流出,看起来很像很挺完美的?实际上它的优点也即缺点。

面对突发请求,服务的处理速度和平时是一样的,这其实不是我们想要的。

在面对突发流量我们希望在系统平稳的同时,提升用户体验即能更快的处理请求,而不是和正常流量一样,循规蹈矩的处理(看看,之前滑动窗口说流量不够平滑,现在太平滑了又不行,难搞啊)。

而令牌桶在应对突击流量的时候,可以更加的“激进”。

5、令牌桶算法

令牌桶其实和漏桶的原理类似,只不过漏桶是定速地流出,而令牌桶是定速地往桶里塞入令牌,然后请求只有拿到了令牌才能通过,之后再被服务器处理。

当然令牌桶的大小也是有限制的,假设桶里的令牌满了之后,定速生成的令牌会丢弃。

规则:

定速的往桶内放入令牌
令牌数量超过桶的限制,丢弃
请求来了先向桶内索要令牌,索要成功则通过被处理,反之拒绝
在这里插入图片描述
看到这又想到啥?Semaphore 信号量啊,信号量可控制某个资源被同时访问的个数,其实和咱们拿令牌思想一样,一个是拿信号量,一个是拿令牌。

只不过信号量用完了返还,而咱们令牌用了不归还,因为令牌会定时再填充。

再来看看令牌桶的伪代码实现,可以看出和漏桶的区别就在于一个是加法,一个是减法。

在这里插入图片描述
可以看出令牌桶在应对突发流量的时候,桶内假如有 100 个令牌,那么这 100 个令牌可以马上被取走,而不像漏桶那样匀速的消费。所以在应对突发流量的时候令牌桶表现的更佳。

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

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

相关文章

学校档案管理系统软件-学校数字档案室解决方案

学校档案管理系统软件是一个用于存储和管理学校重要文档和资料的软件系统,该软件通常包括档案录入、查询、统计、备份等模块,它通过电子化记录、分类和整理学校档案资料,实现了学校档案的高效管理和利用。 专久智能学校数字档案室解决方案需要…

N1中openwrt实现不插网线就能上网,通过wifi连接路由器

环境说明: 路由器:N1盒子 系统版本:openwrt 前言 既然想用这个功能,基本上就是没有网线连接盒子了,不仅限于N1盒子只要是openwrt系统就可以 创建接口 在openwrt界面上依次点击“网络”->“无线”,第一…

正点原子嵌入式linux驱动开发——RGB转HDMI

目前大多数的显示器都提供了HDMI接口,HDMI的应用范围也越来越广,但是STM32MP157这颗芯片原生并不支持HDMI显示。可以通过RGB转HDMI芯片将RGB信号转为HDMI信号,这样就可以连接HDMI显示器了。本章就来学习一下如何在正点原子的STM32MP1开发板上…

听说嵌入式门槛很高,值不值得学习?工资怎么样?

今日话题,嵌入式门槛很高,值不值得学习呢?关于嵌入式领域的门槛和薪酬,我有着五年的实际经验,我的看法是嵌入式岗位的门槛一般来说并不太高。只需掌握一些C语言编程和单片机知识,制作一个简单的电子产品就可…

会声会影2024 无损激活解锁完整旗舰版大师套装

会声会影2024 无损激活解锁完整旗舰版大师套装是功能非常强大的视频编辑软件,非常专业的使用效果,会声会影2024中文版可以针对剪辑电影进行使用,非常强大的色彩校正方式,无论什么光线下进行拍摄,都可以通过后期进行调整…

LinkedHashMap 源码解析

目录 一. 前言 二. 源码解析 2.1. 类结构 2.2. 成员变量 2.3. 构造方法 2.4. accessOrder 2.5. 添加元素 2.6. 获取元素 2.7. 删除元素 2.8. 迭代器 三. LRU简单实现 一. 前言 HashMap元素插入是无序的,为了让遍历顺序和插入顺序一致,我们可以…

海外网红评论:激发更高转化率的关键

随着社交媒体的兴起,海外网红营销已经成为企业推广产品和服务的一种重要方式。然而,在众多的海外网红营销策略中,网红评论的重要性往往被低估。事实上,海外网红评论可以在提高转化率方面发挥关键作用。本文Nox聚星将和大家深入探讨…

linux中好玩的数据流定向和管道命令一

知识点复习: 什么是数据流定向,个人理解就是将 一些结果信息不打印在屏幕上,而是定位在某一个文件里面 ll /wdf > file 会覆盖file的原内容 ll /wdf >> 会追加到原文件后面 比如在自己的目录新建1.TXT, 2.txt ll /…

制药企业计算机化系统验证(CSV)的重要性

上次我们介绍了>>《制药机械(设备)计算机化系统验证指南》,本期我们就来展开讲讲制药企业为什么需要以及如何进行计算机化系统验证。 计算机化系统验证(Computerized Systems Validation,简称CSV)是一种确保计算机化系统在药…

Java 新手如何使用Spring MVC 中的查询字符串和查询参数?

文章目录 什么是查询字符串和查询参数?步骤 1:步骤 2:步骤 3:步骤 4: 结论 🎉欢迎来到架构设计专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文章专栏&…

利用Jmeter对WebRTC应用进行压力测试

说明:WebRTC是一款开源的多人即时视频API,与一般的http请求不同,webrtc应用实际压力主要是码流 最近负责了一个WebRTC的视频会议性能测试,也蛮有意思的,因此将压测方案、思路记录下来 一、测试思路 1、WebRTC多人会…

安科瑞余压监控系统

安科瑞 崔丽洁 机械加压送风系统中为什么要设计旁通阀控制加压送风的正压值?火灾发生后,又能起到什么作用呢? 发生火灾时,绝大多数的人员伤亡不是因为火,而是烟气,随着可燃物的燃烧产生大量的高温烟气&…

【数据结构与算法】二叉树的知识讲解

目录 一,二叉树的结构深入认识 二,二叉树的遍历 三,二叉树的基本运算 3-1,计算二叉树的大小 3-2,统计二叉树叶子结点个数 3-3,计算第k层的节点个数 3-4,查找指定值的结点 一,二叉…

栈(Stack)的概念+MyStack的实现+栈的应用

文章目录 栈(Stack)一、 栈的概念1.栈的方法2.源码分析 二、MyStack的实现1.MyStack的成员变量2.push方法3.isEmpty方法和pop方法4.peek方法 三、栈的应用1.将递归转化为循环1.调用递归打印2.通过栈逆序打印链表 栈(Stack) 一、 栈…

【Javascript】数组的进阶操作

目录 splice 截取部分元素,保留剩下元素 清空数组 join 自定义分割符 concat 连接 a连接b b连接a a连接b,c 不会改变原数组 splice ⽤于删除或替换元素函数有返回值,返回的是被删除的元素这个⽅法会改变原来的数组 截取部分元素&#xff0…

黑金测评:电视盒子哪款好?双十一热销电视盒子排行榜

大家好,本期我们要分享的测评内容是关于电视盒子,双十一很多网友打算购入电视盒子,但并不了解电视盒子哪款好,本期我们自费测评了最热门的十款电视盒子,最终筛选出了五款最值得入手的电视盒子整理了这份电视盒子排行榜…

rust学习——智能指针

智能指针 在各个编程语言中,指针的概念几乎都是相同的:指针是一个包含了内存地址的变量,该内存地址引用或者指向了另外的数据。 在 Rust 中,最常见的指针类型是引用,引用通过 & 符号表示。不同于其它语言&#xf…

HCIA数据通信——基础设备配置

想了想,为了方便回顾复习,将理论和实践结合起来才是正确的,不然一边理论,又单独做实验这样不方便。 因此之前的文章都删了,还是以华为从头开始吧!实验与理论应用结合起来做。 一,查看设备信息 …

大数据Flink(一百零二):SQL 聚合函数(Aggregate Function)

文章目录 SQL 聚合函数(Aggregate Function) SQL 聚合函数(Aggregate Function) Python UDAF,即 Python AggregateFunction。Python UDAF 用来针对一组数据进行聚合运算,比如同一个 window 下的多条数据、或者同一个 key 下的多条数据等。针对同一组输入数据,Python A…

【Linux】-docker配置容器并打包成镜像

查看本地的镜像: 容器和镜像的关系:容器是Object 镜像是class 一个镜像可以多个容器 docker commit 容器id 新镜像名称:版本号 运行容器: docker run -i -t ubuntu /bin/bash docker exec -it -u root zwbase /bin/bashdocker exec -it 会连接到容器…