news 2026/7/22 7:13:08

《手撕高并发限流器:令牌桶 + 漏桶算法实战解析》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《手撕高并发限流器:令牌桶 + 漏桶算法实战解析》

《手撕高并发限流器:令牌桶 + 漏桶算法实战解析》

在高并发系统中,限流器就像闸门,既要保障系统稳定,又不能阻断正常流量。本文将带你从原理出发,手写实现令牌桶与漏桶限流器,构建高性能、可控的 Python 限流组件。


一、为什么你需要限流器?

在真实系统中,我们常常面临以下挑战:

  • 某接口被恶意刷请求,导致服务崩溃。
  • 后端依赖(如数据库、第三方 API)承压过大,响应变慢。
  • 高峰期突发流量冲垮系统,影响正常用户体验。

这时,限流器就派上用场了。它的目标不是“拒绝服务”,而是“有序接纳”,在保护系统的同时,尽可能多地服务用户。


二、限流算法概览:漏桶 vs 令牌桶

1. 漏桶算法(Leaky Bucket)

  • 原理:请求进入一个“桶”,桶以固定速率“漏水”(处理请求)。如果桶满了,新请求被丢弃。
  • 特点
    • 出水速率恒定,适合平滑流量。
    • 无法应对突发流量(突发请求会被直接丢弃)。

2. 令牌桶算法(Token Bucket)

  • 原理:系统以固定速率向桶中放入“令牌”,每个请求需消耗一个令牌。没有令牌的请求被拒绝或等待。
  • 特点
    • 支持突发流量(桶中可积累令牌)。
    • 控制平均速率,灵活性更高。
特性漏桶算法令牌桶算法
控制速率固定出水速率固定发放令牌速率
是否支持突发
实现复杂度简单略高
适用场景视频流、日志写入等API 接口、消息队列等

三、手写实现:Python 限流器实战

我们将分别实现两个限流器类,并提供使用示例。

1. 漏桶算法实现

importtimeimportthreadingclassLeakyBucket:def__init__(self,capacity,leak_rate):self.capacity=capacity# 桶容量self.leak_rate=leak_rate# 每秒漏出请求数self.water=0# 当前水量self.last_check=time.time()self.lock=threading.Lock()defallow_request(self):withself.lock:now=time.time()elapsed=now-self.last_check leaked=elapsed*self.leak_rate self.water=max(0,self.water-leaked)self.last_check=nowifself.water<self.capacity:self.water+=1returnTrueelse:returnFalse

使用示例:

bucket=LeakyBucket(capacity=10,leak_rate=2)# 每秒处理 2 个请求foriinrange(20):ifbucket.allow_request():print(f"[{i}] 请求通过")else:print(f"[{i}] 被限流")time.sleep(0.2)

输出示意:

[0] 请求通过 [1] 请求通过 [2] 请求通过 ... [10] 被限流 [11] 被限流 ...

2. 令牌桶算法实现

classTokenBucket:def__init__(self,capacity,refill_rate):self.capacity=capacity# 最大令牌数self.tokens=capacity self.refill_rate=refill_rate# 每秒补充令牌数self.last_refill=time.time()self.lock=threading.Lock()defallow_request(self):withself.lock:now=time.time()elapsed=now-self.last_refill refill=elapsed*self.refill_rate self.tokens=min(self.capacity,self.tokens+refill)self.last_refill=nowifself.tokens>=1:self.tokens-=1returnTrueelse:returnFalse

使用示例:

bucket=TokenBucket(capacity=5,refill_rate=2)# 每秒补充 2 个令牌foriinrange(15):ifbucket.allow_request():print(f"[{i}] 请求通过")else:print(f"[{i}] 被限流")time.sleep(0.3)

四、实战场景:限流器在 Web 接口中的应用

以 Flask 为例,我们可以将限流器封装为装饰器:

fromflaskimportFlask,jsonify app=Flask(__name__)token_bucket=TokenBucket(capacity=10,refill_rate=5)defrate_limit(func):defwrapper(*args,**kwargs):iftoken_bucket.allow_request():returnfunc(*args,**kwargs)else:returnjsonify({"error":"Too Many Requests"}),429returnwrapper@app.route("/api/data")@rate_limitdefget_data():returnjsonify({"data":"Hello, Python!"})

