C# (.NET) 中的速率限制:System.Threading.RateLimiting 库完整指南
在现代 Web 应用程序和微服务中,控制资源负载至关重要。Rate Limiting(速率限制)是一种防止 API、数据库或其他组件被过度使用的机制。在 .NET 生态系统中,内置的 System.Threading.RateLimiting 库提供了灵活且高性能的工具来实现速率限制。本文将详细解析其功能、架构和使用示例。
什么是 System.Threading.RateLimiting?
System.Threading.RateLimiting 是 .NET 7 及更高版本中包含的一个库。它提供了各种速率限制策略的抽象和实现。核心类是 RateLimiter,它根据定义的规则管理对资源的访问,允许或拒绝请求。
核心概念
- RateLimiter — 所有实现都继承自的基类。
- Acquire / TryAcquire — 用于获取许可的同步方法。
- AcquireAsync / WaitAsync — 允许等待限制释放的异步方法。
- Metadata — 关于限制的附加信息(例如,重置时间)。
内置速率限制策略
该库支持四种主要策略:
1. 固定窗口 (Fixed Window)
请求按固定长度的时间窗口分组。如果超过限制,请求将被拒绝,直到下一个窗口开始。
using System.Threading.RateLimiting;
var options = new FixedWindowRateLimiterOptions{ PermitLimit = 10, Window = TimeSpan.FromSeconds(1), QueueProcessingOrder = QueueProcessingOrder.OldestFirst, QueueLimit = 0};
var limiter = new FixedWindowRateLimiter(options);
for (int i = 0; i < 15; i++){ using var lease = await limiter.AcquireAsync(); if (lease.IsAcquired) { Console.WriteLine($"请求 {i} 已执行"); } else { Console.WriteLine($"请求 {i} 被拒绝"); }}2. 滑动窗口 (Sliding Window)
与固定窗口类似,但窗口会随每个请求“滑动”,提供更平滑的限制。它被划分为多个段 (segment)。
var slidingOptions = new SlidingWindowRateLimiterOptions{ PermitLimit = 10, Window = TimeSpan.FromSeconds(1), SegmentsPerWindow = 4, QueueLimit = 0};
var slidingLimiter = new SlidingWindowRateLimiter(slidingOptions);3. 令牌桶 (Token Bucket)
最流行的算法之一。桶中包含一定数量的“令牌”。令牌以指定的速率添加。请求消耗一个或多个令牌。如果桶为空,则请求等待或被拒绝。
var tokenOptions = new TokenBucketRateLimiterOptions{ TokenLimit = 100, QueueLimit = 0, ReplenishmentPeriod = TimeSpan.FromSeconds(1), TokensPerPeriod = 10, AutoReplenishment = true};
var tokenLimiter = new TokenBucketRateLimiter(tokenOptions);4. 并发限制器 (Concurrency Limiter)
限制同时执行的请求数量。适用于管理并发性,而不是速率。
var concurrencyOptions = new ConcurrencyLimiterOptions{ PermitLimit = 5, QueueLimit = 10};
var concurrencyLimiter = new ConcurrencyLimiter(concurrencyOptions);在 ASP.NET Core 中使用 RateLimiter
从 .NET 7 开始,速率限制可以轻松集成到 ASP.NET Core 中间件中。注册服务和配置策略:
// Program.csbuilder.Servi