performance - 发送多个 HTTP 请求的最快方式

标签 performance http asynchronous go concurrency

我有大约 2000 个用户对象( map )的数组,我需要调用 API 来获取用户详细信息 -> 处理响应 -> 尽快更新我的本地数据库。我使用 Go 的 waitgroup 和 goroutine 来实现并发请求发送方法,但是在我的 2014 Macbook Pro 上调用 2000 个请求大约需要 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()

最佳答案

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

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

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

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

  2. 如果服务器支持 HTTP/2,请确保您使用的是 HTTP/2,这样效率更高(对于多个请求——所以这实际上也取决于上面的 #1)。请参阅有关 debugging HTTP/2 的文档.

  3. 如果 API 支持批量请求,请利用这一点,并在单个请求中请求多个用户。

关于performance - 发送多个 HTTP 请求的最快方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43349394/

相关文章:

c# - async/await - 我使用了错误的同步上下文吗?

jquery ajax 与 async false 挂起 Firefox

java - Java 8 中 AtomicLong 类中与 CAS 相关的更改如何工作?

java - 查找实数数组每个元素频率的最快算法?

http - 为 Jboss 启用 gzip 压缩

javascript - AJAX 可访问的长时间运行的服务任务在启用 ASP.NET 兼容性/ session 的环境中阻止后续的 AJAX 服务请求

c++ - POST HTTP 请求以使用 Java 脚本和 C++ 使用用户名和密码登录

Android ContentProvider 性能

c++ - 在原始循环上使用 boost::irange 的性能损失

c++ - 使用 async_write 同时写入不同的套接字