ratelimit
Rate limiting for Rust — GCRA (Generic Cell Rate Algorithm) with pluggable backends (in-memory, Redis) and optional Tower layer integration.
Features
- GCRA algorithm — smooth, memory-efficient rate limiting
- In-memory backend via
DashMap(default) - Optional Redis backend for distributed deployments
- Tower
LayerwithX-RateLimit-*response headers - Configurable burst / token-bucket capacity
What is GCRA?
The Generic Cell Rate Algorithm treats each key as a leaky bucket. A request is allowed if the bucket has capacity; otherwise it is rejected. Tokens are replenished at a constant rate derived from the desired RPS/RPM.
allowed if: ema ≤ limit
where ema(t) = max(0, ema(t-1) - (t - t_last)) + 1
This yields the same behaviour as a token bucket but only stores the last
emission time — one Instant per key.
Quick Start
use ;
async
Presets
| Constructor | Rate | Burst |
|---|---|---|
Quota::per_second |
n / s | n |
Quota::per_minute |
n / 60 s | n |
Quota::per_hour |
n / 3600 s | n |
Override burst with .allow_burst(n).
Tower Integration
use ;
use RateLimitLayer;
use ;
let backend = new;
let layer = new;
let app = new
.route
.layer;
Comparison with governor
| ratelimit | governor | |
|---|---|---|
| Algorithm | GCRA (leaky bucket) | GCRA (leaky bucket) |
| Backends | In-memory, Redis | In-memory only |
| Tower layer | Optional | Built-in |
| Dependencies | Minimal | Jitter + parking_lot |
| Burst support | .allow_burst() |
Fixed per-quota |
License
Licensed under either of MIT or Apache-2.0 at your option.