系统运行
超时、限流与可靠性设计
理解超时、重试、容量保护、依赖隔离和恢复控制之间的关系。
超时
没有超时的网络调用可能长期占用线程、连接和队列位置。超时应区分连接、读取、写入和整个请求预算,并根据依赖的正常延迟分布设置。
超时过长会拖慢故障恢复,过短则会把正常慢请求误判为失败。上游的总时间预算还要包含排队、重试和本地处理时间。
有限重试
重试适合处理短暂异常,但会增加总负载。只有幂等操作或带有幂等键保护的操作,才适合自动重试写请求。
重试应集中在少数明确层级。调用链每一层都重试,次数会成倍放大。退避、抖动、最大次数和总时间预算应一起配置。
限流与并发
限流控制单位时间内的请求数量,并发限制控制同时占用资源的任务数量。两者解决的问题不同。系统还可以对队列长度、连接池和后台任务数设置上限。
达到容量边界时,尽早返回明确错误通常比继续接收并最终超时更可控。调用方应尊重 429、503 和 Retry-After 等反馈。
依赖隔离
不同外部依赖应使用独立连接池、并发额度和队列,避免一个变慢的依赖占满全部资源。高优先级与普通任务也可以设置不同容量。
熔断思路是在连续失败达到条件后暂时停止直接调用,让请求快速失败或进入替代流程;经过等待后再用少量请求探测恢复情况。
降级与恢复
降级是在核心依赖不可用时保留最基本能力,例如只读、延迟处理或返回缓存信息。降级结果必须有明确标识,不能把临时结果伪装成最终状态。
恢复时也要控制速度。大量积压任务同时恢复可能再次压垮依赖,应分批处理,并监控队列增长、失败率和完成速度。
可靠性设计的目标不是“永不失败”,而是限制影响范围、保留恢复路径,并让系统状态始终可以解释。