亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否有必要讀取并關閉響應主體以重試 TCP 連接?

是否有必要讀取并關閉響應主體以重試 TCP 連接?

Go
慕的地6264312 2022-06-21 16:27:47
我正在使用http.RoundTripperGo 實現重試。這是一個實現示例。type retryableRoundTripper struct {    tr            http.RoundTripper    maxRetryCount int}func (t *retryableRoundTripper) RoundTrip(req *http.Request) (resp *http.Response, err error) {    for count := 0; count < t.maxRetryCount; count++ {        log.Printf("retryableRoundTripper retry: %d\n", count+1)        resp, err = t.tr.RoundTrip(req)        if err != nil || resp.StatusCode != http.StatusTooManyRequests {            return resp, err        }    }    return resp, err}問題是否有必要讀取并關閉響應主體以重試 TCP 連接?func (t *retryableRoundTripper) RoundTrip(req *http.Request) (resp *http.Response, err error) {    for count := 0; count < t.maxRetryCount; count++ {        log.Printf("retryableRoundTripper retry: %d\n", count+1)        resp, err = t.tr.RoundTrip(req)        if err != nil || resp.StatusCode != http.StatusTooManyRequests {            return resp, err        }    }    // add    io.Copy(ioutil.Discard, resp.Body)    resp.Body.Close()    return resp, err}作為旁注,我編寫了一個測試并確認重試按預期工作。(在 Go Playground 中,它超時,但它在本地工作。)https://play.golang.org/p/08YWV0kjaKr
查看完整描述

1 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

當然,您需要閱讀連接以確保它可以重復使用,并且需要按照文檔說明關閉連接。

如文檔中所述:

客戶端完成后必須關閉響應正文

如果正文未讀完并關閉,則默認 HTTP 客戶端的傳輸可能不會重用 HTTP/1.x “保持活動” TCP 連接。

如果服務器想要發送的數據超出初始讀取緩沖區的容量,它將被阻止發送響應。這意味著如果傳輸嘗試通過該連接發送新請求,服務器可能無法處理它,因為它從未完成第一個請求。這通常會導致客戶端錯誤connection reset by peer和服務器錯誤write: broken pipe

如果您想嘗試重用連接,但限制讀取量,請使用io.LimitedReader和/或檢查ContentLength值。這樣,當處理錯誤和建立新連接比讀取無限量的數據更快時,您可以丟棄連接。請參閱限制在響應 HTTP GET 請求中讀取的數據量。


查看完整回答
反對 回復 2022-06-21
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號