【发布时间】:2020-02-01 03:39:51
【问题描述】:
我有一个异步发送 500 个 HTTP 请求的应用。 15 秒后处理的所有请求都因 HTTP 客户端超时而失败,即使请求的端点已经返回 200 OK。
代码非常简单。在这里,我们获取一大块请求(500),并异步执行它们。需要注意的是,下面的函数是运行在基于消费的计划上的 Azure 函数。
public async Task RunBatch(List<Request> requests)
{
if (requests != null && requests .Count > 0)
{
var tasks = new Task[requests.Count];
var i = 0;
foreach (var request in requests)
{
var request = new HttpRequestMessage(HttpMethod.Post, new Uri(request.Url));
request.Content = new StringContent(request.BodyString, Encoding.UTF8, "application/json");
tasks[i] = _httpClient.SendAsync(request);
i++;
}
await Task.WhenAll(tasks);
}
}
以下代码存在于我的构造函数中
_httpClient = new HttpClient();
_httpClient.Timeout = new TimeSpan(0, 0, 15); // 15 seconds
这是来自 Azure 的日志。
我希望每个请求的超时时间为 15 秒。但是,每当我的服务器开始处理等待的请求时,我需要它给我一个准确的响应代码。这可能吗?
我应该注意:使用更高的 Http 超时(1 分钟),所有请求都会成功。
【问题讨论】:
-
500 个并发请求对于单个客户端来说是很多的。您需要非常小心地处理线程,以确保您的异步任务可以获得足够的 CPU 时间以避免触发超时。
-
可以分享代码吗?看起来您正在循环中调用异步。
-
添加了代码。在这种情况下,为 20 个或类似的批次使用单独的 HTTP 客户端是否有意义?这需要打开很多端口,所以我猜不是。
标签: c# asp.net-core .net-core azure-functions httpclient