限流算法之固定窗口算法

文章目录

  • 原理
    • 示例图
  • 优缺点
    • 优点
    • 缺点
  • 示例代码
    • java
  • 适用场景
  • 不推荐
    • 原因如下:


原理

固定窗口算法是一种常见的限流算法,它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内,对到达的请求进行计数,如果计数达到限制值,则拒绝后续请求,直到窗口结束。

示例图

红色代表被拒绝的请求,绿色代表正常被放行的请求,阈值线为实际设置的窗口大小,仅供理解
在这里插入图片描述


优缺点

优点

  • 易于理解:该实现使用了简单的队列和计数器,易于理解和实现。
  • 高效:该实现使用了文件系统操作来检查文件是否存在和所在的目录是否符合限制,因此效率较高。
  • 可扩展:该实现可以轻松地扩展到处理多个文件类型或目录。
  • 持久化存储:通过使用目录结构,可以将数据持久化存储,以便在程序重启后继续使用。
  • 灵活性:该实现可以根据需要调整窗口大小和目录结构,以适应不同的应用场景。
  • 错误处理:该实现通过检查文件是否存在和目录结构是否正确,可以避免一些常见的错误情况。
  • 并发访问:由于使用了文件系统操作,该实现可以在多线程环境下并发访问。

缺点

  • 文件系统操作可能比较耗时:对于大型文件系统或大量事件的情况下,文件系统操作可能会成为性能瓶颈。这可以通过缓存或优化文件系统访问来解决。
  • 误判风险:如果文件系统中的文件数量超过了窗口大小限制,该实现可能会拒绝一些合法的事件。这可以通过增加额外的检查或调整文件命名规则来减少误判的风险。
  • 数据竞争:由于使用了文件系统操作,该实现可能存在数据竞争的问题。这可以通过使用同步机制或并发控制来解决。

示例代码

java

代码如下(示例):

/*** @Date 2024/1/18 15:42* @Author yang*/
public class FixedWindow {private int windowSize;private long[] timestamps;private int current;public FixedWindow(int windowSize) {this.windowSize = windowSize;this.timestamps = new long[windowSize];this.current = 0;}public void addTimestamp(long timestamp) {System.out.println("时间" + timestamp);System.out.println("当前" + current);timestamps[current] = timestamp;current = (current + 1) % windowSize;}public int getCountWithinWindow(long currentTime, long interval) {int count = 0;System.out.println("count" + count);for (int i = 0; i < windowSize; i++) {if (currentTime - timestamps[i] <= interval) {count++;}}return count;}public static void main(String[] args) {FixedWindow fixedWindow = new FixedWindow(5);fixedWindow.addTimestamp(System.currentTimeMillis() - 10000);fixedWindow.addTimestamp(System.currentTimeMillis() - 8000);fixedWindow.addTimestamp(System.currentTimeMillis() - 5000);fixedWindow.addTimestamp(System.currentTimeMillis() - 2000);fixedWindow.addTimestamp(System.currentTimeMillis() - 1000);System.out.println("最近5秒内发生的事件: " + fixedWindow.getCountWithinWindow(System.currentTimeMillis(), 5000));}
}

适用场景

  1. API接口限流:对于高流量的API接口,可以使用固定窗口算法来限制同时访问的请求数量,避免单个请求对系统造成过大压力。
  2. 网络流量控制:在保证网络稳定性和可靠性的场景中,可以使用滑动窗口算法来动态调整发送数据的速率和数量。
  3. 服务器资源管理:在服务器资源有限的情况下,可以使用滑动窗口算法来控制请求的处理速率和资源分配。

不推荐

原因如下:

固定窗口算法无法处理突发流量,当短时间内有大量请求到达时,请求会直接被拒绝,而无法平滑地控制流量。此外,窗口边界问题也可能导致系统过载,因为在窗口边界处可能会有大量的请求被允许通过,从而导致突发流量。因此,需要合理调整时间窗口大小以应对不同的流量情况。

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

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

