基于python实现限流器-滑动窗口限流
滑动窗口
算法原理
核心思想:是将一个大的时间窗口划分为若干个小的时间窗口,通过对这些小窗口内的数据进行统计和分析,实现更加精细的控制和管理。
- 窗口划分:确定一个大的时间窗口,例如 1 分钟。然后,将这个大窗口划分为若干个小窗口,比如可以划分为 10 个小窗口,每个小窗口的时间长度为 6 秒钟。这些小窗口可以看作是时间轴上的一个个区间,每个区间内的数据都可以单独进行统计和处理。
- 数据统计:在每个小窗口内,对特定的数据进行统计。例如,在网络流量控制中,可以统计在这个小窗口内接收到的数据包数量。通过对每个小窗口内的数据进行统计,可以得到更加详细的信息,以便进行更加精确的控制。
- 窗口滑动:随着时间的推移,窗口会不断地向前滑动。例如,当一个小窗口的时间结束后,下一个小窗口就会开始,窗口会向前移动一个小窗口的长度。
窗口的滑动可以保证对数据的实时监测和控制,及时发现和处理异常情况。 - 控制决策:根据窗口内的数据统计结果,做出相应的控制决策。例如,如果在某个小窗口内接收到的数据包数量超过了一定的阈值,就可以采取限流措施,减少后续数据包的接收。
算法特点
- 平滑限流:滑动窗口算法通过在一个固定时间窗口内逐步滑动子窗口,从而精细地控制请求的流量。相比固定窗口算法,滑动窗口算法能有效避免临界点突然放开导致的流量激增。
- 高适应性:滑动窗口算法适用于请求量变化较大的场景,因为它能够动态调整每个时间段的请求限制,保证整个窗口的请求数平稳。
存在问题
- 存储开销较大:滑动窗口算法通常需要记录多个子窗口的请求计数以计算滑动窗口内的总请求数。这会导致内存开销上升,尤其是在子窗口数量较多的情况下。
- 吞吐量不足:在频繁滑动的过程中,部分请求可能会因为算法过于严格的控制而被拒绝,导致流量利用不充分,尤其在流量突发的情况下可能出现“漏接”请求的情况。
- 边界效应:滑动窗口算法虽然平滑了请求分布,但在窗口边界处,仍然会存在一些无法精确控制的流量跳跃。例如,当滑动窗口正好跨越一个请求高峰区时,可能会导致短暂的流量堆积。
算法实现
from collections import deque
import time
class SlidingWindowRateLimiter:
def __init__(self, limit, interval):
self.limit = limit
self.interval = interval
self.requests = deque()
def allow_request(self):
current_time = time.time()
while self.requests and current_time - self.requests[0] > self.interval:
self.requests.popleft()
if len(self.requests) < self.limit:
self.requests.append(current_time)
return True
return False
# 测试用例
def test_sliding_window_rate_limiter():
limiter = SlidingWindowRateLimiter(limit=5, interval=1)
# 正常限流:在1秒内发出5次请求,应当都能通过
for _ in range(5):
print(limiter.allow_request()) # Expected: True
time.sleep(0.3) # 期间短暂暂停允许窗口滑动
for _ in range(5):
print(limiter.allow_request())
test_sliding_window_rate_limiter()
备注: 本文会同步发布于个人微信公众号(smith成长之旅)。欢迎大家关注
原文地址:https://blog.csdn.net/qq_32763643/article/details/143644771
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!