只设置一个很大的总超时,往往会让故障请求长期占用连接和工作线程。调用链需要把可接受的总延迟分配到各个阶段。

拆分超时类型

DNS、TCP 连接、TLS 握手、首字节和响应读取具有不同故障含义。客户端库支持时应分别设置,并在日志中标明超时阶段。

重试必须消耗预算

重试不能重新获得完整超时时间。每次尝试都应读取剩余期限,并加入有限抖动,避免多个实例同时再次请求。

让服务端知道截止时间

内部调用可以传递 deadline。下游发现预算不足时尽早停止昂贵工作,比完成一个上游已经放弃的请求更合理。