相关文章

51单片机_智能家居终端

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统&#xff1f;51单片机的芯片是否具有与WiFi通信的能力&#xff1f;如果有的话&#xff0c;具体有哪些芯片啊&a…

如何正确使用数据库的读写分离

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 背景 在应用系统发展的初期&#xff0c;我们并不知…

使用Matplotlib绘制3d图形

目录 一&#xff1a;绘制一个正方体 二&#xff1a;绘制一个3*3*3魔方 为了绘制立体&#xff0c;主要用到Matplotlib中的一个函数voxels voxels([x, y, z, ], filled, facecolorsNone, edgecolorsNone, **kwargs) 绘制一组填充体素&#xff0c;所有体素在坐标轴上绘制为1x1x…

dubbo入门案例!!!

入门案例之前我们先介绍一下&#xff1a;zookeeper。 Zookeeper是Apacahe Hadoop的子项目&#xff0c;可以为分布式应用程序协调服务&#xff0c;适合作为Dubbo服务的注册中心&#xff0c;负责服务地址的注册与查找&#xff0c;相当于目录服务&#xff0c;服务提供者和消费者只…

Linux shell美化 zsh+oh-my-zsh+power10k

文章目录 安装zsh安装on-my-zsh安装power10k主题安装power10k将oh-my-zsh主题改为power10k字体 设置安装字体配置字体 power10k配置相关插件安装zsh-autosuggestionszsh-syntax-highlighting安装插件完成&#xff0c;重新加载配置文件 美化效果示意&#xff1a; 安装zsh 安装…

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1&#xff1a; sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1&#xff1a; sys int g0/0/0 ip add…

动态住宅代理IP是什么?如何配置使用?

动态住宅代理IP&#xff0c;作为一种高效的网络工具&#xff0c;不仅能够为您的在线活动提供额外的保护层&#xff0c;还能增强匿名性和数据安全。接下来将深入探讨动态住宅代理IP的定义、设置步骤、以及它如何有效保护您的网络隐私和安全。 一、动态住宅代理是什么&#xff1f…

基于改进蝙蝠算法的三维航线规划算法

matlab2020a可正常运行 基于改进蝙蝠算法的三维航线规划资源-CSDN文库

BRC20通证的诞生与未来展望!如何导入bitget教程

BRC-20通证是什么&#xff1f; 嘿&#xff01;你知道BRC-20通证吗&#xff1f;这可是比特币区块链上的超级明星&#xff01;它们不依赖智能合约&#xff0c;而是把JSON代码刻在聪上&#xff0c;聪可是比特币的最小单位哦&#xff01;就像在比特币的乐高积木上盖房子&#xff0…

“重大利好”!以太坊坎昆升级临近!Layer2新玩家Blast不断蚕食市场份额,令竞品汗流浃背?

1月17日&#xff0c;坎昆升级&#xff08;Dencun&#xff09;率先在以太坊Goerli测试网启动&#xff0c;由于Goerli是参与者数量以及网络负载程度最高的测试网&#xff0c;仅次于以太坊主网&#xff0c;因此如果没什么问题&#xff0c;预示着主网升级已经不远。 而现在&#xf…

文件重命名方法:不同路径的文件名大小写如何批量转换技巧

在文件管理中&#xff0c;经常要处理文件重命名的问题&#xff0c;尤其是涉及到不同路径下的文件名大小写转换时。下面来看云炫文件管理器如何批量转换文件名的大小写的技巧&#xff0c;轻松完成这项任务。 准备多个不同路径文件夹&#xff0c;在里面各放几个文件。接下来开始…

重置aws上的ssh默认登录端口

aws上的ec2机器&#xff0c;默认ssh的登录都是22&#xff0c;为了防止被黑&#xff0c;记录下修改该默认端口的方法 修改/etc/ssh/sshd_config文件,将Port 22注释去掉在上面的文件中&#xff0c;加入一行&#xff0c;你想要增加的端口号&#xff0c;格式和22一致注意&#xff1…