我正在开发一个使用net/http包调用客户端 URL 的 API 。基于用户国家/地区,goroutine 中的每个请求(POST 调用)同时调用 1 到 8 个 URL。该应用程序可以处理大约 1000-1500 个请求的低 qps,但是将应用程序扩展到 3k 请求,即使只有 1 个客户端 URL 被称为应用程序在几分钟后停止响应,内存也会突然增加(响应时间远高于 50 秒) )。我正在使用 Go 本机net/http包和gorilla/mux路由器。关于这个问题的其他问题说要关闭响应主体,但我已经使用
req, err := http.NewRequest("POST", "client_post_url", bytes.NewBuffer(requestBody))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Connection", "Keep-Alive")
response, err := common.Client.Do(req)
status := 0
if err != nil {//handle and return}
defer response.Body.Close() //used with/without io.Copy
status = response.StatusCode
body, _ := ioutil.ReadAll(response.Body)
_, err = io.Copy(ioutil.Discard, response.Body)
Run Code Online (Sandbox Code Playgroud)
我需要重用连接,因此我已经在这样的 init 方法中初始化了 http 客户端和传输全局变量。
common.Transport = …Run Code Online (Sandbox Code Playgroud) go ×1