我应该使用多个HttpClients进行批量异步GET请求吗



我有一个场景,需要在尽可能短的时间内发出大量GET请求(大约1000个)。

我知道通常最好保留一个客户端并尽可能多地重用它:

// Create Single HTTP Client
HttpClient client = new HttpClient();
// Create all tasks
for (int x = 0; x < 1000; x++)
{
tasks.Add(ProcessURLAsync($"https://someapi.com/request/{x}", client, x));
}
// wait for all tasks to complete.
Task.WaitAll(tasks.ToArray());
...
static async Task<string> ProcessURLAsync(string url, HttpClient client, int x)
{
var response = await client.GetStringAsync(url);
ParseResponse(response.Result, x);
return response;
}

但是,完成所有请求大约需要70秒。

另一方面,如果我预先创建多个客户端并在它们之间分发请求,则大约需要3秒才能完成:

// Create arbitrary number of clients
while (clients.Count < maxClients)
{
clients.Add(new HttpClient());
}
// Create all tasks
for (int x = 0; x < 1000; x++)
{
tasks.Add(ProcessURLAsync(
$"https://someapi.com/request/{x}", clients[x % maxClients], x));
}
// Same same code as above

由于请求的数据的性质,我需要保持结果的顺序,或者传递与请求相关联的索引。

假设无法更改API以更好地格式化请求的数据,并且所有请求必须在继续之前完成,那么此解决方案是否明智,或者我是否缺少更智能的替代方案?

(为了简洁起见,我使用了任意数量的HttpClient,而我会创建一个HttpClient池,在客户端收到响应后释放客户端,只有在没有响应时才创建一个新的)

我建议进行两项主要更改。

  1. 删除等待,以便可以同时进行多次下载时间
  2. 将DefaultConnectionLimit设置为一个较大的数字(例如50)

最新更新