gpt4 book ai didi

http - 是否需要读取并关闭响应主体以在重试时重用TCP连接?

转载 作者:行者123 更新时间:2023-12-01 22:03:29 25 4
gpt4 key购买 nike

我正在Go中使用http.RoundTripper实现重试。这是一个实现示例。

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

最佳答案

当然,您需要阅读连接以确保可以重用它,并且如文档所述,需要关闭连接。
如文档中所述:

The client must close the response body when finished with it



The default HTTP client's Transport may notreuse HTTP/1.x "keep-alive" TCP connections if the Body isnot read to completion and closed.


如果服务器要发送的数据超出了初始读取缓冲区的容量,它将被阻止发送响应。这意味着,如果传输尝试通过该连接发送新请求,则服务器可能无法处理它,因为它从未完成第一个请求。这通常会导致客户端错误 connection reset by peer和服务器错误 write: broken pipe
如果要尝试重用连接,但限制读取的数量,请使用 io.LimitedReader和/或检查 ContentLength值。这样,当您处理错误并建立新的连接要比读取无限制的数据快得多时,就可以丢弃该连接。参见 Limiting amount of data read in the response to a HTTP GET request

关于http - 是否需要读取并关闭响应主体以在重试时重用TCP连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63275334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com