标准答案
- keepAlive、maxSockets、maxFreeSockets 和超时共同决定连接资源边界。
- 每个目标主机、协议和 Agent 可能有不同连接池,不能只看进程总连接数。
- DNS、代理和 TLS 会改变实际连接目标,复用失效时要观察建连和排队耗时。
- 连接池大小应服从下游配额和实例数,响应体必须消费或销毁以归还连接。
题目解析
http.Agent 不只是 keep-alive 开关,还管理每个目标主机的 socket、空闲连接和等待队列。请求慢可能卡在 Agent 排队、DNS、TLS、socket 建立或远端响应,必须拆分时间。
maxSockets、maxFreeSockets、空闲和最大生命周期要按下游配额、实例数和请求耗时配置。每个目标、协议和 Agent 都可能有独立池,进程总连接数需要汇总。
响应体必须消费或销毁才能安全复用连接;DNS、代理和 TLS 变化会让连接复用失效。连接池是背压点,不能用 Infinity 隐藏下游过载。
常见误区
- 误区:maxSockets 设为 Infinity。改正:按下游并发和实例总预算设置上限,并观察队列和拒绝。
- 误区:响应体不读不关。改正:消费、销毁或通过统一封装释放响应,避免连接和内存泄漏。
- 误区:每个请求创建新 Agent。改正:按目标复用生命周期明确的 Agent,必要时为不同依赖隔离连接池。