精确掌控并发:分布式环境下并发流量控制的设计与实现(二)

3. 固定窗口

参考:精确掌控并发:分布式环境下并发流量控制的设计与实现(一)-CSDN博客

4. 滑动窗口

滑动窗口算法是一种更为灵活的流量控制方案,它比固定窗口算法能更平滑地处理突发流量。在滑动窗口中,时间窗口是重叠的,这意味着流量的计算是基于过去的一段连续时间内发生的事件。

工作流程:

  1. 窗口定义:确定窗口的大小,例如1秒钟,并设置窗口的滑动间隔,比如100毫秒。
  2. 计数与滑动:每个窗口都有自己的计数器。当一个新请求到达时,增加当前时间窗口及其前面相邻的窗口的计数。
  3. 限制检查:如果任何连续时间段内的请求总数超过阈值,则拒绝新的请求。
  4. 窗口更新:随着时间的推移,不断向前滑动窗口,并更新相应的计数器。

实现细节:

滑动窗口可以通过队列或循环数组来实现。每个窗口对应队列中的一个元素,记录该窗口期间的请求数。当时间滑动时,更新队列头部的元素,并可能将旧的元素出队。

例如,在Redis中,可以使用列表或有序集合来模拟这种滑动窗口。下面是一个Rdis实现的示例,使用有序集合(sorted set)来实现了滑动时间窗口算法:

java 复制代码
public class RateLimiter {
    public static boolean isAllowed(String channel) {
        long currentTimeMillis = Instant.now().toEpochMilli();
        String key = "rate_limiter:" + channel;

        try (Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT)) {
            // 使用Redis的多个命令来实现滑动窗口
            jedis.zremrangeByScore(key, 0, currentTimeMillis - WINDOW_SIZE_IN_SECONDS * 1000);
            long requestCount = jedis.zcard(key);

            if (requestCount < MAX_REQUESTS) {
                jedis.zadd(key, currentTimeMillis, "" + currentTimeMillis);
                jedis.expire(key, WINDOW_SIZE_IN_SECONDS);
                return true;
            } else {
                return false;
            }
        }
    }
}

每个请求都以其发生的时间戳作为分数存储在集合中。通过移除旧于当前时间窗口的请求来维护滑动窗口。通过检查集合中的元素数量,以确定是否超过了设定的最大请求数。

  • zremrangeByScore 用于移除窗口之外的旧请求。
  • zcard 获取当前窗口内的请求数量。
  • zadd 将新请求添加到集合中。

应用场景:

  • API限流:适用于需要平滑处理突发流量的API服务。
  • 动态调整:由于滑动窗口能够更精确地反映最近的流量趋势,它适用于需要动态调整限流策略的场景。比如支付渠道成功率的监控和流量的波动。这个后面单独开个篇章来讲。

注意事项:

  • 资源消耗:相比固定窗口算法,滑动窗口可能需要更多的计算和存储资源。
  • 时间同步:在分布式系统中,需要确保不同节点之间的时间同步,以保证流量计算的准确性。如果应用服务器之间的时间不同步,那么流量就会计算错误。

<未完待续>

相关推荐
珠海西格电力科技1 小时前
微电网控制策略基础:集中式、分布式与混合式控制逻辑
网络·人工智能·分布式·物联网·智慧城市·能源
盈创力和20078 小时前
本地可视 + 超低功耗:带 E-Ink 屏的 LoRa 温湿度终端系统架构与功耗优化实践
系统架构·电子墨水屏·lora温湿度传感器·无线温湿度监测·超低功耗设计
成茂峰9 小时前
软考高级·系统架构设计师 | 三、信息系统基础知识
系统架构·软考高级·系统架构设计师
踩坑小念12 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
笃行客从不躺平15 小时前
Token 复习
java·分布式·spring cloud
小温冲冲15 小时前
系统架构设计师考试:深度精讲软件架构理论与设计实践
系统架构
u01040583617 小时前
分布式淘客系统的配置中心设计:Nacos在多环境配置管理的应用
分布式
犀思云17 小时前
构建全球化多云网格:FusionWAN NaaS 在高可用基础设施中的工程实践
运维·网络·人工智能·系统架构·机器人
迎仔18 小时前
01-Hadoop 核心三剑客通俗指南:从“单机搬砖”到“包工队”
大数据·hadoop·分布式
ALex_zry18 小时前
分布式缓存与微服务架构的集成
分布式·缓存·架构