天下苦“手动排空 Body”久矣。
过去,Go 的 http.Client 为了追求纯粹:如果你不把数据读到 EOF,连接池就拒绝复用该连接。不少线上事故,都只是因为少写了一行 io.Copy(io.Discard, ...)。
Go 1.27 的重磅救赎
Go 官方博客 宣布,从 Go 1.27 起,net/http 客户端在执行 resp.Body.Close() 时,会自动、静默地帮你排空未读取的残留数据(在合理的保守阈值内)。
这意味着连接会安全回到空闲连接池(Idle Pool)中。旧代码无需任何改动,就能大幅削减连接重建带来的延迟开销。
官方仍留下的“避坑警示”
连接虽然能自动复用了,但别忘了 http.DefaultTransport 的 MaxIdleConnsPerHost 默认值依然是极度保守的 2。在高并发调用外部微服务时,一定要手动调整连接池大小,否则连接依然会被无情关掉。
十年磨一剑,Go 标准库正在把那些曾经靠“口口相传经验”的暗坑,一一变成安全默认值。
云栈社区 里,不少 Go 开发者也在复盘:因为漏排空 resp.Body 导致连接池失效的暗坑,你踩中过几次?
|