In-memory rate limiting with fixed window, sliding window, and token bucket algorithms.
dotnet add package Philiprehberger.RateLimiterIn-memory rate limiting with fixed window, sliding window, and token bucket algorithms.
dotnet add package Philiprehberger.RateLimiter
using Philiprehberger.RateLimiter;
Tokens refill at a steady rate up to a maximum capacity. Good for smoothing bursts.
var limiter = new TokenBucketLimiter(
capacity: 10,
refillRate: 5,
refillInterval: TimeSpan.FromSeconds(1));
if (limiter.TryAcquire())
{
// proceed with operation
}
Permits reset at the start of each time window.
var limiter = new FixedWindowLimiter(
limit: 100,
window: TimeSpan.FromMinutes(1));
if (limiter.TryAcquire())
{
// proceed with operation
}
Divides the window into segments for smoother rate limiting than fixed windows.
var limiter = new SlidingWindowLimiter(
limit: 100,
window: TimeSpan.FromMinutes(1),
segments: 10);
if (limiter.TryAcquire())
{
// proceed with operation
}
All limiters support async waiting until a permit is available:
await limiter.WaitAsync(ct: cancellationToken);
// permit acquired
Use keys to apply independent rate limits per user, IP, or API endpoint:
if (limiter.TryAcquire(key: "user-42"))
{
// user-42 has permits remaining
}
var limiter = RateLimiterBuilder.Create()
.TokenBucket(capacity: 10, refillRate: 5, per: TimeSpan.FromSeconds(1))
.PerKey()
.Build();
IRateLimiter| Member | Description |
|---|---|
Available | Number of permits currently available |
Limit | Maximum number of permits |
TryAcquire(key?) | Acquires a permit without blocking. Returns true if successful |
WaitAsync(key?, ct) | Waits asynchronously until a permit is available |
TokenBucketLimiter| Constructor Parameter | Description |
|---|---|
capacity | Maximum number of tokens |
refillRate | Tokens added per refill interval |
refillInterval | Time between refills |
FixedWindowLimiter| Constructor Parameter | Description |
|---|---|
limit | Maximum permits per window |
window | Window duration |
SlidingWindowLimiter| Constructor Parameter | Description |
|---|---|
limit | Maximum permits per window |
window | Window duration |
segments | Number of sub-segments (default 10) |
RateLimiterBuilder| Method | Description |
|---|---|
Create() | Creates a new builder |
TokenBucket(capacity, refillRate, per) | Configures token bucket algorithm |
FixedWindow(limit, window) | Configures fixed window algorithm |
SlidingWindow(limit, window, segments) | Configures sliding window algorithm |
PerKey() | Enables per-key partitioning |
Build() | Builds the configured rate limiter |
dotnet build src/Philiprehberger.RateLimiter.csproj --configuration Release
If you find this project useful: