如何以编程方式处理服务器吞吐量配额?

How to deal with server throughput quota programatically?

我有一个程序可以对 Google Search Analytics 服务器进行多次查询。我的程序按顺序一个接一个地执行查询,因此每一瞬间,只会处理一个查询。

Google 建议每 100 秒最多 2000 个查询的吞吐量限制,以便将我的系统配置为更高效,我可能有两个想法:

  1. 知道每 100 秒 2000 次查询是每 0.05 秒一次查询,我通过休眠进程来分隔我的查询,但前提是任何查询花费的时间少于 0.05 秒,所以时间在这种情况下进程将休眠是完成 0.05 秒间隔的剩余时间。如果查询需要 0.05 秒或更长时间,我会立即触发以下内容。

  2. 第二个想法更容易实现,但我认为它的效率会降低:我将触发查询并记录进程开始的时间,所以如果我在 100 秒内达到 2000 个查询,剩下的时间我就等着睡觉。

到目前为止我还不知道如何衡量哪一个是最好的。

您对这两个选项有何看法?他们中的任何一个都更好,为什么?我还没有想出任何其他选择吗? (特别是如果它比我的好)

其实你需要考虑的是它每100秒2000个请求。但是您可以在 10 秒内完成所有 2000 个请求,并且仍然处于配额的良好状态。

我很好奇你为什么担心它。如果您遇到以下错误之一

  • 403 userRateLimitExceeded
  • 403 rateLimitExceeded
  • 429RESOURCE_EXHAUSTED

Google 只是建议您实施 Exponential backoff,其中包括让您的请求让错误休眠一会儿,然后重试。 (最多执行八次)。 Google 不会因为出现这些错误而惩罚您,他们只是要求您稍等片刻再试。

如果您想发疯,您可以像我在 C# 应用程序中所做的那样做一些事情 我创建了一个请求队列,我用它来跟踪自从我创建最后 100 个请求以来已经过去了多少时间。我称之为 Google APIs Flood Buster.

基本上我有一个队列,我在发出新请求之前记录每个请求,我检查它从我开始以来已经过去了多长时间。是的,这需要稍微移动队列中的项目。如果超过 90 秒,我就会睡觉(100 秒后),这大大减少了我的错误。它并不完美,但那是因为 google 在跟踪您的配额方面并不完美。他们通常会有一点偏差。