首頁  >  文章  >  後端開發  >  即使“DisableKeepAlives”設定為 False,為什麼我仍然在 Go HTTP 用戶端中建立多個連線?

即使“DisableKeepAlives”設定為 False,為什麼我仍然在 Go HTTP 用戶端中建立多個連線?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-03 06:21:30992瀏覽

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