跳到主要内容

超时、连接复用与错误

如何给出站请求分配时间预算?​

入口 deadline
├─ 排队与业务处理
├─ DNS/连接/TLS
├─ 写请求
├─ 等首字节与读响应
└─ 重试退避
  • 总预算: 由调用方制定;为请求显式配置 config.WithRequestTimeout 或 DoDeadline,不要只把 context 传入 Do 就认定完成所有超时控制;
  • connect timeout: 限制建立连接;
  • request timeout: WithRequestTimeout 控制完整 HTTP 请求;DoTimeout / DoDeadline 写入相同配置,避免互相覆盖;
  • idle timeout: 控制池中空闲连接,不限制正在执行的业务;
  • 下游预算: 小于入口剩余 deadline,为错误处理和响应写出留余量;

如何按失败层次决定处理方式?​

类别示例默认动作
调用者取消context canceled立即停止
deadlinecontext deadline exceeded返回超时
建连失败refused、DNS谨慎重试
HTTP 4xx400、401、404通常不重试
HTTP 429限流尊重 Retry-After
HTTP 5xx临时服务故障幂等请求可重试
解码失败schema 不兼容告警并失败