过载保护要在资源耗尽前拒绝工作
说明排队、并发上限、负载削减和降级怎样阻止延迟上升演变为级联故障。
过载保护要在资源耗尽前拒绝工作
当到达系统的工作量持续高于可处理能力,队列会增长,等待时间会上升,请求占用资源更久,超时和重试又制造更多工作。若系统继续无条件接收请求,局部变慢会演变为级联故障。过载保护的目标是在资源完全耗尽前控制进入系统的工作,并尽量保留最有价值的服务。
容量边界必须通过实际负载确认
容量不是一个固定的每秒请求数。同样数量的请求可能读取一行数据,也可能触发复杂查询、远程调用或大对象序列化。CPU、内存、连接、线程、磁盘和下游配额中的任何一个都可能先到极限。
负载测试需要覆盖真实请求组合、数据规模、缓存状态和依赖延迟,并观察超过设计点后的失败方式。只测到目标吞吐后停止,无法知道系统是在快速拒绝、缓慢排队还是失去健康检查。
容量还会随版本和数据增长变化。一次查询计划改变、对象变大或依赖限流,都可能降低有效容量。持续记录单位工作的资源成本,比长期沿用某个历史 QPS 数字更可靠。
无限队列把拒绝变成迟到的失败
队列可以吸收短时突发,但不能解决持续过载。若到达率长期大于处理率,队列只会积累。等待中的请求占用内存和连接,到达处理位置时可能已经超过调用方期限,系统耗费资源完成一个无人需要的结果。
有限队列让容量边界可见。队列已满时快速拒绝,虽然产生明确失败,却能保护正在处理的工作和整体恢复能力。队列长度应结合服务时间、期限和并发容量确定,而不是取一个足够大的数隐藏峰值。
队列还需要过期策略。请求的端到端期限已经耗尽时,应尽早取消后续处理。只在最外层返回超时、内部任务继续运行,会造成“失败请求仍消耗全部资源”的隐性过载。
准入控制限制并发工作量
并发上限、令牌桶和基于成本的配额可以在入口控制工作。简单请求计数易实现,但无法区分轻重任务;按估计成本、租户或操作类型分配预算,更能避免少量昂贵请求挤占全部资源。
准入点应尽量靠前且执行成本低。若请求完成认证、读取大对象并调用多个依赖后才被拒绝,保护效果有限。入口判断同时要保留必要安全检查,不能让过载模式绕过权限或审计。
分布式系统中的每个实例只看自身状态,可能在负载迁移时做出滞后判断。全局限流又可能依赖一个新的集中瓶颈。设计需要在局部快速反应与全局公平之间取舍,并考虑计数器失效时采用何种保守策略。
负载削减优先保住关键工作
负载削减是在容量不足时主动丢弃一部分工作。随机丢弃易于实现,但业务价值并不相同。交互请求、后台批任务、健康检查和关键写入可以具有不同优先级;同一优先级内还要避免固定用户总被牺牲。
拒绝应清楚、快速并可观察。HTTP 服务可以返回适当的服务不可用或限流响应,同时避免生成昂贵错误页面。调用方需要知道是否值得重试以及建议等待多久,但服务不能承诺并不存在的恢复时间。
降级是在不完全拒绝的情况下减少工作,例如返回较小结果集、使用稍旧缓存、跳过非关键推荐或延后异步处理。每种降级都应有产品认可的质量边界,不能把不完整数据伪装成正常完整结果。
重试会形成正反馈
请求因过载超时后立即重试,会在系统最脆弱时增加流量。多层调用各自重试时,一个用户请求可能指数式放大为大量下游尝试。过载控制必须与超时、幂等、退避、抖动和重试预算共同设计。
快速拒绝可以让调用方转向其他健康实例,但如果整个集群都过载,跨实例重试只是搬运压力。客户端需要限制尝试次数,并根据错误类型区分瞬时局部故障与广泛容量不足。
后台消费者也会重试失败消息。若失败来自不可处理数据,无限重试会占满队列;若来自依赖过载,高并发重放会阻止依赖恢复。死信、延迟重试和全局速率限制分别处理不同问题。
公平性需要独立预算
没有隔离时,一个租户、一个批任务或一种昂贵操作可以耗尽共享池。按租户、优先级或工作类型设置并发和速率预算,能够限制故障域。保留少量关键容量还可保证管理、恢复和健康操作在高峰时仍能运行。
严格平均分配也可能浪费空闲容量。实际系统可允许借用未使用配额,但当所有租户同时繁忙时要能收回。借用和收回策略必须避免剧烈抖动,并让用户理解其基础保障与突发能力。
公平不等于所有请求延迟相同。高成本请求可能需要更低并发或异步执行,否则少量工作会造成队首阻塞。服务接口应暴露适合任务成本的执行模式。
保护策略本身必须可观测和演练
只监控拒绝数量不能判断策略是否正确。还需要观察在途请求、队列等待、资源饱和、超时、重试率、降级比例和按优先级的成功率。拒绝上升可能说明保护生效,也可能说明容量规划已经长期不足。
过载测试应验证系统能否在超过容量后维持可预测延迟、保住关键流量并在压力下降后恢复。若保护阈值从未在受控环境触发,真正事故中可能发现错误路径比正常处理更昂贵。
阈值需要依据实测更新。过低会浪费容量,过高会让系统进入不可恢复区。自动控制可根据延迟或并发调整准入,但必须设置变化速度和上下界,防止反馈滞后造成振荡。
过载无法靠单个限流器彻底解决。有效设计把容量测量、有限排队、准入控制、优先级、降级和客户端行为连成一条保护链,使系统在需求超过能力时以受控方式减少工作,而不是等资源耗尽后一起失败。
资料依据
- Google:Site Reliability Engineering Books,https://sre.google/books/
- Carnegie Mellon Software Engineering Institute:Early Analysis of Software Architecture,https://www.sei.cmu.edu/library/early-analysis-of-software-architecture/