谷歌驱动 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 超出用户速率限制