如何解决诊断 Golang 中长时间 HTTP 响应周转的根本原因
所以我的 HTTP 客户端初始化和发送请求代码如下所示。
package http_util
import (
"crypto/tls"
"net/http"
"time"
)
var httpClient *http.Client
func Init() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},MaxIdleConnsPerHost: 200,IdleConnTimeout: 90 * time.Second,TLSHandshakeTimeout: 10 * time.Second,}
httpClient = &http.Client{Transport: tr,Timeout: 30 * time.Second}
}
func SendRequest(ctx context.Context,request *http.Request) (*SomeRespStruct,error) {
httpResponse,err := httpClient.Do(request)
if err != nil {
return nil,err
}
responseBody,err := IoUtil.ReadAll(httpResponse.Body)
defer httpResponse.Body.Close()
if err != nil {
return nil,err
}
response := &SomeRespStruct{}
err = json.Unmarshal(responseBody,response)
if err != nil {
return nil,err
}
return response,nil
}
当我启动我的服务器时,我调用 http_util.Init()
。
当我一次收到多个请求 (20+) 来调用此外部服务器时,就会出现问题。在我的一项职能中,我会
package external_api
import (
"context"
"log"
)
func SomeAPICall(ctx context.Context) (SomeRespStruct,error) {
// Build request
request := buildHTTPRequest(...)
log.Printf("Send request: %v",request)
response,err := http_util.SendRequest(ctx,request)
// Error checks
if err != nil {
log.Printf("HTTP request timed out: %v",err)
return nil,err
}
log.Printf("Received response: %v",response)
return response,nil
}
我的问题是,当请求量很高时,我会根据输出时间戳在 Send request
和 Received response
日志之间出现 15 到 20 秒的延迟。在与处理我的请求的服务器核对后,我发现在他们的一端,端到端的处理时间不到一秒钟(根据我自己的日志,该请求的周转时间很长),所以我不太确定这种高周转时间的根本原因是什么。我还对服务器执行了 traceroute
和 ping
,并且没有延迟,因此这应该不是网络错误。
我环顾四周,似乎建议的解决方案是:
这两件事我都已经做过了。
我不确定是否需要对 HTTP 客户端的配置进行更多调整来解决此问题,或者我是否应该调查其他解决方法,例如重试或可能扩展(但我的 cpu 和内存利用率是在 2-3% 的范围内)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。