超时、连接复用与错误
如何给出站请求分配时间预算?
入口 deadline
├─ 排队与业务处理
├─ DNS/连接/TLS
├─ 写请求
├─ 等首字节与读响应
└─ 重试退避
- 总预算: 由调用方制定;为请求显式配置
config.WithRequestTimeout或DoDeadline,不要只把 context 传入Do就认定完成所有超时控制; - connect timeout: 限制建立连接;
- request timeout:
WithRequestTimeout控制完整 HTTP 请求;DoTimeout/DoDeadline写入相同配置,避免互相覆盖; - idle timeout: 控制池中空闲连接,不限制正在执行的业务;
- 下游预算: 小于入口剩余 deadline,为错误处理和响应写出留余量;
如何按失败层次决定处理方式?
| 类别 | 示例 | 默认动作 |
|---|---|---|
| 调用者取消 | context canceled | 立即停止 |
| deadline | context deadline exceeded | 返回超时 |
| 建连失败 | refused、DNS | 谨慎重试 |
| HTTP 4xx | 400、401、404 | 通常不重试 |
| HTTP 429 | 限流 | 尊重 Retry-After |
| HTTP 5xx | 临时服务故障 | 幂等请求可重试 |
| 解码失败 | schema 不兼容 | 告警并失败 |