Skip to main content
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

Build docs developers (and LLMs) love