这样就能轻松为接口加上限流保护,防止恶意刷接口。


五、进阶技巧与优化建议

✅ 精度控制

  • 使用Decimal替代float,避免时间精度误差。
  • 或使用int表示毫秒级时间戳。

✅ 分布式限流

  • 使用 Redis 实现跨进程、跨服务的限流器。
  • 利用 Lua 脚本保证原子性。

✅ 弹性策略

  • 对 VIP 用户放宽限流阈值。
  • 对异常请求记录日志,辅助风控系统。

六、未来展望:限流器的演进方向

  • 与 AI 模型结合,动态调整限流策略。
  • 与服务网格(如 Istio)集成,实现统一流控。
  • 引入滑动窗口算法,实现更平滑的限流体验。

七、总结与互动

本文回顾:

  • 讲解了漏桶与令牌桶的原理与区别。
  • 手写实现了两个限流器类,并结合 Flask 实战演示。
  • 分享了限流器的优化建议与未来趋势。

开放性问题:

  • 你在实际项目中是如何做限流的?遇到过哪些挑战?
  • 除了令牌桶与漏桶,你是否尝试过滑动窗口、计数器等其他算法?

欢迎在评论区留言交流,我们一起构建更强大的 Python 技术社区!


🔍 附录与参考资料

  • Python 官方文档 - time 模块
  • Flask 官方文档
  • Redis 限流实现方案
  • 推荐书籍:
    • 《Python 高级编程》
    • 《流畅的 Python》
    • 《系统性能:企业与云计算性能指南》
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/20 20:05:14

深度学习抠图扩展:Rembg多任务学习实现

深度学习抠图扩展&#xff1a;Rembg多任务学习实现 1. 引言&#xff1a;智能万能抠图 - Rembg 在图像处理与内容创作领域&#xff0c;自动去背景&#xff08;Image Matting / Background Removal&#xff09;一直是高频刚需。无论是电商商品图精修、社交媒体头像设计&#xf…

作者头像 李华
网站建设 2026/7/20 21:46:58

Rembg WebUI扩展:用户认证系统开发

Rembg WebUI扩展&#xff1a;用户认证系统开发 1. 背景与需求分析 1.1 智能万能抠图 - Rembg 在图像处理领域&#xff0c;自动去背景是一项高频且关键的需求。无论是电商商品图精修、社交媒体内容创作&#xff0c;还是设计素材准备&#xff0c;精准的主体提取能力都能极大提…

作者头像 李华
网站建设 2026/7/20 11:42:52

智能抠图Rembg:电商详情页制作全攻略

智能抠图Rembg&#xff1a;电商详情页制作全攻略 1. 引言&#xff1a;智能万能抠图 - Rembg 的崛起 在电商行业&#xff0c;高质量的商品图是提升转化率的关键。传统人工抠图耗时耗力&#xff0c;尤其面对大量SKU时效率低下&#xff1b;而普通自动抠图工具又常因边缘不清晰、…

作者头像 李华
网站建设 2026/7/22 1:08:48

springboot基于Java Web的医院就诊系统医生排班预约挂号电子病历药品(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试 四、代码参考 源码获取 目的 摘要&#xff1a;随着医疗信息化发展&#xff0c;传统就诊模式效率低、管理难。本文设计基于Spring…

作者头像 李华
网站建设 2026/7/14 23:44:40

抖音图片去水印工具:数字水印原理与无损去除技术的深度解析

在短视频与社交媒体内容共享盛行的背景下&#xff0c;用户对无水印高清图片的需求日益增长。然而&#xff0c;手动去除水印常面临效率低、画质损伤等问题。本文将介绍一款专业的抖音图片去水印网站&#xff0c;并从数字水印技术原理、去水印算法逻辑及用户体验优化三个维度展开…

作者头像 李华
网站建设 2026/7/21 22:22:23

【信息科学与工程学】【安全领域】安全基础——第十五篇 网安协同方案06-L5层面协同

L5会话层网络与安全协同方案深度架构一、会话层基础协同方案方案名称核心目标数据设计方法模型设计方法数学方程/算法依赖条件互斥条件数据协同方式协同效果指标1. 会话状态完整性保护​保护会话状态完整性和连续性会话状态模型&#xff1a;S {sid, seq, ack, window, flags, …

作者头像 李华