标准答案
- 响应体未关闭会泄漏连接和文件描述符,最终导致请求排队或建连失败。
- Transport 应复用而不是每次请求新建,MaxIdleConns、MaxConnsPerHost 和 IdleConnTimeout 要有界。
- 连接复用失败可能来自服务端关闭、代理、TLS、DNS 或响应体处理错误。
- 客户端请求要有 context deadline,超时后释放资源并判断操作是否可安全重试。
题目解析
http.Transport 管理连接复用和每个目标的并发,响应体必须读取或关闭才能可靠归还连接。每次请求新建 Client/Transport 会失去复用并增加建连、TLS 和 FD 成本。
请求耗时要拆成连接池等待、DNS、TCP/TLS、响应头和响应体读取。MaxConnsPerHost、空闲连接、生命周期和 context deadline 共同决定资源边界。
连接池要服从所有实例和下游配额。超时或连接复用失败时,先释放资源并判断操作是否幂等,再决定重试。
常见误区
- 误区:每个请求创建 Client/Transport。改正:复用生命周期明确的 Client/Transport,并按依赖隔离池。
- 误区:只检查 status code 不关闭 body。改正:消费、关闭或销毁 body,确保连接可复用或被释放。
- 误区:MaxConnsPerHost 无限增大。改正:按下游容量、实例数和请求 P99 设置上限。