速率限制算法
比较固定窗口、滑动窗口、令牌和并发限制器。
速率限制算法 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
为什么要进行速率限制
速率限制规定客户端在一段时间内可以发出的请求数量上限。它可以保护 API 免受滥用、失控客户端和意外流量激增的影响,并确保各用户公平共享容量。
// e.g. allow 100 requests per minute per API key内置速率限制
从 .NET 7 开始,ASP.NET Core 在 Microsoft.AspNetCore.RateLimiting 中提供了完善的速率限制中间件,并内置四种算法。
// Algorithms: Fixed Window, Sliding Window,
// Token Bucket, Concurrency固定窗口
固定窗口算法允许在每个固定时间块内发出 N 个请求。时间块结束时,计数器会重置为零。
这种算法很简单,但窗口边界处的突发流量可能会使实际速率短暂翻倍。
// 10 requests per 60s window
// All 10 used at 0:59, 10 more at 1:00 -> 20 in 2 seconds滑动窗口
滑动窗口通过将窗口划分为多个区段,并向前滚动已过期的区段,平滑边界问题,因此限制会应用于任意连续窗口。
// 10 requests per 60s, 6 segments of 10s each
// The count slides as each segment expires令牌桶
令牌桶维护一个令牌桶。每个请求消耗一个令牌;令牌以稳定速率补充。它允许在桶容量范围内进行短时突发,同时保持长期平均速率。
// Bucket = 10 tokens, refill 5 tokens / 10s
// Burst of 10 allowed, then 5 every 10 seconds并发限制器
并发限制器有所不同:它限制的是同时处理中的请求数,而不是单位时间内的请求数。非常适合保护开销较大的操作。
// At most 5 concurrent requests in flight
// The 6th waits in the queue or is rejected队列
每个限制器都可以将超出限制的请求加入队列,而不是立即拒绝。QueueLimit 设置队列大小,QueueProcessingOrder 设置公平顺序(最早或最新的请求优先)。
// QueueLimit = 2, OldestFirst
// Over-limit requests wait if a slot exists, else get 503/429选择算法
根据目标选择算法:
- 固定窗口:最简单,适用于许多场景。
- 滑动窗口:更加平滑,可以避免边界处的突发流量。
- 令牌桶:允许受控的突发流量。
- 并发:限制同时负载,而不是速率。
// Bursty clients -> token bucket
// Expensive endpoint -> concurrency分区
限制会按分区键应用——通常是用户、API 密钥或 IP——因此某个流量过大的客户端无法耗尽所有人的配额。单个共享分区会将所有流量合并限制。
// Partition by user id, IP, or API key
// Each partition gets its own independent counter客户端看到的内容
被拒绝的请求会返回 HTTP 429 请求过多。行为良好的 API 还会返回 Retry-After 标头,告知客户端何时可以重试。
// HTTP/1.1 429 Too Many Requests
// Retry-After: 30速率限制、节流与配额的区别
相关概念:速率限制约束短期频率,配额约束较长期的总量(每天或每月),而节流会降低速度而不是拒绝请求。该中间件专注于速率限制。
// rate limit: 100/min quota: 10000/day快速检查
测试您对这些算法的理解。
回顾
您了解了速率限制的概念:
- 四种算法:固定窗口、滑动窗口、令牌桶和并发。
- 令牌桶允许突发流量;并发限制器限制同时负载。
- 限制按分区键应用;队列可以平缓溢出流量。
- 被拒绝的请求会收到带有
Retry-After的429响应。
接下来:配置中间件。
常见问题解答
「速率限制算法」课时是免费的吗?
是的 — 「速率限制算法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「速率限制算法」这节课中我会学到什么?
比较固定窗口、滑动窗口、令牌和并发限制器。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「速率限制算法」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。