发布时间:2026/9/1 11:36:37
API 限流方案选择指南 限流是个听起来很简单的问题请求太多拦一拦就行。但真到实现的时候你会发现「怎么拦」的答案一直在变——被业务规模一层层逼着升级。起点固定窗口计数器最直觉的方案在内存里记一个计数器当前这一秒来了多少请求超过阈值就拒。# 伪代码不是让你抄counter0window_startnow()ifnow()-window_start1s:counter0window_startnow()ifcounterlimit:reject()counter1这个方案够简单十几行代码就搞定。单机、流量均匀、对准确性要求不高的时候完全够用。但它有两个天生的缺陷。第一窗口边界的突刺上一秒的最后 100ms 和下一秒的最初 100ms在窗口计数器看来是两个不同的窗口但实际加在一起能过 2 倍的阈值。第二计数器在内存里重启就丢多实例也不共享。滑动窗口被窗口边界逼出来的窗口边界的问题逼出了滑动窗口。不再按「这一秒」来计数而是记下每个请求的时间戳看过去 1 秒内有多少个。精度上去了但代价也跟着来了你要为每个请求存一条时间戳记录。高 QPS 下这个记录集合本身就会膨胀成内存黑洞。而且清理过期记录的逻辑也从 O(1) 变成了 O(n)。这时候你就得想清楚了是为了精确限流多花这些内存还是够用就行分布式限流单机不够用了等你上了多实例单机计数器的问题就暴露了每个实例各自计数三个实例每个限 100实际能过 300。你当然可以把阈值除以实例数但实例数是动态的——扩缩容、重启、发版数量一直在变。静态除法永远不准。这时候自然会想到一个集中的计数器放在 Redis 里。最简单的 Redis 限流INCR keyEXPIRE key 1。但这又回到固定窗口的问题——窗口边界依然有突刺。而且INCR和EXPIRE是两次调用中间断了 key 就永远不清你得用 Lua 脚本把两条命令包成原子操作。滑动窗口也可以放 Redis用ZADD记录每个请求的时间戳ZREMRANGEBYSCORE清理过期的ZCARD数个数。每个请求三次 Redis 操作都成功才放过。延迟增加了Redis 的负载也增加了。这里的问题是你的 QPS 多高每个请求都要三次 Redis 调用Redis 能不能撑住令牌桶换个思路不记录请求滑动窗口的痛点是每个请求都要记录和清理。令牌桶换了个思路不记录请求记录令牌。以固定速率往桶里加令牌请求来了先拿令牌拿不到就拒。桶的大小就是你能承受的突发上限。没令牌等于被限流逻辑简单。单机实现极其轻量一个计数变量加一个定时器补充令牌。Redis 实现也简单DECR一个 key 看是不是负数就行。但令牌桶有个不太容易一开始就注意到的问题突发和速率的平衡在桶大小上。桶太大突发能过很多保护不了下游桶太小正常波动也被误杀。这个值很难一次性设对要靠线上观察和调参。漏桶连突发也不允许令牌桶是「固定速率放行」漏桶是「固定速率排出」。想象一个队列请求进来先排队按固定速率从队列里取出处理。进来的速度可以忽高忽低出去的速度始终均匀。它解决了令牌桶的问题下游收到的请求速率绝对平滑不会有任何突发。但它引入了新的代价排队等于延迟。请求量大的时候排在后面的请求可能已经超时了但漏桶还在老老实实处理它。怎么选到这儿你可能会觉得漏桶最完善但实际工程中令牌桶才是用得最多的。不是因为谁更好是因为大多数场景下你不需要绝对的平滑你需要的是一套够简单、能扛住典型突发、Redis 能撑住的方案。回过头来看不是比哪个方案更精确是想清楚你卡在哪单机跑、流量不大、计数器丢了也无所谓 → 固定窗口。简单到没理由不用。单机但想精确一点 → 滑动窗口。多出来的内存就当换精度。多实例且要精确的分布式限流 → Redis 滑动窗口。但要掂量一下每个请求三次 Redis 调用的开销。QPS 高、Redis 不想被频繁调用 → 令牌桶。一个DECR就完事轻量到你甚至可以在网关层就做了。下游极其脆弱、一点流量尖刺都不能有 → 漏桶。比如你在调按量付费的第三方 API多打一次就多收一次钱。不需要精确限流只是想做个流控保护 → 回到令牌桶。这就是为什么大多数网关Nginx、Kong、APISIX默认都是令牌桶——够用、够轻、够简单。最终选什么不取决于「滑动窗口比固定窗口好」而是你当前服务的 QPS、实例数、对 Redis 的依赖程度、以及下游能承受多大的突发。

相关新闻

2026/9/1 11:31:37

我最讨厌的库存周转分析,终于被WorkBuddy干掉了

每到月底,库存分析就成了最不想碰的工作:打开库存表、销售表、采购表,清洗数据、匹配SKU、算周转率,再一层层下钻到品类和商品,最后整理成一份分析报告。真正麻烦的不是公式,而是同样的工作,每个…

2026/9/1 11:31:37

博世秋招软件工程笔试复盘:题型分布、避坑指南与备考策略

每年一到七八月份,各种秋招信息就像潮水一样涌过来,博世这种德企巨头自然也是很多软件工程专业同学的重点目标。2023年博世秋招软件工程岗笔试,我自己完整走了一遍流程,也帮好几个学弟学妹做了复盘,把题型、难度、备考…

2026/9/1 11:31:37

死或生6排位录像复盘:Nico对瑞秋的距离控制与决策解析

《死或生6:最后一战》这套排位录像系列更到第016期,正好是 Nico 对阵瑞秋。DOA6 的排位录像并不少,但大多数玩家看录像只盯着连段伤害,忽略了真正的信息量在回合决策上。Nico 是 DOA6 加入的科技型角色,打法以电击棒的…

2026/9/1 11:46:37

RelArena:关系学习领域的标准化基准测试框架实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/1 11:46:37

从改参考文献到写工具:一个毕设开发者的复盘

从改参考文献到写工具:一个毕设开发者的复盘 在我大学时期,写毕设的经历让我对参考文献格式的处理感到无比痛苦。每当我尝试将参考文献调整为标准格式时,面对中英文字符的混淆和斜体的要求,我总是熬夜到天亮。更糟糕的是&#xf…

2026/9/1 11:46:37

十分钟做出能开机的 U 盘:Rufus 手把手教你做系统启动盘

十分钟做出能开机的 U 盘:Rufus 手把手教你做系统启动盘 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus U 盘里明明拷了系统镜像,电脑一插却进不了安装界面——多半是这盘…

2026/9/1 11:46:37

计算机毕业设计之基于Java web的电影院选票系统

时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,电影院选票系统当然不能排除在外。电影院选票系统是在实际应用和软件工程的开发原理之上,运用java语言,前台Vue框架以及后…

2026/9/1 11:41:37

Replit实战:用云端环境快速搭建Growth Skills增长工具集

各位开发者朋友,大家好。 最近在梳理产品增长相关技能时,发现一个很实的痛点:增长方法论看了不少,但真正想落地一个小实验、跑通一个用户反馈闭环,往往需要同时准备前端、后端、数据库和定时任务,光是环境…

2026/8/31 1:05:20

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/1 8:27:47

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/1 7:04:43

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…