引言
API 就像是数字高速公路——如果没有交通规则,就会陷入混乱。想象一条没有限速或车道分隔线的高速公路;车辆会发生碰撞,导致交通瘫痪。同样,不受控制的 API 流量会导致服务器崩溃、安全漏洞以及用户产生挫败感。根据阿里云 2023 年的一项调查,78% 的开发者将 API 滥用视为首要安全隐患。本文探讨了**限流(Rate Limiting)和节流(Throttling)**这两个保护 API 基础设施的关键策略。
问题:不受控制的 API 流量
- 宕机风险: 如果没有限制,单个恶意攻击者可以向你的 API 发送数百万次请求,从而使服务器过载。
- 安全漏洞: 暴力破解攻击和 DDoS 攻击会利用未受限制的端点。
- 糟糕的用户体验: 当资源被垄断时,合法用户会遭遇延迟激增。
什么是限流与节流?
限流的定义
限流限制客户端在指定时间范围内可以发起的请求数量。例如,允许每分钟 100 次请求。主要应用场景:
- 防止 DDoS 攻击(例如,Twitter 限制每个应用每分钟 150 万次请求)。
- 管理免费增值模式下的资源分配。
节流的定义
节流是减缓过多的请求,而不是完全阻止它们。例如,在流量高峰期延迟响应。常见场景:
- 平滑突发流量(例如,黑色星期五的电商大促)。
- 优先处理高价值请求(例如,支付网关)。
主要区别
| 维度 | 限流 | 节流 |
|---|---|---|
| 方法 | 达到限制后硬拦截 | 逐渐减缓流量 |
| 应用场景 | 防止滥用 | 管理临时负载 |
| 用户影响 | 突然拒绝(429 错误) | 延迟但最终会处理 |
为什么限流与节流很重要
防止滥用与攻击
- 缓解暴力破解: LinkedIn 将登录尝试限制为 5 次/小时,从而降低凭据撞库的风险。
- DDoS 防御: Cloudflare 的限流在 2023 年第三季度阻止了 1280 万次 DDoS 攻击。
确保公平使用
- 资源分配: Zoom 的 API 为免费用户提供每月 100 万次请求,而企业级套餐则为 1000 万次。
- 成本控制: AWS Lambda 按请求计费;节流可防止出现 5 万美元的意外账单。
合规性与 SLA
- 正常运行时间保证: Shopify 的 API 强制执行 100 次调用/分钟,以确保 99.99% 的 SLA 合规性。
限流策略的类型
基于密钥
根据 API 密钥进行限制。示例:Stripe 限制每个 API 密钥 100 次请求/秒。OAuth 作用域可以进一步限制访问权限。
基于 IP
封禁滥用的 IP。GitHub 会暂停每小时发起超过 60 次未经身份验证请求的 IP。地理封锁(Geo-blocking)也适用于此。
基于用户
与用户角色保持一致。HubSpot 的 API 为免费用户提供 100 次调用/小时,而为企业用户提供 1 万次。
并发限制
限制同时发生的连接数。AWS RDS 限制 4 万个并发数据库连接,以防止服务器崩溃。
算法深入解析
令牌桶算法
- 机制: 允许一定数量的突发令牌(例如 100 个),并以固定的速率(例如 10 个/秒)重新填充。
- 应用场景: Cloudflare 使用该算法来处理限时抢购期间的流量峰值。
1graph LR
2 A[Token Bucket / 令牌桶] --> B[Token Count: 100 / 令牌数:100]
3 A --> C[Refill Rate: 10 tokens/sec / 填充速率:10 令牌/秒]
4 A --> D{Process Request? / 处理请求?}
5 D -->|Yes / 是| E[Consume 1 Token / 消耗 1 个令牌]
6 D -->|No / 否| F[Return 429 Error / 返回 429 错误]漏桶算法
- 机制: 以恒定的速率处理请求,并丢弃多余的请求。
- 应用场景: RabbitMQ 在消息队列中使用该算法,以避免消息代理(Broker)过载。
实施的最佳实践
设定合理的限制
- 负载测试: Netflix 通过模拟流量来设置最佳限制。从 1 次请求/秒开始并逐步扩展。
- 流量模式: 分析高峰时段(例如,营业时间内的流量是平时的 3 倍)。
清晰的沟通
- HTTP 标头: 返回
X-RateLimit-Limit: 100、X-RateLimit-Remaining: 25以及Retry-After: 60。 - 文档: Stripe 的 API 文档明确说明了速率限制以及违规的处罚措施。
监控与调整
- 需要跟踪的指标:
- 429 错误率(目标 <1%)
- P95 延迟
- 按客户端划分的流量分布
- 工具: 结合 Grafana 仪表板的 Prometheus;Datadog 的异常检测。
优雅的错误处理
- 具有可操作性的提示信息:
- ❌ "Too many requests." (请求过多。)
- ✅ "Exceeded limit of 100 requests/minute. Retry after 60 seconds." (超过了每分钟 100 次请求的限制。请在 60 秒后重试。)
真实案例
Google Maps API
- 每个项目每天强制限制 10 万次地理编码请求以防止滥用。
GitHub API
- 分层限制:未经身份验证的用户为 60 次请求/小时,而经过身份验证的用户为 5000 次/小时。
Outline.com
- 由于需要 GPU 密集型的渲染,将 PDF 导出限制为 5 次/分钟。
防止电商价格爬取 (E-Commerce Price Scraping Prevention)
- 沃尔玛将商品 API 调用上限设为 2 次/秒,以阻止竞争对手抓取价格。
工具与服务
API 网关
- AWS API Gateway: 支持带有自定义 Lambda 授权方的令牌桶算法。
- Azure API Management: 带有动态限流策略的使用计划。
- Kong: 基于插件的系统,用于基于 IP 的限制。
云解决方案
- API7 Cloud: 作为 SaaS 控制平面,可以管理任何云端的所有 API。
- Ambassador: Kubernetes 原生,带有基于 JWT 的限流功能。
开源选项
- Apache APISIX: 基于 Lua 的插件,用于 JWT 和 IP 节流。
未来趋势
AI 驱动的节流
- 异常检测: Azure API Management 使用机器学习来识别异常的流量模式。
- 预测性扩展: Google Cloud 的 AutoML 会根据预测的需求调整限制。
标准化
- OpenAPI 规范: 采用
x-rate-limit扩展以实现一致的策略执行。
Serverless 集成
- AWS Lambda: 通过预置并发(Provisioned Concurrency)集成节流功能,以处理流量峰值。
结语
对于 API 的可靠性而言,限流和节流是不容妥协的保障。通过实施分层限制、采用稳健的算法并利用相关工具,开发者可以在保持用户信任的同时确保系统的正常运行。随着 API 优先 (API-first) 架构占据主导地位,这些实践将成为数字韧性的基石。
