ARTICLE / 2 MIN READ
高并发接口的限流熔断降级与隔离
用稳定性预算设计超时、重试、熔断、舱壁和降级,避免级联故障。
当一个依赖变慢时,最危险的反应是让所有请求继续等待并不断重试。稳定性设计要先限制故障传播,再决定哪些功能可以牺牲。
超时必须小于上游预算
如果用户接口总预算是 500ms,内部调用不能都设置 500ms。需要给序列化、排队和返回预留时间,并把多个下游调用的预算拆开。
总预算 500ms
网关与排队 50ms
商品服务 180ms
价格服务 120ms
返回与日志 50ms
余量 100ms
超时应该在每一层传递,避免下游继续工作而上游已经放弃。
重试要有边界
只有明确可重试的错误才重试,例如连接失败和临时过载。使用指数退避加随机抖动,限制总次数和总时长。写操作没有幂等键时,重试可能制造重复订单。
熔断和舱壁
熔断器按失败率、超时率或连续错误数进入打开状态,经过冷却时间再半开探测。探测请求要小,成功后逐步恢复,而不是一次放开全部流量。
舱壁隔离通过独立线程池、连接池或并发信号量,让支付、搜索和报表不会抢同一组资源。每个依赖都应有最大并发和等待队列长度。
降级不是返回空白
降级策略应该提前和产品确认:
| 依赖 | 可接受降级 |
|---|---|
| 推荐 | 返回热门列表 |
| 评论 | 只读缓存,暂时关闭发布 |
| 实时价格 | 返回最近一次有效价格并标记时间 |
| 通知 | 进入队列,稍后发送 |
降级响应要带可观察的原因码,不能让前端误以为业务已经成功。
演练与恢复
每月模拟一次 Redis 延迟、下游 5xx、消息积压和数据库只读,检查熔断是否打开、告警是否触达、人工开关是否有效。故障结束后要逐步恢复流量,并核对降级期间产生的补偿任务。
稳定性不是一组中间件开关,而是把每类故障的影响范围、用户体验和恢复动作写成可执行的运行手册。
GITHUB DISCUSSION
评论与回复
评论保存在 GitHub Discussions,登录 GitHub 后即可参与,发布和回复都在本页完成。
评论区进入视口后自动加载。