The rate limiter strategy controls the rate of executions to prevent resource exhaustion and ensure fair usage.
RateLimiterStrategyOptions
Configures the rate limiter resilience strategy.
public class RateLimiterStrategyOptions : ResilienceStrategyOptions
Properties
RateLimiter
Func<RateLimiterArguments, ValueTask<RateLimitLease>>?
default:"null"
A rate limiter delegate that produces RateLimitLease instances.If null, the strategy uses a ConcurrencyLimiter created with DefaultRateLimiterOptions.
DefaultRateLimiterOptions
ConcurrencyLimiterOptions
required
The default rate limiter options used when RateLimiter is null.Default configuration:
PermitLimit: 1000
QueueLimit: 0
OnRejected
Func<OnRateLimiterRejectedArguments, ValueTask>?
default:"null"
An event raised when the execution of a user-provided callback is rejected by the rate limiter.
Extension Methods
Add rate limiter strategies to a resilience pipeline:
public static ResiliencePipelineBuilder AddRateLimiter(
this ResiliencePipelineBuilder builder,
RateLimiterStrategyOptions options)
public static ResiliencePipelineBuilder<TResult> AddRateLimiter<TResult>(
this ResiliencePipelineBuilder<TResult> builder,
RateLimiterStrategyOptions options)
Usage Examples
Using Default Concurrency Limiter
using System.Threading.RateLimiting;
var rateLimiterOptions = new RateLimiterStrategyOptions
{
DefaultRateLimiterOptions = new ConcurrencyLimiterOptions
{
PermitLimit = 100,
QueueLimit = 50
},
OnRejected = args =>
{
Console.WriteLine("Rate limit exceeded!");
return ValueTask.CompletedTask;
}
};
var pipeline = new ResiliencePipelineBuilder()
.AddRateLimiter(rateLimiterOptions)
.Build();
Using Custom Rate Limiter
using System.Threading.RateLimiting;
var tokenBucket = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions
{
TokenLimit = 100,
TokensPerPeriod = 10,
ReplenishmentPeriod = TimeSpan.FromSeconds(1),
QueueLimit = 0
});
var rateLimiterOptions = new RateLimiterStrategyOptions
{
RateLimiter = args => tokenBucket.AcquireAsync(permitCount: 1, args.Context.CancellationToken)
};
var pipeline = new ResiliencePipelineBuilder()
.AddRateLimiter(rateLimiterOptions)
.Build();
Sliding Window Rate Limiter
var slidingWindow = new SlidingWindowRateLimiter(new SlidingWindowRateLimiterOptions
{
PermitLimit = 100,
Window = TimeSpan.FromMinutes(1),
SegmentsPerWindow = 6
});
var rateLimiterOptions = new RateLimiterStrategyOptions
{
RateLimiter = args => slidingWindow.AcquireAsync(permitCount: 1, args.Context.CancellationToken)
};
Built-in Rate Limiters
.NET provides several built-in rate limiters in the System.Threading.RateLimiting namespace:
- ConcurrencyLimiter: Limits the number of concurrent executions
- TokenBucketRateLimiter: Token bucket algorithm
- SlidingWindowRateLimiter: Sliding window algorithm
- FixedWindowRateLimiter: Fixed window algorithm