【问题标题】:Algorithm to Rate limit remote requests速率限制远程请求的算法
【发布时间】:2013-02-08 16:23:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这将取决于服务器在过载时会做什么。它会摔倒并死去,还是只是没有响应然后在一段时间(未知)后恢复?如果你太频繁地超过限制,服务器会切断你吗?
  • 在这种情况下,这取决于。实际上,我正在为大约 9000 个单独的远程主机管理不同的池,我无法控制这些池。编辑:输入太早——有些会超时,有些会拒绝连接,有些会返回 HTTP 50x。我真的没有预见到除此之外的许多其他结果。
  • 另外,我应该提一下,多次发送同一个请求不是问题。

标签: algorithm distributed


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 2013-12-13
    • 1970-01-01
    • 2017-10-03
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多