标准答案

  1. keepAlive、maxSockets、maxFreeSockets 和超时共同决定连接资源边界。
  2. 每个目标主机、协议和 Agent 可能有不同连接池,不能只看进程总连接数。
  3. DNS、代理和 TLS 会改变实际连接目标,复用失效时要观察建连和排队耗时。
  4. 连接池大小应服从下游配额和实例数,响应体必须消费或销毁以归还连接。

题目解析

http.Agent 不只是 keep-alive 开关,还管理每个目标主机的 socket、空闲连接和等待队列。请求慢可能卡在 Agent 排队、DNS、TLS、socket 建立或远端响应,必须拆分时间。

maxSockets、maxFreeSockets、空闲和最大生命周期要按下游配额、实例数和请求耗时配置。每个目标、协议和 Agent 都可能有独立池,进程总连接数需要汇总。

响应体必须消费或销毁才能安全复用连接;DNS、代理和 TLS 变化会让连接复用失效。连接池是背压点,不能用 Infinity 隐藏下游过载。

常见误区

  • 误区:maxSockets 设为 Infinity。改正:按下游并发和实例总预算设置上限,并观察队列和拒绝。
  • 误区:响应体不读不关。改正:消费、销毁或通过统一封装释放响应,避免连接和内存泄漏。
  • 误区:每个请求创建新 Agent。改正:按目标复用生命周期明确的 Agent,必要时为不同依赖隔离连接池。

作者信息