已提高 Google Drive API 每用户限制,仍然出现 userRateLimitExceeded 错误

Raised Google Drive API Per-user limit, still getting userRateLimitExceeded errors

类似于Raising Google Drive API per-user limit does not prevent rate limit exceptions

在云端硬盘 API 控制台中,配额如下所示:

尽管将每用户限制设置得过高 requests/sec,但我仍然遇到用户级别的速率错误。

我在做什么:

我正在使用大约 8 个线程上传到 Drive,它们都分别实现了 1、2、4、8、16、32、64 秒的稳健指数退避(相当过度的退避-关闭,但必要的恕我直言)。问题可能 仍然 在某些线程中通过所有这些回退仍然存在。

是否还有其他一些未公布/无法设置的费率?

我离 requests/sec 还差得远,而且总配额还有 99.53%。为什么我仍然收到 userRateLimitExceeded 错误?

userRateLimitExceeded基本就是防洪了。它用于防止人们快速发送许多请求。

Indicates that the user rate limit has been exceeded. The maximum rate limit is 10 qps per IP address. The default value set in Google Developers Console is 1 qps per IP address. You can increase this limit in the Google Developers Console to a maximum of 10 qps.

您需要通过实施 Exponential Backoff.

来降低代码速度
  1. 向 API
  2. 提出请求
  3. 收到具有可重试错误代码的错误响应
  4. 等待 1 秒 + random_number_milliseconds 秒
  5. 重试请求
  6. 收到具有可重试错误代码的错误响应
  7. 等待 2 秒 + random_number_milliseconds 秒
  8. 重试请求
  9. 收到具有可重试错误代码的错误响应
  10. 等待 4 秒 + random_number_milliseconds 秒
  11. 重试请求
  12. 收到具有可重试错误代码的错误响应
  13. 等待 8 秒 + random_number_milliseconds 秒
  14. 重试请求
  15. 收到具有可重试错误代码的错误响应
  16. 等待 16 秒 + random_number_milliseconds 秒
  17. 重试请求
  18. 如果仍然出现错误,请停止并记录错误。

我们的想法是,每次您看到该错误时,您都会等待几秒钟,然后再次尝试发送。如果再次出现错误,请稍等片刻。

配额用户:

现在我不确定你的应用程序是如何工作的,但是,如果所有任务都来自同一个 IP,这可能会导致你的问题。正如您在配额中看到的那样,您每秒/每个用户收到 10 个请求。 Google 如何知道它是一个用户?他们查看 IP 地址。如果你所有的请求都来自同一个 IP 那么它是一个用户并且你被锁定为每秒 10 个请求。

您可以通过在您的请求中添加 QuotaUser 来解决这个问题。

quotaUser - Alternative to userIp. Link

  1. Lets you enforce per-user quotas from a server-side application even in cases when the user's IP address is unknown. This can occur, for example, with applications that run cron jobs on App Engine on a user's behalf.
  2. You can choose any arbitrary string that uniquely identifies a user, but it is limited to 40 characters.
  3. Overrides userIp if both are provided.
  4. Learn more about capping usage.

如果您在每次请求时都发送不同的配额用户,比如一个随机数,那么 Google 会认为它是不同的用户,并且会假定它在 10 秒内只有一个请求。当 运行 服务器应用程序从同一 IP 请求所有内容时,这是一个绕过 IP 限制的小技巧。