HttpClient 中有多少个连接

How many connections in HttpClient

背景

我必须从 Internet 下载大约 16k 份文档和相同数量的 html 页。未来这个数字还会增加。目前我只是使用 Parallel.ForEach 并行下载和处理数据。然而,这似乎并没有充分利用我的资源,所以我计划让 async/await 发挥作用,尽可能多地异步下载 运行,但我可能不得不限制它。

实际问题

单个 HttpClient 可以打开多少个连接?创建如此多的连接时,我还必须牢记哪些其他因素?我知道我应该重用相同的 HttpClient 我也读过 this answer,但我怀疑我是否真的可以同时打开数十亿个连接。

首先,关于从 Parallel.ForEach 切换到 async/await 的良好呼吁。通过打破线程的限制,您将能够按数量级提高并发性。

I have doubts that I can really have several billion connections open at once.

假设你可以。你认为这项工作会比你同时打开 1000 个工作更快地完成吗?您首先要遇到的限制是带宽(或者可能是服务器拒绝请求),而不是并发连接。因此,如果您的目标是尽快完成工作,我建议您一次可以打开的最大连接数甚至都不重要。

也就是说,.NET 有默认限制。假设您使用的是完整框架或 .NET Core 2.x,可以通过 ServicePointManager.DefaultConnectionLimit 以编程方式更改限制,它的默认值仅为 2。将其设置为更大的值。

接下来,我建议使用 SemaphoreSlim 或 TPL 数据流设置您的代码以同时执行下载,直至达到某个限制。 this question 的答案中很好地涵盖了这两种方法。然后开始试验,直到你想出一个最佳数字。很难说那是什么。也许从 50 开始。如果进展顺利,将其增加到 100,看看整个作业是否完成得更快。如果您开始收到从服务器返回的套接字异常或错误,请将其调低。