当前,http.Transport
实现将在启用keepalives且连接未处于空闲状态太久的情况下重用HTTP连接。这意味着对于始终处于活动状态且很少/从不超过IdleConnTimeout
限制的高吞吐量连接,该连接将不断被重用(只要它没有断开)。
这在服务发现和客户端负载均衡方面带来了问题——因为地址解析只发生在拨号器的DialContext
中,这使得客户端在相同的连接不断被重用而从未“重新拨号”的情况下,无法重新解析目标地址。
我建议在http.Transport
中添加一个MaxConnectionAge
标志,以限制持久连接的生命周期,并在该生命周期之外不再重用它。
这将与go-grpc
的行为保持一致,即also enforces a MaxConnectionAge
limit。
7条答案
按热度按时间rvpgvaaj1#
CC @bradfitz@neild
5vf7fwbs2#
类似于#23427,它提供了一个解决方法(黑客)。然而,重新解析DNS和重用连接问题已经存在很多年了。
tjvv9vkg3#
也许基于TTL的DNS解析可以作为解决方案#23427(评论)。
23427(评论)总结了3种可能的解决方案。
我非常确定在实践中,你永远不会达到连接数的最大值,所以你总是有空闲的连接会被关闭,就像我在#23427中展示的那样。我们在高流量场景下运行这个功能已经很多年了,没有遇到任何问题(这并不意味着在实践中不存在问题)。
gk7wooem4#
我有一个不同的问题,可以通过相同的配置来解决。由于我无法控制的原因,我有一个防火墙,在15分钟后无论它们的活动如何都会杀死TCP连接。如上所述,
MaxConnectionAge
解决了gRPC中的这个问题。对于HTTP来说,拥有类似的配置对我来说是一个简单的客户端修复,但我会坦率地承认,这个问题可能并不普遍到需要对
net/http
进行更改的程度。wbrvyc0a5#
注意,我相信我在#46714有一个可行的实现方案,并且它可能可以用于解决#23427的问题。
a0zr77ik6#
同时,对于可能的重复提案表示抱歉。我相信维护者在没有我自己的特定实现方案的情况下,对我的PR不感兴趣。
huwehgph7#
有任何更新吗?