Overview
Therate_limiting module implements the Token Bucket algorithm for controlling API request rates. It supports single-tenant, multi-tenant, and distributed rate limiting with Redis.
Classes
TokenBucket
Token Bucket algorithm implementation for rate limiting.Constructor
| Name | Type | Default | Description |
|---|---|---|---|
requests_per_second | float | - | Requests per second (0.5 = once per 2 seconds) |
max_bucket_size | int | 10 | Maximum tokens in bucket (burst capacity) |
check_every_n_seconds | float | 0.1 | Check interval when waiting for tokens |
Methods
acquire
Acquire tokens, waiting if necessary (async).tokens- Number of tokens to acquire (default: 1)timeout- Maximum wait time in seconds (None = wait indefinitely)
bool- True if tokens acquired, False if timeout
try_acquire
Try to acquire tokens without waiting.bool- True if tokens acquired, False otherwise
get_available_tokens
Get current number of available tokens.float- Number of available tokens
get_wait_time
Calculate wait time until tokens available.float- Wait time in seconds (0.0 if tokens available now)
RateLimiter
Convenient rate limiter wrapper with async context manager support.Constructor
TokenBucket
Methods
acquire
TokenBucket.acquire()
Context Manager
MultiTenantRateLimiter
Rate limiter with per-tenant (user/workspace) limits.Constructor
default_requests_per_second- Default rate for unknown tenantsdefault_max_bucket_size- Default bucket sizetenant_limits- Per-tenant rate limits (key: tenant_id, value: requests_per_second)
Methods
acquire
Acquire token for specific tenant.tenant_id- Tenant identifier (user ID, workspace ID, etc.)tokens- Number of tokens to acquiretimeout- Timeout in seconds
bool- True if successful
limit
Get context manager for specific tenant.set_tenant_limit
Update rate limit for specific tenant.RateLimitedNode
Mixin class to add rate limiting to nodes.Constructor
rate_limiter- RateLimiter instance (if None, creates default)requests_per_second- Requests per second (used if rate_limiter is None)
Methods
enable_rate_limiting
Enable rate limiting for this node.disable_rate_limiting
Disable rate limiting for this node.is_rate_limiting_enabled
Check if rate limiting is enabled.RedisRateLimiter
Distributed rate limiter using Redis (requiresredis package).
Constructor
redis_client- Redis client instancekey_prefix- Redis key prefix for namespacingrequests_per_window- Maximum requests per time windowwindow_seconds- Time window in seconds
Methods
check_and_increment
Atomically check limit and increment counter.bool- True if allowed, False if limit exceeded
get_remaining
Get remaining quota for identifier.int- Number of remaining requests
reset
Reset counter for identifier.Usage Patterns
Basic Rate Limiting
Burst Handling
Timeout Handling
Multi-Tenant Usage
Dynamic Rate Adjustment
Distributed Rate Limiting
Conditional Rate Limiting
Rate Limit Monitoring
Best Practices
Set Appropriate Rates
Set Appropriate Rates
Match rate limits to API provider limits:
Use Burst Capacity
Use Burst Capacity
Allow reasonable bursts with
max_bucket_size:Handle Rate Limit Errors
Handle Rate Limit Errors
Always check return value or use try/except:
Use Redis for Distributed Systems
Use Redis for Distributed Systems
For multi-server deployments, use RedisRateLimiter:
Monitor Remaining Quota
Monitor Remaining Quota
Track quota to warn users before hitting limits:
Separate Limiters for Different APIs
Separate Limiters for Different APIs
Don’t share rate limiters across different APIs:
Tier-Based Limits
Tier-Based Limits
Use MultiTenantRateLimiter for user tiers:
Rate Calculation Examples
Requests Per Second
| Rate | Calculation | Description |
|---|---|---|
1.0 | 1 req/s | 1 request per second |
0.5 | 1/2 | 1 request every 2 seconds |
0.1 | 1/10 | 1 request every 10 seconds |
10.0 | 10 req/s | 10 requests per second |
0.0167 | 1/60 | 1 request per minute |
Common API Limits
See Also
- Resilience - Retry patterns
- Caching - Reduce API calls
- Callbacks - Monitor rate limit events