基于python实现限流器-固定窗口限流

44 阅读2分钟

固定窗口

算法原理

原理:在固定的时间窗口内统计请求数量,如果超过设定的阈值就拒绝后续请求。

  1. 时间窗口划分:计数器(固定窗口)算法将时间划分为固定长度的时间段,这个时间段就被称为一个窗口。例如,可以将时间划分为每秒钟一个窗口,或者每分钟一个窗口等。这种划分方式使得算法能够在特定的时间范围内对请求进行计数和限流控制。
  2. 窗口内计数方式:在每个固定窗口内,算法会对进入系统的请求进行计数。每当有一个新的请求到来时,计数器就会增加。可以通过一个简单的变量来实现这个计数器。
  3. 限流操作:当计数达到预先设定的阈值时,算法就会触发限流操作。这个阈值通常是根据系统的处理能力和资源状况来确定的。如果请求计数超过了阈值,那么后续的请求就会被拒绝或者延迟处理,以防止系统过载。

算法特点

  1. 简单易实现:计数器(固定窗口)算法的实现相对简单,只需要一个计数器和一个时间窗口的概念即可。这使得它在一些对性能要求不高或者资源受限的场景下非常实用。
  2. 适用于稳定流量:如果系统的流量比较稳定,并且可以预测,那么计数器(固定窗口)算法可以有效地控制请求的速率,防止系统过载。

存在问题

  1. 临界突发流量:计数器(固定窗口)算法存在临界突发流量的问题。例如,假设窗口大小为 1 分钟,阈值为 60 个请求。在第一个窗口的最后一秒,可能会有大量的请求涌入,使得计数达到 60。然后,在第二个窗口的第一秒,又可能会有大量的请求涌入,这样在两个窗口的交界处就会出现瞬间的高流量,可能会导致系统过载。

算法实现

import time

class FixedWindowRateLimiter:
    def __init__(self, limit, interval):
        self.limit = limit
        self.interval = interval
        self.counter = 0
        self.window_start = time.time()

    def allow_request(self):
        current_time = time.time()
        if current_time - self.window_start >= self.interval:
            self.window_start = current_time
            self.counter = 0
        if self.counter < self.limit:
            self.counter += 1
            return True
        return False

# 测试用例
def test_fixed_window_rate_limiter():
    limiter = FixedWindowRateLimiter(limit=5, interval=1)

    print("Normal case:")
    for _ in range(5):
        print(limiter.allow_request())  # Expected: True
    print(limiter.allow_request())  # Expected: False (达到限制)

test_fixed_window_rate_limiter()