Rate limiting is essential for protecting APIs from abuse, ensuring fair usage, and maintaining system stability. In 2026, sophisticated rate limiting strategies are table stakes for production APIs.
Rate Limiting Algorithms
Token Bucket
Allows bursts while maintaining average rate. Tokens are added at a fixed rate and consumed per request.
Sliding Window
Smoother than fixed windows, counts requests in a rolling time period.
Leaky Bucket
Processes requests at a constant rate, queuing excess requests.
Implementation with Redis
// Sliding window rate limiter
async function checkRateLimit(userId, limit, windowMs) {
const key = `ratelimit:${userId}`
const now = Date.now()
const windowStart = now - windowMs
await redis.zremrangebyscore(key, 0, windowStart)
const count = await redis.zcard(key)
if (count >= limit) {
return { allowed: false, retryAfter: windowMs / 1000 }
}
await redis.zadd(key, now, `${now}`)
await redis.expire(key, Math.ceil(windowMs / 1000))
return { allowed: true, remaining: limit - count - 1 }
}
Rate Limit Headers
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1640995200
Retry-After: 60
Advanced Strategies
- Tiered Limits: Different limits per plan
- Endpoint Limits: Stricter limits on expensive operations
- Adaptive Limits: Adjust based on system load
- User Reputation: Higher limits for trusted users
Client-Side Handling
Implement exponential backoff and respect Retry-After headers to avoid hammering rate-limited endpoints.
Comments (0)
Leave a Comment
No comments yet. Be the first to share your thoughts!