关于 api-rate-limiting
面向 API 开发者的限流指南,介绍按用户和端点设置策略,并示范多种算法、Express 中间件及响应头配置。
主要功能
- 01令牌桶、滑动窗口和固定窗口算法
- 02Express 限流中间件示例
- 03限流响应头说明
- 04分层请求限制策略
- 05分布式限流最佳实践
适用场景
- 01限制单个用户的 API 请求频率
- 02为不同 API 端点设置限额
- 03向限流响应添加标准头信息
- 04为不同订阅层级配置请求上限
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill api-rate-limiting安装后在 Claude Code 中输入/api-rate-limiting确认已加载。
详细介绍
API 速率限制
使用按用户和按端点的策略,通过速率限制算法保护 API 免遭滥用。
算法
| 算法 | 优点 | 缺点 |
|---|---|---|
| 令牌桶 | 可处理突发请求,速率平稳 | 每个用户都占用内存 |
| 滑动窗口 | 精确 | 占用大量内存 |
| 固定窗口 | 简单 | 窗口边界处可能出现流量峰值 |
令牌桶(Node.js)
class TokenBucket {
constructor(capacity, refillRate) {
this.capacity = capacity;
this.tokens = capacity;
this.refillRate = refillRate; // tokens per second
this.lastRefill = Date.now();
}
consume() {
this.refill();
if (this.tokens >= 1) {
this.tokens--;
return true;
}
return false;
}
refill() {
const now = Date.now();
const elapsed = (now - this.lastRefill) / 1000;
this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRate);
this.lastRefill = now;
}
}
Express 中间件
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100,
standardHeaders: true,
message: { error: 'Too many requests, try again later' }
});
app.use('/api/', limiter);
响应头
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705320000
Retry-After: 60
分级限制
| 等级 | 每小时请求数 |
|---|---|
| 免费 | 100 |
| Pro | 1,000 |
| 企业版 | 10,000 |
最佳实践
- 使用 Redis 实现分布式速率限制
- 在响应中包含适当的响应头
- 返回 429 状态码并设置 Retry-After
- 为不同套餐实施分级限制
- 监控速率限制指标
- 在负载下进行测试
评论
支持 Markdown