0

假设我有一个非常大的请求池要发送到远程主机。与任何服务器一样,远程主机的容量有限。所有的消息最终都必须被传递,及时性是可取的,但并不重要。除了监视我发送的请求的响应时间和/或失败率之外,我无法知道远程主机的这个容量。

我需要开发一种算法,以在不使远程主机崩溃的情况下以最大化吞吐量的速率发送请求。

最好的输出变量似乎是请求之间的时间段,使得请求 N 在请求 N-1 之后 M 纳秒分派。

我应该如何处理确定最佳费率的问题?有没有我可以建立的论文?或者有人能想出一些神奇的算法吗?以前有人做过吗?

注意:令牌桶也不是我要寻找的答案。我已经在使用非常类似于令牌桶的东西,但我正在寻找一种方法来确定应将令牌添加到桶中的速率。

4

1 回答 1

2

当我写我的网络爬虫时,我没有想出一个神奇的算法。我们使用了一些启发式方法,这些方法似乎做得相当不错,尽管肯定不是完美的。

首先,我们查看了站点的 robots.txt 文件。如果它有一个爬行延迟条目,我们不会超过它来尊重它。

对于其他服务器,我们将保持最后 n 个请求所需时间的平均运行时间(我认为我们确定了值 5),并且我们将确保我们发送请求的频率永远不会超过该平均值。我们测量了从发出请求到完成处理响应的时间。

如果服务器超时,则该请求的时间将进入运行平均值。

如果我们从服务器获得 50x,我们会在向该服务器发出另一个请求之前延迟相当长的时间(五分钟或更长时间)。重复 50 次响应将导致我们停止发出请求,直到有人可以查看问题所在。

我们还跟踪了 40 倍的响应。许多未找到或访问被拒绝会导致爬虫停止处理域并引发标记,以便有人可以查看它。

我们有一个分布式爬虫。没有单个爬虫会向同一个域发出并发请求,并且我们有一些跨服务器通信,这使得多个服务器向同一个域发出并发请求是不寻常的。

我确信这并没有最大化任何特定服务器上的吞吐量,但它确实让较大的站点非常繁忙。对我们来说更重要的是,它阻止了我们(大多数情况下,无论如何)被许多网站阻止。

我们还对许多使用 API 的站点进行了特殊情况处理。有些人会说他们的请求限制是多少,我们会调整这些站点的设置,以便我们直接排队。但我们只有几十个。手动配置 9,000 台服务器的请求频率(然后跟上变化)是不现实的。但是,您也许可以手动配置十几个或两个。

于 2013-02-23T00:47:59.323 回答