C# (.NET) 中的速率限制:System.Threading.RateLimiting 库指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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                    

推荐