首页 >后端开发 >Golang >即使'DisableKeepAlives”设置为 False,为什么我仍然在 Go HTTP 客户端中创建多个连接?

即使'DisableKeepAlives”设置为 False,为什么我仍然在 Go HTTP 客户端中创建多个连接?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-03 06:21:301038浏览

Why Am I Still Creating Multiple Connections in My Go HTTP Client Even with `DisableKeepAlives` Set to False?

排查 Go 的 HTTP 客户端中的连接重用

问题: 为什么我的 Go HTTP 客户端会创建到同一主机的多个连接,尽管使用DisableKeepAlives 选项为 false?

Go HTTP 客户端默认设计为重用连接。但是,有某些条件可以阻止它这样做。

诊断:

在提供的代码中,http.Transport.RoundTrip() 方法不是紧接着调用 resp.Close()。这可能会导致连接在请求发送后立即关闭,从而无法将其重新用于后续请求。

解决方案:

为了确保 HTTP 连接重用,需要两个步骤:

  1. 读取直到响应完成,确保从响应正文中消耗所有数据。为此,请使用 io.Copy(ioutil.Discard, resp.Body) 或 ioutil.ReadAll(resp.Body)。
  2. 调用 res.Body.Close() 显式关闭响应正文,释放连接

代码片段:

<code class="go">res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()</code>

其他注意事项:

  • 设置将 DisableKeepAlives 选项设置为 true 会显式禁用连接重用,无论其他设置如何。
  • 可以使用 time.Tick 等技术来限制每秒出站请求的数量。但是,这与连接重用没有特别关系,如果连接重用正常运行,则可能没有必要。

以上是即使'DisableKeepAlives”设置为 False,为什么我仍然在 Go HTTP 客户端中创建多个连接?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn