【架构师之路】每秒崩溃100次到百万并发:四大限流算法如何拯救你的系统?

四大限流算法拯救系统百万并发难题

前言

随着互联网和移动应用的蓬勃发展,系统的稳定性和可靠性变得至关重要。在面对突发流量和恶意攻击等挑战时,限流器算法的重要性愈发凸显。

限流器算法作为保护系统免受过载的有效手段,扮演着关键的角色。它们能够有效地控制请求的处理速率,防止系统被过多请求淹没,从而保障系统的正常运行并提升用户体验。

在这篇文章中,我们将探讨不同类型的限流器算法,包括漏桶算法、令牌桶算法、固定窗口算法和滑动窗口算法,深入剖析它们的原理、特点以及在实际场景中的应用。通过深入了解和合理应用限流器算法,我们能够更好地应对系统面临的挑战,确保系统的稳定性和可靠性,为用户提供更好的服务体验。

一、基础算法演进路径

1. 固定窗口算法(Fixed Window Algorithm):

固定窗口(又称计数器算法,Fixed Window)限流算法,是最简单的限流算法,通过在单位时间内维护的计数器来控制该时间单位内的最大访问量。

  • 工作原理:固定窗口算法将时间划分为固定大小的窗口,每个窗口内的请求次数不能超过预设的阈值。

在这里插入图片描述

下面是一个简单的固定窗口限流器的示例。

public class FixedWindowRateLimiter {
   
   
    private final int limit; // 窗口内允许的最大请求数
    private final long windowSize; // 窗口大小,单位:毫秒
    private AtomicInteger counter = new AtomicInteger(0);
    private long windowStart = System.currentTimeMillis();

    public FixedWindowRateLimiter(int limit, long windowSize) {
   
   
        this.limit = limit;
        this.windowSize = windowSize;
    }

    public synchronized boolean allowRequest() {
   
   
        long currentTime = System.currentTimeMillis();
        if (currentTime - windowStart > windowSize) {
   
   
            // 如果当前时间已经超过了窗口的起始时间,重置计数器和窗口起始时间
            counter.set(0);
            windowStart = currentTime;
        }

        if (counter.get() < limit) {
   
   
            counter.incrementAndGet();
            return true;
        } else {
   
   
            return false; // 达到限流阈值,拒绝请求
        }
    }
}

核心缺陷

  • 临界突刺:窗口切换时可能承受双倍流量冲击(如第0.9秒和第1.1秒各涌入阈值量请求)
  • 精度不足:1秒窗口无法感知500ms内的突发流量

适用场景

  • 低频接口监控
  • 辅助性流量统计

2. 滑动窗口算法(Sliding Window Algorithm):

为了防止瞬时流量,可以将时间窗口细分为多个子窗口(如10个100ms单元),动态统计最近N个子窗口的请求量。

  • 工作原理:滑动窗口算法通过不断滑动时间窗口,控制每个时间窗口内的请求数量,防止请求过载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值