随着并发数增加http并发请求时间特别长

最近项目想用beego来做,实际测试中发现如果在业务处理中调用了http.Get包访问外部资源,随着并发数的增加,每个request的处理时间成倍的增长,用http原生包也存在这种问题,请问这个问题的具体原因以及该如何优化呢?
代码补充如下:


package main

import (
"net/http"
"fmt"
"sync"
"time"
)

func main() {
mainStart := time.Now()
//n := 10
//n := 100
n := 1000
rsyncGet(n);
mainEnd := time.Since(mainStart)
fmt.Println("main cost", mainEnd.String())
}
func rsyncGet(n int) {
var wg sync.WaitGroup
for i := 0; i < n; i++ {
wg.Add(1)
go func() {
defer wg.Done()
get()
}()
}
wg.Wait()
}

func get() {
getStart := time.Now()
resp, _ := http.Get ("http://www.baidu.com")
defer resp.Body.Close()
getEnd := time.Since(getStart)
fmt.Println("get cost", getEnd.String())
}
已邀请:

philc - https://github.com/philchia

赞同来自: singlethread

io.Copy(ioutil.Discard, resp.Body)

tupunco

赞同来自: mikelingtao

我觉的问题可能是出在你的 网络带宽 或者 资源限制 上.
内网访问外网 会消耗 网关出口网络端口资源, 如果有 大量的业务频繁的访问外部资源 , 肯定会排队的.

maset

赞同来自:

你这种频率访问百度真的可以么。

satng

赞同来自:

自己写个API去试一下

Xargin - 滴滴打杂工

赞同来自:

设置超时

xuxueyun

赞同来自:

看看你的业务服务器日志分析一下,这个根go没啥关系

oohcode

赞同来自:

这个应该是go本身没有限制协程数,当协程数过多后不同协程之间资源就会出现相互抢占,所以解决这个问题的方法是限制协程数,https://github.com/valyala/fasthttp 就是一种解决方案

singlethread - 5年老菜鸟,语言会无数,喜欢go

赞同来自:

用transport复用tcpconn试试
我以前加上以后快了30倍
当然,一切和实际业务有关

要回复问题请先登录注册