限流算法之固定窗口算法

文章目录

  • 原理
    • 示例图
  • 优缺点
    • 优点
    • 缺点
  • 示例代码
    • 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. 服务器资源管理:在服务器资源有限的情况下,可以使用滑动窗口算法来控制请求的处理速率和资源分配。

不推荐

原因如下:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统课程设计-内存管理

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 步骤 3.2 关键代码 3.2.1 显示虚拟内存的基本信息 3.2.2 遍历当前进程的虚拟内存 4 实验结果与分析 5 代码 前言 本实验为课设内容&#xff0c;博客内容为部分报告内容&#xff0c;仅为大家提供参考&#xff0c;请勿直…

【白皮书下载】GPU计算在汽车中的应用

驾驶舱域控制器 (CDC) 是汽车 GPU 的传统应用领域。在这里&#xff0c;它可以驱动仪表板上的图形&#xff0c;与车辆保持高度响应和直观的用户界面&#xff0c;甚至为乘客提供游戏体验。随着车辆屏幕数量的增加和分辨率的提高&#xff0c;对汽车 GPU 在 CDC 中进行图形处理的需…

Azure Machine Learning - 聊天机器人构建

目录 聊天机器人架构概述消耗成本环境准备打开开发环境部署和运行将聊天应用部署到 Azure使用聊天应用从 PDF 文件获取答案使用聊天应用设置更改答复行为 本文介绍如何部署和运行适用于 Python 的企业聊天应用示例。 此示例使用 Python、Azure OpenAI 服务和 Azure AI 搜索中的…

数据库-数据库分类

数据库可以分为关系型数据库和非关系型数据库&#xff0c;常见的数据库如下 关系型数据库 关系型数据库是一种采用关系模型来组织数据的数据库&#xff0c;它以行和列的形式存储数据&#xff0c;以便于用户理解。关系型数据库中的数据以二维表的形式组织&#xff0c;被称为表…

Android CarService源码分析

文章目录 一、CarService的基本架构1.1、Android Automative整体框架1.2、Framework CarService1.3、目录结构1.3.1、CarService1.3.2、Car APP 二、CarService的启动流程2.1、系统启动后在SystemServer进程中启动CarServiceHelperService2.2、CarService启动 三、CarService源…

百度地图实现搜索并在地图上标注,手动点击标注获取经纬度

在代码只需要替换为你自己的key即可。 如何申请key:如何申请百度地图ak?|2023年5月更新版 - 知乎 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>百度地图搜索</title><!-- 引入百度地…

基于内容的图像web检索系统

题目&#xff1a;基于内容的图像在线检索系统 简介&#xff1a;基于内容的图像在线检索系统&#xff08;Content Based Online Image Retrieval , 以下简称 CBOIR&#xff09;&#xff0c;是计算机视觉领域中关注大规模数字图像内容检索的研究分支。典型的CBOIR系统&#xff…

c语言案例双色球

系列文章目录 c语言案例双色球 c语言案例双色球 系列文章目录c语言案例双色球 c语言案例双色球 int main() {srand((unsigned int)time(NULL));//双色球两种原色 红球蓝球&#xff08;61&#xff09;红球1-33 蓝球1-16 打印双色球中奖信息//红色球不能重复 int ball[6];//红球f…

echarts tooltip显示不全问题

在项目里面的tooltip数据特别多&#xff0c;显示不全问题&#xff1a; 1、如果盒子还够大&#xff0c;只是tooltip飘到上面或者下面被覆盖住了&#xff0c;可以考虑confine: true这个属性&#xff0c;将tooltip限制在盒子内; 2、如果盒子比较小&#xff0c;展示不全的话&#…

如何再造宇宙厂所有APP?

本文内容&#xff0c;纯属十年老架构师杜撰&#xff0c;切勿照着实操&#xff0c;可能会给你带来几十亿的流量&#xff0c;怕你的服务器扛不住。 1. 破音 前端用uniapp&#xff0c;花800买个短视频应用模板&#xff0c;后端用golang支持高并发, 数据库用图数据库加elastic se…

本周五上海见 第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛(上海站)即将召开

低时延技术是证券基金期货领域业务系统的核心技术&#xff0c;是打造极速交易系统领先优势的关键&#xff0c;也是证券基金行业关注的前沿技术热点。 1月19日下午&#xff0c;第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛&#xff08;上海站&#xff09;即…

物联网网关与plc怎么连接?

物联网网关与plc怎么连接&#xff1f; 物联网是当今社会中最热门的技术之一&#xff0c;而物联网网关则是连接物联网设备与云平台的核心设备之一。物联网网关在连接各种传感器和设备时起着至关重要的作用。而另一种广泛应用于工业控制和自动化领域的设备是可编程逻辑控制器&…

回馈科教,非凸科技助力第48届ICPC亚洲区决赛

1月12日-14日&#xff0c;“华为杯”第48届国际大学生程序设计竞赛&#xff08;ICPC&#xff09;亚洲区决赛在上海大学成功举办。非凸科技作为此次赛事的支持方之一&#xff0c;希望携手各方共同推动计算机科学和技术的发展。 这是一场智慧的巅峰对决&#xff0c;320支优秀队伍…

机器学习之卷积神经网络

卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此又称为SIANN。卷积神经网络仿照生物的视知觉机制构建,可以进行监督学习和非监督学习,其隐含层内的…

【vsan数据恢复】vsan逻辑架构出现故障的数据恢复案例

VSAN数据恢复环境&#xff1a; 一套有三台服务器节点的VSAN超融合基础架构&#xff0c;每台服务器节点上配置2块SSD硬盘和4块机械硬盘。 每个服务器节点上配置有两个磁盘组&#xff0c;每个磁盘组使用1个SSD硬盘作为缓存盘&#xff0c;2个机械硬盘作为容量盘。三台服务器节点上…

Pyspark 安装(Mac M2版)

引言 本文为个人本地部署pyspark遇到的问题以及解决办法&#xff0c;包含个人的一些理解&#xff0c;仅供参考。设备&#xff1a; Mac M2 安装过程 安装HomeBrew Mac 上用来管理安装包的&#xff0c;可能早期的 Macos 自带但是起码我个人的 Mac 是需要安装的(以下安装方法个…

C++编写、生成、调用so库详解(二)

我们上篇中主要讲了怎么去打包so库 C编写、生成、调用so库详解(一) 这篇我们就来说一些怎么调用so库 目录 1.调用符合JNI标准的so库 2.调用不符合JNI标准的so库 上面说了两种不同类型的so库,我们分别来看一下怎么调用这两种,在调用so库之前,我们先说一下直接调用上面写的C…

TQ7.2 CPG1000A,荧光淬灭剂Tide Quencher 7.2 CPG 1000A,可以用于研究荧光标记分子的动力学行为

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher 7.2 CPG 1000A&#xff0c; TQ7.2 CPG1000A&#xff0c;荧光淬灭剂Tide Quencher 7.2 CPG 1000A 一、基本信息 产品简介&#xff1a;Tide Quencher 7.2 CPG 1000A can quench fluorescence signals. …

如何搭建Z-blog网站并结合内网穿透实现无公网ip访问本地站点

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

消息队列的作用与使用场景?

一、消息队列的作用 队列的主要作用是消除高并发访问高峰&#xff0c;加快网站的响应速度。 在不使用消息队列的情况下&#xff0c;用户的请求数据直接写入数据库&#xff0c;在高并发的情况下&#xff0c;会对数据库造成巨大的压力&#xff0c;同时也使得系统响应延迟加剧。 …