微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

诊断 Golang 中长时间 HTTP 响应周转的根本原因

如何解决诊断 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 requestReceived response 日志之间出现 15 到 20 秒的延迟。在与处理我的请求的服务器核对后,我发现在他们的一端,端到端的处理时间不到一秒钟(根据我自己的日志,该请求的周转时间很长),所以我不太确定这种高周转时间的根本原因是什么。我还对服务器执行了 tracerouteping,并且没有延迟,因此这应该不是网络错误

我环顾四周,似乎建议的解决方案是:

  1. 增加MaxIdleConnsPerHost
  2. 完整读取 HTTP 响应正文并关闭

这两件事我都已经做过了。

我不确定是否需要对 HTTP 客户端的配置进行更多调整来解决此问题,或者我是否应该调查其他解决方法,例如重试或可能扩展(但我​​的 cpu 和内存利用率是在 2-3% 的范围内)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。