我有一个大约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()
答案 0 :(得分:3)
这种情况很难解决一般。此级别的性能在很大程度上取决于您的服务器,API,网络等的具体情况。但这里有一些建议可以帮助您:
尝试限制并发连接数。
正如@JimB在评论中所提到的,对于服务器和客户端来说,尝试处理2000个并发连接可能效率低下。尝试限制为10,20,50,100个同时连接。对每个值进行基准测试,并相应调整,直到获得最佳性能。
在客户端,这可能允许重新使用连接(从而减少每个请求的平均开销),这是当前不可能的,因为您在任何连接完成之前启动了所有2000个连接。
< / LI>如果服务器支持HTTP / 2,请确保使用HTTP / 2,这样可以更高效(有多个请求 - 所以这实际上也取决于上面的#1)。请参阅有关debugging HTTP/2。
如果API支持批量请求,请利用此功能,并在单个请求中请求多个用户。