【发布时间】:2021-06-13 19:34:26
【问题描述】:
使用 IHttpClientFactory 创建了一个 HttpClient 并向 WebApi 并行发送 1000 个 GET 调用,并观察到每个请求大约 3-5 分钟的延迟。一旦完成后再次并行发送 1000 个 GET 请求,这次没有延迟。
现在我将并行请求增加到 2000,对于第一批,每个请求延迟大约 9-11 分钟。而对于第二个 2000 个并行请求,每个请求的延迟约为 5 分钟(如果是 1000 个请求,则没有延迟。)
var client = _clientFactory.CreateClient();
client.BaseAddress = new Uri("http://localhost:5000");
client.Timeout = TimeSpan.FromMinutes(20);
List<Task> _task = new List<Task>();
for (int i = 1; i <= 4000; i++)
{
_task.Add(ExecuteRequest(client, i));
if (i % 2000 == 0)
{
await Task.WhenAll(_task);
_task.Clear();
}
}
private async Task ExecuteRequest(HttpClient client, int requestId)
{
var result = await client.GetAsync($"Performance/{requestId}");
var response = await result.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<Response>(response);
}
试图理解,
- HttpClient 无延迟支持多少并行请求。
- 如何针对 2000 个或更多并行请求提高 HttpClient 的性能..
【问题讨论】:
-
您是否考虑过 API 可能是瓶颈?
-
对您作为开发人员一无所知,我不得不想知道您是如何将数千个操作排队以并行运行的。有许多简单的方法可以做到这一点,这会导致很大的性能损失。作为第一步,我会说用 no-ops 替换你的 HTTP 调用,看看运行需要多长时间。
-
@FranzGleichmann API 又是一个示例 ASP.Netcore Web API,它通过示例响应响应请求,而不需要像 I/O 这样的耗时活动。
-
延迟听起来像是内存问题。最初的缓慢响应是系统正在尝试获取所需的内存来保存结果。一旦应用程序获得了所需的内存,操作就会很快。
-
@KevinKrumwiede 用示例代码更新了帖子
标签: c# .net-core httpclient asp.net5