python实现限流、熔断和容错的核心是控制请求速率、快速失败异常依赖、自动恢复故障服务;常用方案为slowapi限流、circuitbreaker熔断、tenacity重试,并需监控与组合使用。

Python 实现限流、熔断和容错机制,核心是控制请求速率、快速失败异常依赖、自动恢复故障服务。不靠框架也能做,但推荐用成熟库降低出错风险。
限流(Rate Limiting)
防止突发流量压垮服务,常见策略有令牌桶、漏桶、固定窗口、滑动窗口。
-
使用 slowapi(基于 Starlette/FastAPI):适合 Web 接口,支持按 IP、用户、路径等维度限流,配置简单。
示例:@limiter.limit("5/minute")即每分钟最多 5 次请求。 - 用 redis + redis-py 自研滑动窗口:适合分布式场景。用 Redis 的 ZSET 记录时间戳,每次请求前 zremrangebyscore 清理过期记录,再 zcard 统计当前请求数。
- 单机轻量选 ratelimit:基于内存或 threading.local,适合脚本或非并发服务,不跨进程共享状态。
熔断(Circuit Breaker)
当下游服务连续失败达到阈值,自动跳过调用,避免雪崩,一段时间后试探性恢复。
-
pydantic-settings + circuitbreaker 是经典组合。装饰器方式接入,定义失败次数、超时时间、重置周期。
例如:@circuit(failure_threshold=5, timeout_duration=60)表示 5 次失败后熔断 60 秒。 - 注意熔断状态需线程安全。默认
circuitbreaker库用 threading.Lock 保护,高并发下可考虑升级为threading.RLock或改用aiocircuit(异步友好)。 - 熔断打开时,建议返回兜底数据(如缓存旧值)或明确错误(
CircuitBreakerError),前端/调用方据此降级展示。
容错与重试(Fault Tolerance & Retry)
网络抖动、临时超时很常见,合理重试 + 退避策略能显著提升成功率。
立即学习“Python免费学习笔记(深入)”;
-
tenacity 是最灵活的重试库:支持按异常类型、返回值、耗时等条件触发重试,内置指数退避、jitter 防止重试风暴。
示例:失败时等待 1s→2s→4s,最多 3 次,且只重试requests.Timeout和ConnectionError。 - 重试要配合熔断——比如某接口连续重试 3 次都失败,就该触发熔断,而不是无限重试。
- 写数据库类操作慎用重试(可能重复写入),应优先用幂等设计(如带唯一业务 ID 的 upsert)。
组合使用建议
真实服务中三者常嵌套使用:先限流控入口 → 调用外部服务时加熔断 → 熔断关闭状态下用 tenacity 控制重试行为。
- FastAPI 项目推荐栈:
slowapi(限流) +circuitbreaker(同步熔断)或aiocircuit(异步) +tenacity(重试)。 - 微服务间调用,可在 HTTP client 层统一封装(如自定义
requests.Session子类,内置限流器和熔断器)。 - 所有策略都要配监控:记录被限流数、熔断开关事件、重试次数。可用 Prometheus + Grafana 可视化关键指标。










