【问题标题】:Raised Google Drive API Per-user limit, still getting userRateLimitExceeded errors提高了 Google Drive API Per-user 限制,仍然出现 userRateLimitExceeded 错误
【发布时间】:2015-07-09 10:39:36
【问题描述】:

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

在 Drive API 控制台中,配额如下所示:

尽管将每用户限制设置为不必要的高请求/秒,但我仍然在用户级别遇到速率错误。

我在做什么:

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

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

我离请求/秒还差得很远,但总配额仍然是 99.53%。为什么我仍然收到 userRateLimitExceeded 错误?

【问题讨论】:

    标签: google-api google-drive-api quota


    【解决方案1】:

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

    表示已超出用户速率限制。最大速率 限制为每个 IP 地址 10 qps。 Google 中设置的默认值 开发人员控制台是每个 IP 地址 1 qps。你可以增加这个 在 Google Developers Console 中限制为最大 10 qps。

    您需要通过实现Exponential Backoff 来减慢您的代码速度。

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

    我们的想法是,每次看到该错误时,您都会等待几秒钟,然后尝试再次发送它。如果您再次收到错误,请等待更长的时间。

    配额用户:

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

    您可以通过将 QuotaUser 添加到您的请求中来解决此问题。

    quotaUser - userIp 的替代品。 Link

    1. 即使在用户 IP 地址未知的情况下,您也可以从服务器端应用程序强制执行每个用户的配额。这可能发生, 例如,对于在 App Engine 上运行 cron 作业的应用程序 代表用户。
    2. 您可以选择任何唯一标识用户的任意字符串,但限制为 40 个字符。
    3. 如果两者都提供,则覆盖 userIp。
    4. 详细了解上限使用情况。

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

    【讨论】:

    • 在我的编辑中,我描述了我正在实施的指数回退。对于我的应用程序架构:最近有来自一个 IP 的 4 个线程发出请求。这些线程必须进行本地 IO,调用其他 Web 服务,最后将文件上传到 Drive——它们不仅一直在请求 Drive,因此不太可能有 4 个线程每秒中断 10 个请求。 --> 即使使用这种架构,我也得到了 userRateLimitExceededErrors,奇怪的是我以前没有,当时我碰巧每个 IP 使用 8 个线程
    • 8 个线程运行相同的 ip 每秒可以发送 8 个请求。一两个跑得快到足以踢出 10 个的机会非常高。只需将 quotauser 添加到您的请求中,它就会立即解决问题。
    • 如果我对您的理解正确的话,您的 quotaUser 工作听起来很有吸引力。为什么云端硬盘会检查“用户”的 IP 而不是正在使用/模拟的云端硬盘用户?
    • 你现在有一个请求 url 去谷歌。在末尾添加这个 &quotaUser=12345 (12345 应该是一个随机数) 它所做的只是告诉谷歌这是一个不同的用户,而不是你之前的呼叫。如果每个线程调用都解决了不同的用户问题,您的配额是每个“用户”每秒 10 个请求。
    • 你不是唯一使用它的开发者,他们必须公平并为我们所有人设置限制。
    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多