谷歌驱动 API 超出用户速率限制

Posted

技术标签:

【中文标题】谷歌驱动 API 超出用户速率限制【英文标题】:User Rate Limit Exceeded with google drive API 【发布时间】:2019-05-08 05:37:16 【问题描述】:

我正在 Google Drive API 之上构建一个网络应用程序。基本上,Web 应用程序显示照片和视频。媒体存储在 Google Drive 文件夹中:通过身份验证后,应用程序向 Google Drive API 发出请求,以获取媒体的 URL 并显示每个 URL。目前,我只有 16 张图像要显示。这些图像是硬写在应用程序中的(用于演示)。

我的应用程序访问 Google Drive API 时遇到问题。确实,经过多次尝试,随机请求出现此错误

超出用户速率限制。用户请求率超过配置的项目配额。 您可以考虑重新评估 API 的预期每用户流量,并 相应调整项目配额限制。 您可以在 API 控制台中监控总配额使用情况并调整限制: https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=XXXXXXX"

所以我查看了 API 控制台并没有发现什么特别之处,根据我的说法,我没有超过速率限制。可能我用错了google API,其实我也不知道……

我按照 Google Drive API 文档检查我是否做错了什么。对于每个 API 请求,请求都包含访问令牌,因此它应该可以正常工作!

该应用程序的演示可用:https://poc-drive-api.firebaseapp.com

源码也有:https://github.com/Mcdostone/poc-google-drive-api(文件App.js)

【问题讨论】:

见 ***.com/questions/18578768/… 和 ***.com/questions/18529524/… 。您需要实施节流。注意 NOT 指数退避 在我的例子中,使用 curl multiple 同时上传 50 -> 200 个文件。我购买 10 VPS 只是为了代理请求以避免速率限制,但它从未消失。可能使用多个帐户可以解决问题。 【参考方案1】:

403: User Rate Limit Exceeded 是防洪。一个用户一次只能发出这么多请求。不幸的是,您正在查看的图表中未显示用户速率限制。该图表实际上在显示真正发生的事情方面非常糟糕。如果您超出限制,Google 会在后台进行测试并排除错误。他们不需要在图表中实际向我们展示这一点

403:超出用户速率限制

已达到每个用户的限制。这可能是来自开发者控制台的限制或来自云端硬盘后端的限制。

“错误”: “错误”:[ “域”:“使用限制”, "原因": "userRateLimitExceeded", “消息”:“超出用户速率限制” ], “代码”:403, “消息”:“超出用户速率限制”

建议的操作:

在开发者控制台项目中提高每用户配额。 如果一个用户代表 G Suite 域的多个用户发出大量请求,请考虑使用具有权限委派的服务帐号(设置 quotaUser 参数)。 使用指数退避。

当您开始遇到此错误消息时,IMO 要做的主要事情是实现exponential backoff,这样您的应用程序将能够放慢速度并再次发出请求。

【讨论】:

【参考方案2】:

在我的情况下,我正在并行遍历 Google Drive 文件夹并收到此错误。我通过使用 Bottleneck 库实现客户端速率限制解决了这个问题,请求之间有 110 毫秒的延迟:

const limiter = new Bottleneck(
    // Google allows 1000 requests per 100 seconds per user,
    // which is 100ms per request on average. Adding a delay
    // of 100ms still triggers "rate limit exceeded" errors,
    // so going with 110ms.
    minTime: 110,
);

// Wrap every API request with the rate limiter
await limiter.schedule(() => drive.files.list(
    // Params...
));

【讨论】:

【参考方案3】:

我使用 limiter 库来强制执行“每 100 秒 1000 次查询”限制,但我仍然遇到 403 错误。我终于偶然发现了this 页面,其中提到:

在 API 控制台中,有一个类似的配额,称为每位用户每 100 秒的请求数。默认情况下,它设置为每个用户每 100 秒 100 个请求,并且可以调整为最大值 1,000。但对 API 的请求数限制为每位用户每秒最多 10 个请求。

所以我更新了限制器库,使其每秒只允许 10 个请求,而不是每 100 秒 1,000 个请求,它的作用就像一个魅力。

const RateLimiter = require('limiter').RateLimiter;

const limiter = new RateLimiter(10, 1000);

【讨论】:

我认为这无关紧要,因为您所指的页面不是 Google Drive API 的限制,但它显示“以下配额适用于 Management API、Core Reporting API v3、MCF Reporting API、元数据 API、用户删除 API 和实时报告 API"【参考方案4】:

您可以使用我创建的这个名为 rate-limited-queue 的零依赖库来限制队列中任务的执行率。

每秒限制 10 个请求可以这样实现:

const createQueue = require("rate-limited-queue");

const queue = createQueue(
  1000 /* time based sliding window */,
  10 /* max concurrent tasks in the sliding window */);

const results = await queue([
  () =>  /* a request code goes here */ ,
  () =>  /* another request code goes here */ 
  // ...
]);

【讨论】:

【参考方案5】:

您可以将任何特定文件从谷歌驱动器下载到您的 colab.. 使用

!gdown https://drive.google.com/uc?id=14ikT5VererdfeOnQtIJREINKSDN

值 post id 是您点击驱动器中文件的共享链接时将获得的内容

【讨论】:

以上是关于谷歌驱动 API 超出用户速率限制的主要内容,如果未能解决你的问题,请参考以下文章

批量查询超出速率限制

使用 C# MVC 的 GMail API 超出用户速率限制

请求 gmail-api 时出现 HttpError 429:超出用户速率限制

几次请求后超出用户速率限制

通过Node和Redis进行API速率限制

Laravel - 限制特定 API 路由的速率