Client-Based Rate Limiting
Overview
Basic Client-Based Rate Limiting
Custom Key Generator for Client-Based Limiting
from app.middleware.rate_limit import RateLimitMiddleware
def client_based_key_generator(context):
"""Generate rate limit keys based on client identity"""
# Try different client identification methods in order of preference
# 1. Authenticated user ID (most reliable)
user_id = context.get('user_id')
if user_id:
return f"user:{user_id}"
# 2. Device ID from authenticated device
device_id = context.get('device_id')
if device_id:
return f"device:{device_id}"
# 3. API key identifier
auth_data = context.get('auth_data', {})
api_key_id = auth_data.get('key_id')
if api_key_id:
return f"api_key:{api_key_id}"
# 4. MQTT client ID
client = context.get('client')
if client and hasattr(client, '_client_id'):
return f"mqtt_client:{client._client_id}"
# 5. Fallback to topic-based (if no client info available)
topic = context.get('topic', 'unknown')
return f"topic:{topic}"
# Create client-based rate limiter
client_rate_limiter = RateLimitMiddleware(
max_requests=100,
window_seconds=3600, # 100 requests per hour per client
key_generator=client_based_key_generator,
strategy="sliding_window"
)
# Apply to routes
router.on("api/{endpoint}",
ApiController.handle,
middleware=[client_rate_limiter])Dedicated Client Rate Limiting Middleware
Advanced Client-Based Patterns
Tiered Client Rate Limiting
Multi-Dimensional Client Rate Limiting
Client Identification Strategies
Enhanced Client ID Extraction
Client Fingerprinting
Use Cases and Examples
API Rate Limiting by User
IoT Device Rate Limiting
Multi-Tenant Rate Limiting
Testing Client-Based Rate Limiting
Unit Testing
Load Testing
Performance Considerations
Key Space Management
Memory Usage Optimization
Next Steps
Last updated