随着并发数增加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年老菜鸟,可以用任意语言写hello world,喜欢go

赞同来自:

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

要回复问题请先登录注册