有谁知道这是什么原因吗?并发请求总是隔段时间就提示:golang Client.Timeout exceeded while awaiting headers

DreamingPHPer · 2023-09-23 19:37:36 · 3153 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-09-23 19:37:36 的主题,其中的信息可能已经有所发展或是发生改变。

// Get 提交
func Get(api string, params, headers map[string]string, tryTimes int) (error, int, interface{}) {
    // 创建请求
    req, _ := http.NewRequest("GET", api, nil)

    // GET 请求携带查询参数
    q := req.URL.Query()
    if len(params) > 0 {
        for key, value := range params {
            q.Add(key, value)
        }
    }
    req.URL.RawQuery = q.Encode()

    // 设置请求头
    if len(headers) > 0 {
        for key, value := range headers {
            req.Header.Set(key, value)
        }
    }

    // 发送请求
    resp, err := client.Do(req)
    if err != nil {
        if tryTimes > 0 {
            return Get(api, params, headers, tryTimes-1)
        }

        // 上报日志
        return err, 0, nil
    }

    // 关闭连接
    defer resp.Body.Close()

    // 读取内容
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        // 上报日志
        return err, resp.StatusCode, nil
    }

    return nil, resp.StatusCode, string(body)
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3153 次点击  
加入收藏 微博
6 回复  |  直到 2023-10-09 11:36:51
jiansoft
jiansoft · #1 · 2年之前

var client = &http.Client{ Timeout: time.Second * 30, // 增加為 30 秒 }

DreamingPHPer
DreamingPHPer · #2 · 2年之前
jiansoftjiansoft #1 回复

var client = &http.Client{ Timeout: time.Second * 30, // 增加為 30 秒 }

但是实际接口响应一般都是在1秒以内

dagongrenzzZ
dagongrenzzZ · #3 · 2年之前
// 发送请求
resp, err := client.Do(req)
if err != nil {
    if tryTimes > 0 {
        return Get(api, params, headers, tryTimes-1)
    }

    // 上报日志
    return err, 0, nil
}

问题应该是出在这里

DreamingPHPer
DreamingPHPer · #4 · 2年之前
dagongrenzzZdagongrenzzZ #3 回复

// 发送请求 resp, err := client.Do(req) if err != nil { if tryTimes > 0 { return Get(api, params, headers, tryTimes-1) } // 上报日志 return err, 0, nil } 问题应该是出在这里

是递归的问题?

dagongrenzzZ
dagongrenzzZ · #5 · 2年之前
DreamingPHPerDreamingPHPer #4 回复

#3楼 @dagongrenzzZ 是递归的问题?

client未重新初始化

harryin777
harryin777 · #6 · 大约1年之前
dagongrenzzZdagongrenzzZ #3 回复

// 发送请求 resp, err := client.Do(req) if err != nil { if tryTimes > 0 { return Get(api, params, headers, tryTimes-1) } // 上报日志 return err, 0, nil } 问题应该是出在这里

这样重试的话,tcp 的四元组是不是一样的呀。那前一个请求如果超过了客户端的的最大等待时间,报错再次发起请求,还是同一个tcp 链接,服务端那边还是没有处理完的。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传