PollyRateLimiter 1.0.2
dotnet add package PollyRateLimiter --version 1.0.2
NuGet\Install-Package PollyRateLimiter -Version 1.0.2
<PackageReference Include="PollyRateLimiter" Version="1.0.2" />
<PackageVersion Include="PollyRateLimiter" Version="1.0.2" />
<PackageReference Include="PollyRateLimiter" />
paket add PollyRateLimiter --version 1.0.2
#r "nuget: PollyRateLimiter, 1.0.2"
#:package PollyRateLimiter@1.0.2
#addin nuget:?package=PollyRateLimiter&version=1.0.2
#tool nuget:?package=PollyRateLimiter&version=1.0.2
PollyRateLimiter
Convenience extension methods for Polly v8 resilience pipelines.
Polly v8 ships with AddConcurrencyLimiter out of the box, but leaves FixedWindow, SlidingWindow, and TokenBucket as bring-your-own. This package fills that gap with one-liner extension methods for all three strategies on top of System.Threading.RateLimiting.
Install
dotnet add package PollyRateLimiter
Usage
using PollyRateLimiter;
// Fixed window: 100 requests per second
var pipeline = new ResiliencePipelineBuilder()
.AddFixedWindowRateLimiter(permitLimit: 100, window: TimeSpan.FromSeconds(1))
.Build();
// Sliding window: 100 requests per second, smoothed into 4 segments
var pipeline = new ResiliencePipelineBuilder()
.AddSlidingWindowRateLimiter(permitLimit: 100, window: TimeSpan.FromSeconds(1), segmentsPerWindow: 4)
.Build();
// Token bucket: burst up to 200, replenish 50 per second
var pipeline = new ResiliencePipelineBuilder()
.AddTokenBucketRateLimiter(tokenLimit: 200, tokensPerPeriod: 50, replenishmentPeriod: TimeSpan.FromSeconds(1))
.Build();
Queue limit
By default, executions that exceed the limit are rejected immediately (queueLimit: 0). Pass a positive value to queue them instead:
var pipeline = new ResiliencePipelineBuilder()
.AddFixedWindowRateLimiter(permitLimit: 10, window: TimeSpan.FromSeconds(1), queueLimit: 5)
.Build();
OnRejected callback
Use the optional configure callback to attach an OnRejected handler or change other RateLimiterStrategyOptions:
var pipeline = new ResiliencePipelineBuilder()
.AddTokenBucketRateLimiter(
tokenLimit: 100,
tokensPerPeriod: 20,
replenishmentPeriod: TimeSpan.FromSeconds(1),
configure: opts => opts.OnRejected = args =>
{
logger.LogWarning("Rate limit exceeded. RetryAfter: {RetryAfter}", args.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retry) ? retry : TimeSpan.Zero);
return ValueTask.CompletedTask;
})
.Build();
Generic builder
All methods work with ResiliencePipelineBuilder<T> too:
var pipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddFixedWindowRateLimiter(permitLimit: 50, window: TimeSpan.FromSeconds(1))
.AddRetry(new RetryStrategyOptions<HttpResponseMessage>())
.Build();
Comparison with Polly built-ins
| Strategy | Polly built-in | PollyRateLimiter |
|---|---|---|
| Concurrency | AddConcurrencyLimiter(maxConcurrency) |
— |
| Fixed window | ❌ | AddFixedWindowRateLimiter(permits, window) |
| Sliding window | ❌ | AddSlidingWindowRateLimiter(permits, window) |
| Token bucket | ❌ | AddTokenBucketRateLimiter(capacity, perPeriod, period) |
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Polly (>= 8.7.0)
- Polly.RateLimiting (>= 8.7.0)
- System.Threading.RateLimiting (>= 8.0.0)
-
net9.0
- Polly (>= 8.7.0)
- Polly.RateLimiting (>= 8.7.0)
- System.Threading.RateLimiting (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1.0.1: Added net9.0 target; fixed Authors field; added XML IntelliSense documentation; improved discoverability tags; added Copyright.