发送多个HTTP请求的最快方法

时间:2017-04-11 14:52:26

标签: performance http asynchronous go concurrency

我有一个大约2000个用户对象(地图)的数组,我需要调用API来获取用户详细信息 - >处理响应 - >尽快更新我的本地数据库。我使用Go的waitgroup和goroutine来实现并发请求发送方法,但是为了调用2000个请求,我的2014 Macbook Pro需要大约24秒。反正有没有让它更快?

var wg sync.WaitGroup

json.Unmarshal(responseData, &users)
wg.Add(len(users))

for i:= 0; i<len(users); i++ {
    go func(userid string){
        url := "https://www.example.com/user_detail/"+ userid
        response, _ := http.Get(url) 
        defer response.Body.Close()
        data, _ := ioutil.ReadAll(response.Body)
        wg.Done()
    }(users[i]["userid"])
}

wg.Wait()

1 个答案:

答案 0 :(得分:3)

这种情况很难解决一般。此级别的性能在很大程度上取决于您的服务器,API,网络等的具体情况。但这里有一些建议可以帮助您:

  1. 尝试限制并发连接数。

    正如@JimB在评论中所提到的,对于服务器和客户端来说,尝试处理2000个并发连接可能效率低下。尝试限制为10,20,50,100个同时连接。对每个值进行基准测试,并相应调整,直到获得最佳性能。

    在客户端,这可能允许重新使用连接(从而减少每个请求的平均开销),这是当前不可能的,因为您在任何连接完成之前启动了所有2000个连接。

    < / LI>
  2. 如果服务器支持HTTP / 2,请确保使用HTTP / 2,这样可以更高效(有多个请求 - 所以这实际上也取决于上面的#1)。请参阅有关debugging HTTP/2

  3. 的文档
  4. 如果API支持批量请求,请利用此功能,并在单个请求中请求多个用户。

相关问题