限流算法之固定窗口算法

这篇具有很好参考价值的文章主要介绍了限流算法之固定窗口算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


原理

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

示例图

红色代表被拒绝的请求,绿色代表正常被放行的请求,阈值线为实际设置的窗口大小,仅供理解
限流算法之固定窗口算法,算法,算法,java,spring


优缺点

优点

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

缺点

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

示例代码

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

不推荐

原因如下:

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

到了这里,关于限流算法之固定窗口算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud—GateWay之限流

    RequestRateLimiter RequestRateLimiter   GatewayFilter  工厂使用  RateLimiter  实现来确定是否允许当前请求继续进行。如果不允许,就会返回  HTTP 429 - Too Many Requests (默认)的状态。 这个过滤器需要一个可选的  keyResolver  参数和特定于速率限制器的参数。 keyResolver  是一个实现了 

    2024年02月16日
    浏览(59)
  • 【Spring Cloud Alibaba】限流--Sentinel

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel具有如下特性: 丰富的应用场景:承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀,可以实时

    2024年02月15日
    浏览(38)
  • 255.【华为OD机试】最小矩阵宽度(滑动窗口算法-Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年03月13日
    浏览(64)
  • Ubuntu网络设置之固定IP详解

    尊敬的家人们,欢迎观看我的文章!今天,我们将为您介绍Ubuntu22.04操作系统中固定IP的设置方法,帮助您更好地管理网络连接并提高网络稳定性。 在网络中,IP地址是设备在网络上的唯一标识。通常,网络设备(例如计算机、路由器等)会通过动态主机配置协议(DHCP)自动

    2024年02月13日
    浏览(31)
  • 算法:限流之令牌桶算法实现

    本章介绍令牌桶Token Bucket算法在流量限速场景的原理,以及C++实现和相关测试验证。 常见的限流算法有计数限流,固定窗口限流,滑动窗口限流,漏桶算法限流和令牌桶算法限流。令牌桶算法是限流算法的一种,其原理是系统会以一个恒定的速度往桶里放入固定数量的令牌,

    2024年02月09日
    浏览(34)
  • Spring Alibaba Sentinel实现集群限流demo

    1.什么是单机限流? 小伙伴们或许遇到过下图这样的限流配置 又或者是这样的Nacos动态配置限流规则:  以上这些是什么限流?没错,就是单机限流,那么单机限流有什么弊端呢? 假设我们集群部署3台机器(NodeA/NodeB/NodeC),在某时刻,同时有25个请求进来,假设NodeA收到1

    2024年02月15日
    浏览(47)
  • Spring Cloud Gateway自带RequestRateLimiter限流应用及扩展 | Spring Cloud 16

    限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。 在开发高并发系统时有三把利器用来保护系统: 缓存:缓存的目的是提升系统访问速度和增大系统处理容量 降级:降级是当服务器压力剧增的情况下,

    2024年02月10日
    浏览(45)
  • Spring Cloud Gateway 使用 Redis 限流使用教程

    从本文开始,笔者将总结 spring cloud 相关内容的教程 版本选择 为了适应 java8,笔者选择了下面的版本,后续会出 java17的以SpringBoot3.0.X为主的教程 SpringBoot 版本 2.6.5 SpringCloud 版本 2021.0.1 SpringCloudAlibaba 版本 2021.0.1.0 SpringCloudAlibaba github 版本说明截图 SpringCloud 官网:https://sp

    2024年02月07日
    浏览(37)
  • Spring Cloud Gateway集成sentinel进行网关限流

    本文使用版本如下:

    2024年02月09日
    浏览(50)
  • 使用策略模式实现 Spring 分布式和单机限流

    我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。 思路是定义一个 RateLimitStrategy 接口,并分别实现单机限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy 。在 AOP 切面中,根据配置决定使用哪种限流策略。 定义策略

    2024年04月24日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包