一、限流:把流量”削”在门口
限流保护系统不被突发流量打垮。四种常见算法:
| 算法 | 特点 | 适用 |
|---|---|---|
| 计数器(固定窗口) | 简单但有临界突刺 | 粗略限速 |
| 滑动窗口 | 平滑,无临界突刺 | 通用 API 限流 |
| 令牌桶 | 允许一定突发 | 面向用户限速 |
| 漏桶 | 严格匀速输出 | 保护下游 |
二、令牌桶示例(Python)
import time
class TokenBucket:
def __init__(self, rate, capacity):
self.rate = rate # 每秒生成令牌数
self.cap = capacity # 桶容量
self.tokens = capacity
self.ts = time.time()
def allow(self):
now = time.time()
self.tokens = min(self.cap, self.tokens + (now - self.ts) * self.rate)
self.ts = now
if self.tokens >= 1:
self.tokens -= 1
return True
return False
三、熔断:坏了就”跳闸”,别一直试
调用下游持续失败时,熔断器打开,直接快速失败,过段时间半开探测恢复。三态:关闭 → 打开 → 半开。
| 状态 | 行为 |
|---|---|
| Closed | 正常放行,统计失败率 |
| Open | 失败率超阈值,拒绝请求直接报错 |
| Half-Open | 冷却后放少量试探,成功则恢复 |
四、降级:保核心,舍边缘
压力大时关闭非核心功能(如推荐、排行榜),保住下单、支付等主链路。降级分自动(触发条件)和手动(开关)。
五、落地建议
- 网关层做全局限流(如 Nginx / Sentinel);
- 关键下游调用加熔断(Resilience4j / Sentinel);
- 降级开关可配置、可热更新;
- 限流阈值基于压测,别拍脑袋。
限流防突发、熔断挡故障、降级保核心——三者组合,系统才扛得住真实流量。