moh*_*eli 7 c# concurrency http .net-core
我正在尝试从机器发送大量 HTTP 请求。但似乎 .NET Core 或我不知道的 Windows 正在限制可以发出的并发 HTTP 请求的数量,或者给定时间段内 HTTP 请求的配额。
我怎样才能增加这个?我记得我们在 .NET Framework 中有一个配置,但我也找不到。
Pan*_*vos 15
HTTP 1.1 协议建议每个域只应发出 2 个并发请求。.NET Framework 和 .NET Core 都将此限制用于桌面应用程序。ASP.NET 应用程序有 10 个并发请求的限制。两个运行时都允许您更改限制。
这个限制在不久前对浏览器来说是有意义的,但对于面向服务的应用程序来说限制太大了。现在浏览器允许大约 8 个并发连接,服务/REST 应用程序可以处理更多。
ServicePointManager.DefaultConnectionLimit可用于更改整个应用程序的限制,例如:
ServicePointManager.DefaultConnectionLimit = 100;
Run Code Online (Sandbox Code Playgroud)
您还可以指定每一个极限HttpClient情况下,通过使用HttpClientHandler与HttpClientHandler.MaxConnectionsPerServer属性设置为所需的限制:
var handler = new HttpClientHandler
{
MaxConnectionsPerServer= 100,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
HttpClient client = new HttpClient(handler);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以为每个目标服务设置不同的限制。
不要急于将限制设置为一个巨大的数字。目标服务可能无法处理来自同一客户端的 20 或 40 个并发请求。写得不好的服务可能会导致服务器崩溃或泛滥。并发请求可能会相互阻塞,降低实际吞吐量。编写好的服务可能会对每个客户端或队列请求施加速率限制。
您会惊讶于一些所谓的高流量服务的行为有多糟糕。我遇到过如果在一分钟内发出超过10 个并发请求,航空公司服务可能会崩溃。配置不当的负载均衡器仍会将流量引导到那些崩溃的服务至少 1-2 分钟,直到服务重新启动,使重试变得毫无意义。