限流与熔断降级实战:令牌桶、熔断三态与降级

一、限流:把流量”削”在门口

限流保护系统不被突发流量打垮。四种常见算法:

算法 特点 适用
计数器(固定窗口) 简单但有临界突刺 粗略限速
滑动窗口 平滑,无临界突刺 通用 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);
  • 降级开关可配置、可热更新;
  • 限流阈值基于压测,别拍脑袋。

限流防突发、熔断挡故障、降级保核心——三者组合,系统才扛得住真实流量。