go 建议:net/http:允许可配置的最大连接年龄

34gzjxbg  于 5个月前  发布在  Go
关注(0)|答案(7)|浏览(58)

当前,http.Transport实现将在启用keepalives且连接未处于空闲状态太久的情况下重用HTTP连接。这意味着对于始终处于活动状态且很少/从不超过IdleConnTimeout限制的高吞吐量连接,该连接将不断被重用(只要它没有断开)。

这在服务发现和客户端负载均衡方面带来了问题——因为地址解析只发生在拨号器的DialContext中,这使得客户端在相同的连接不断被重用而从未“重新拨号”的情况下,无法重新解析目标地址。

我建议在http.Transport中添加一个MaxConnectionAge标志,以限制持久连接的生命周期,并在该生命周期之外不再重用它。

这将与go-grpc的行为保持一致,即also enforces a MaxConnectionAge limit

5vf7fwbs

5vf7fwbs2#

类似于#23427,它提供了一个解决方法(黑客)。然而,重新解析DNS和重用连接问题已经存在很多年了。

tjvv9vkg

tjvv9vkg3#

也许基于TTL的DNS解析可以作为解决方案#23427(评论)。

23427(评论)总结了3种可能的解决方案。

我非常确定在实践中,你永远不会达到连接数的最大值,所以你总是有空闲的连接会被关闭,就像我在#23427中展示的那样。我们在高流量场景下运行这个功能已经很多年了,没有遇到任何问题(这并不意味着在实践中不存在问题)。

gk7wooem

gk7wooem4#

我有一个不同的问题,可以通过相同的配置来解决。由于我无法控制的原因,我有一个防火墙,在15分钟后无论它们的活动如何都会杀死TCP连接。如上所述,MaxConnectionAge 解决了gRPC中的这个问题。
对于HTTP来说,拥有类似的配置对我来说是一个简单的客户端修复,但我会坦率地承认,这个问题可能并不普遍到需要对net/http进行更改的程度。

wbrvyc0a

wbrvyc0a5#

注意,我相信我在#46714有一个可行的实现方案,并且它可能可以用于解决#23427的问题。

a0zr77ik

a0zr77ik6#

同时,对于可能的重复提案表示抱歉。我相信维护者在没有我自己的特定实现方案的情况下,对我的PR不感兴趣。

huwehgph

huwehgph7#

有任何更新吗?

相关问题