API 限流(API Rate Limiting)
概述
使用多种限流算法,通过按用户、按 IP 和按接口端点的策略,保护 API 免受滥用并管理流量。
适用场景
- 保护 API 免受暴力破解攻击
- 管理流量峰值
- 实现分级服务方案
- 防止 DoS 攻击
- 实现资源分配的公平性
- 执行配额与使用限制
快速开始
最小可用示例:
// 令牌桶限流器
class TokenBucket {
constructor(capacity, refillRate) {
this.capacity = capacity;
this.tokens = capacity;
this.refillRate = refillRate; // 每秒补充的令牌数
this.lastRefillTime = Date.now();
}
refill() {
const now = Date.now();
const timePassed = (now - this.lastRefillTime) / 1000;
const tokensToAdd = timePassed * this.refillRate;
this.tokens = Math.min(this.capacity, this.tokens + tokensToAdd);
this.lastRefillTime = now;
}
consume(tokens = 1) {
this.refill();
if (this.tokens >= tokens) {
this.tokens -= tokens;
return true;
}
// ...(完整实现见参考指南)
参考指南
references/ 目录下的详细实现:
| 指南 | 内容 |
|---|---|
| Token Bucket Algorithm | 令牌桶算法 |
| Sliding Window Algorithm | 滑动窗口算法 |
| Redis-Based Rate Limiting | 基于 Redis 的限流 |
| Tiered Rate Limiting | 分级限流 |
| Python Rate Limiting (Flask) | Python 限流(Flask) |
| Response Headers | 响应头 |
最佳实践
✅ 建议
- 在响应中包含限流响应头
- 使用 Redis 进行分布式限流
- 为不同用户方案实现分级限制
- 设置合适的窗口大小与限制值
- 监控限流指标
- 提供清晰的重试指引
- 在 API 文档中说明限流规则
- 在高负载下进行测试
❌ 避免
- 在生产环境中使用内存存储
- 将限制设置得过于严格
- 忘记包含 Retry-After 响应头
- 忽略分布式场景
- 将限流规则公开(安全考虑)
- 在分布式系统中使用简单计数器
- 忘记清理旧数据