.NET的HttpClient Throttling

Mau*_*cio 6 .net throttling async-ctp dotnet-httpclient

我正在开发一个基于.NET4的应用程序,它必须请求第三方服务器才能从中获取信息.我正在使用HttpClient来发出这些HTTP请求.

我必须在短时间内创建一百或一千个请求.我想将这些请求的创建限制为一个限制(由常量或其他东西定义),以便其他服务器不会收到大量请求.

我已经检查了这个链接,它显示了如何减少随时创建的任务量.

这是我的非工作方法:

// create the factory
var factory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(level));

// use the factory to create a new task that will create the request to the third-party server
var task = factory.StartNew(() => {
    return new HttpClient().GetAsync(url);
}).Unwrap();
Run Code Online (Sandbox Code Playgroud)

当然,这里的问题是即使创建了当时的一个任务,也会同时创建和处理大量请求,因为它们在另一个调度程序中运行.我找不到将调度程序更改为HttpClient的方法.

我该如何处理这种情况?我想将创建的请求数量限制为某个限制,但不要阻止等待这些请求完成.

这可能吗?有任何想法吗?

Joh*_*ski 0

首先,您应该考虑根据网站对工作负载进行分区,或者至少公开一个抽象,让您选择如何对 URL 列表进行分区。例如,一种策略可以是二级域名,例如 yahoo.com、google.com。

另一件事是,如果您正在进行认真的爬行,您可能需要考虑在云上进行。这样云中的每个节点都可以抓取不同的分区。当你说“很短的时间”时,你就已经为失败做好了准备。你需要关于你想要达到的目标的确切数字。

良好分区的另一个主要好处是,您还可以避免在高峰时段访问服务器,并避免在路由器级别面临 IP 禁止的风险,以防站点不简单地限制您。