限流算法介绍

embedded/2025/2/1 3:23:34/

限流


什么是限流

  • 限流,限制流量,限制用户在给定时间内向服务器请求某些内容的次数。
  • 限制资源的使用从而控制用户被允许执行的操作数量。
  • 通常,限流用于 API、Web 服务和网络设备,以维持稳定性和性能。
为什么要限流
  • 防止滥用:限制请求以防止端点泛滥,确保数据完整性和可用性。
  • 确保公平使用:在用户之间平均分配资源,防止单个用户垄断服务资源,提高整体满意度。
  • 保持性能:防止服务器过载,减少延迟,确保高效的服务交付,增强用户体验。
  • 成本管理:控制资源使用情况,以防止意外的基础设施成本,有效地管理资源。
  • 安全性:通过限制请求率来减轻 DoS 攻击,并保护网站可用性和可靠性免受恶意过载尝试

算法

令牌桶算法
  • 通过生成令牌并将其放入桶中来控制流量。每个请求需要获取一个令牌才能被处理。令牌以固定速率生成,桶的容量有限。
class TokenBucket:def __init__(self, rate, capacity):self.rate = rateself.capacity = capacityself.tokens = capacityself.last_refill = time.time()def allow_request(self):now = time.time()self.tokens += (now - self.last_refill) * self.rateself.tokens = min(self.tokens, self.capacity)self.last_refill = nowif self.tokens >= 1:self.tokens -= 1return Trueelse:return False
漏桶算法
  • 请求以固定速率从桶中流出,桶会在接收到请求时进行填充。超出桶容量的请求会被丢弃。请求的处理速率是恒定的。
class LeakyBucket:def __init__(self, capacity, leak_rate):self.capacity = capacity  # 桶最大空间self.leak_rate = leak_rate  # 流出速率 (每秒)self.bucket_size = 0  # 当前桶空间self.last_updated = time.time()  # 最后更新桶时间def add_data(self, data_size):# 计算距离上次更新的时间间隔current_time = time.time()time_elapsed = current_time - self.last_updatedself.last_updated = current_time# 根据流出速率重新计算桶剩余空间self.bucket_size = max(0, self.bucket_size - self.leak_rate * time_elapsed)# 添加数据到桶中self.bucket_size = min(self.bucket_size + data_size, self.capacity)# 判断桶是否溢出if self.bucket_size >= data_size:self.bucket_size -= data_sizereturn Trueelse:return False# Example usage:
bucket = LeakyBucket(capacity=10, leak_rate=1)  # 配置一个桶,最大空间=10,流出速率是=1/s
data_to_send = 5  # 本次要占用的桶空间大小
if bucket.add_data(data_to_send):print(f"Data of size {data_to_send} sent successfully.")
else:print(f"Bucket overflow. Unable to send data of size {data_to_send}.")
固定窗口算法
  • 在一个固定的时间段内对请求进行计数,并根据这个计数来决定是否允许新的请求。
class FixedWindow:def __init__(self, window_size, max_requests):self.window_size = window_sizeself.max_requests = max_requestsself.requests = 0self.window_start = time.time()def allow_request(self):now = time.time()if now - self.window_start >= self.window_size:self.requests = 0self.window_start = nowif self.requests < self.max_requests:self.requests += 1return Trueelse:return False
滑动窗口算法
  • 维护一个时间窗口,记录在特定时间段内的请求数量。能够动态计算过去一段时间内的请求频率,从而进行限流。
class SlidingWindow:def __init__(self, window_size, max_requests):self.window_size = window_sizeself.max_requests = max_requestsself.requests = deque()def allow_request(self):now = time.time()# 弹出所有非当前窗口的请求while self.requests and self.requests[0] <= now - self.window_size:self.requests.popleft()# 如果if len(self.requests) < self.max_requests:self.requests.append(now)return Trueelse:return False

限流算法的优缺点

算法灵活性实现复杂度场景
令牌桶算法突发流量友好简单API 限流、网络流量控制
漏桶算法平滑流量友好简单视频流传输、数据上传
固定窗口算法平滑流量友好简单定时任务、低频流量
滑动窗口算法精确控制流量中等实时数据处理、在线游戏

扩展

  • 通过动态配置算法入参,可以实现实现灵活的限流策略。
  • 分布式中,计数器可以通过中间件实现,如redis,但也引入了中间件维护的职责。
  • 对于算法,可以引入自己业务需要的其他规则,以适配自己的需求。

参考

  • https://www.geeksforgeeks.org/rate-limiting-algorithms-system-design/#handling-bursts-and-spikes

http://www.ppmy.cn/embedded/158523.html

相关文章

uniapp版本升级

1.样式 登录进到首页&#xff0c;弹出更新提示框&#xff0c;且不可以关闭&#xff0c;侧边返回直接退出&#xff01; 有关代码&#xff1a; <uv-popup ref"popupUpdate" round"8" :close-on-click-overlay"false"><view style"…

电脑开机键一闪一闪打不开

家人们谁懂啊&#xff01;本来打算愉快地开启游戏时光&#xff0c;或者高效处理工作任务&#xff0c;结果按下电脑开机键后&#xff0c;它就只是一闪一闪的&#xff0c;怎么都打不开。相信不少朋友都遭遇过这种令人崩溃的场景&#xff0c;满心的期待瞬间化为焦急与无奈。电脑在…

MacOS 如何映射快捷键

MacOS 如何映射快捷键 背景步骤说明映射示例 背景 参考文档 macOS Sequoia 现在要求热键注册至少使用一个非 shift 或 option 的修饰符&#xff0c;对于原来使用快捷键 option * 的功能无法使用。通过软件 karabiner-element.app 做键盘映射&#xff0c;可以实现原有功能继续…

爱快 IK-X9 吸顶AP 简单开箱评测和拆解,三频WiFi7,BE5000,2.5G网口

爱快&#xff08;iKuai&#xff09; IK-X9 三频高密度吸顶AP 简单开箱评测和拆解&#xff0c;三频Wi-Fi7&#xff08;2.4GHz&#xff1a;688Mbps、5.1GHz&#xff1a;2882Mbps、5.8GHz&#xff1a;1441Mbps&#xff09;&#xff0c;BE5000&#xff0c;2.5G网口 用的爱快系统做…

「Unity3D」在Unity中使用C#控制显示Android的状态栏

Unity打包的Android默认都是全屏&#xff0c;如果想要在真机上显示状态栏&#xff0c;就需要额外设置&#xff0c;有两种方式&#xff1a; 第一种&#xff0c;使用Android的Java代码去控制&#xff0c;然后以插件的方式放到Unity中&#xff0c;被C#调用。第二种&#xff0c;使…

Kiwi 安卓浏览器本月停止维护,扩展功能迁移至 Edge Canary

IT之家 1 月 25 日消息&#xff0c;科技媒体 Android Authority 今天&#xff08;1 月 25 日&#xff09;发布博文&#xff0c;报道称 Kiwi 安卓浏览器将于本月停止维护&#xff0c;相关扩展支持功能已整合到微软 Edge Canary 浏览器中。 开发者 Arnaud42 表示 Kiwi 安卓浏览器…

怎样在PPT中启用演讲者视图功能?

怎样在PPT中启用演讲者视图功能&#xff1f; 如果你曾经参加过重要的会议或者演讲&#xff0c;你就会知道&#xff0c;演讲者视图&#xff08;Presenter View&#xff09;对PPT展示至关重要。它不仅能帮助演讲者更好地掌控演讲节奏&#xff0c;还能提供额外的提示和支持&#…

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后&#xff1a; 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…