标准答案

  1. 响应体未关闭会泄漏连接和文件描述符,最终导致请求排队或建连失败。
  2. Transport 应复用而不是每次请求新建,MaxIdleConns、MaxConnsPerHost 和 IdleConnTimeout 要有界。
  3. 连接复用失败可能来自服务端关闭、代理、TLS、DNS 或响应体处理错误。
  4. 客户端请求要有 context deadline,超时后释放资源并判断操作是否可安全重试。

题目解析

http.Transport 管理连接复用和每个目标的并发,响应体必须读取或关闭才能可靠归还连接。每次请求新建 Client/Transport 会失去复用并增加建连、TLS 和 FD 成本。

请求耗时要拆成连接池等待、DNS、TCP/TLS、响应头和响应体读取。MaxConnsPerHost、空闲连接、生命周期和 context deadline 共同决定资源边界。

连接池要服从所有实例和下游配额。超时或连接复用失败时,先释放资源并判断操作是否幂等,再决定重试。

常见误区

  • 误区:每个请求创建 Client/Transport。改正:复用生命周期明确的 Client/Transport,并按依赖隔离池。
  • 误区:只检查 status code 不关闭 body。改正:消费、关闭或销毁 body,确保连接可复用或被释放。
  • 误区:MaxConnsPerHost 无限增大。改正:按下游容量、实例数和请求 P99 设置上限。

作者信息