【问题标题】:How do I rate limit my Google Drive API calls?如何对我的 Google Drive API 调用进行速率限制?
【发布时间】:2016-12-17 20:23:37
【问题描述】:

我正在编写一个节点脚本来下载与我在 Google Drive 上的帐户共享的所有图像。

正如其他人在 Stack Overflow 上发布的内容一样,我正在碰壁:Google Drive API file watch rate limits

指数退避对我来说很有意义,我只是不知道如何实现它。

我对此的任何见解都会非常有帮助。即使只是“从...开始”也很棒!

我在下面添加了我正在处理的方法。 Auth 并且一切正常,只是收到userRateLimitExceeded 错误的问题。

任何和所有帮助都将非常棒,非常感谢。

谢谢!

/**
 * Download all of the shared images.
 *
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function downloadImages(auth) {
  const gDrive = google.drive({
    version: 'v3',
    auth: auth
  });

  gDrive.files.list({
    q: 'sharedWithMe = true and mimeType = "image/jpeg"'
  }, (err, resp) => {
    if(err) {
      console.log('The API returned an error: ' + err);
      return;
    }

    if(!resp.files.length) {
      console.error('No files found.');
    } else {
      // Remove existing images.
      // removeImages();

      _.each(resp.files, (file) => {
        if(fs.existsSync(IMAGE_DIR + file.name)) {
          return;
        }

        gDrive.files.get({
          fileId: file.id
        })
        .on('end', () => {
          console.log(chalk.green(file.name + ' successfully downloaded.'));
        })
        .on('error', (err) => {
          console.log(err);
        })
        .pipe(fs.createWriteStream(IMAGE_DIR + file.name));
      });
    }
  });
}

编辑:我研究了批处理,但我猜 google-api-nodejs-client 不支持批处理。我尝试了一个名为“Batchelor”的第三方库。仍然无法让它为我的生活工作。 :(

【问题讨论】:

  • 当你得到速率限制时,gDrive.fkiles.get() 做什么?您是否在可以检测到的 .on('error', ...) 事件处理程序中收到特定错误?如果是这样,那是什么具体错误?基本上,如果您可以帮助我们知道如何检测您何时受到速率限制,我们可以帮助编写代码来处理它。
  • @jfriend00 - 看起来它甚至没有到达错误处理程序。它只会返回一个错误对象,说“userRateLimitExceeded”之类的。我说它没有到达错误处理程序,因为如果我做了类似console.error('error', error) 的事情,我根本看不到我的日志标签。 :(

标签: javascript node.js google-drive-api rate-limiting google-api-nodejs-client


【解决方案1】:

这并不简单,尤其是来自像 JavaScript 这样的 aync 语言。首先,不要做指数退避,正如我在回答你引用的问题时所解释的那样。您最终会在 API 调用之间出现大量延迟。

您可以在https://github.com/pinoyyid/ngDrive/blob/master/src/http_s.ts 中查看代码 这是处理 GDrives 特性的 Angular 1 服务,包括 403。它通过将请求放入内部队列来实现它,然后我有一个进程以可变速率从队列中取出项目以最大化吞吐量,但最小化 403 和话务员重试。

批处理会使情况变得更糟,所以不要走那条路。限制因素不是 http 请求的速率,而是对 GDrive 内部系统的请求速率。一批请求快速连续触发到 GDrive,os 更有可能触发 403。

【讨论】:

  • 感谢您的回复。不幸的是,我无法获得在本地工作的 ngDrive 的简单示例。关于“401。这是一个错误。错误:invalid_client 没有注册的来源”。我想这是我放弃这个想法的地方。 ://
  • 401 只是配置文件。您需要 1/ 在 API 控制台中创建一个客户端 ID,2/ 将其配置到您的应用程序中,3/ 从您在步骤 1 中指定的授权 URL 之一提供您的应用程序
【解决方案2】:

基于此documentation,您收到的error 403userRateLimitExceeded 错误意味着已达到开发者控制台的每用户限制。

请注意 Drive API 有一个:

  • 礼貌的每日配额 1,000,000,000 个请求/天
  • 礼貌的每日配额每秒 100 个请求/秒
  • 每用户限制 10 个请求/秒/用户

这是Drive API默认配额的截图

因此,针对您的错误建议采取的措施是:

  • 在开发者控制台项目中提高每用户配额。 (使用此link 请求更多配额)

  • 如果一个用户代表 Google Apps 域的多个用户发出大量请求,请考虑使用具有权限委派的 Service Account(设置 quotaUser parameter)。

  • 使用exponential backoff

有关更多信息,请查看以下 SO 问题:

【讨论】:

  • “每用户限制 10 个请求/秒/用户”不正确。速率限制比这更复杂,并且没有公开记录。
  • 检查您的开发者控制台,您会看到 User - 100s 的默认配额为 1,000。所以这意味着你有一个每用户限制 10 个请求/秒/用户。检查我提供的屏幕截图。
  • 根本不是这个意思。有许多不同的限制。人们最常遇到的问题是速率限制,它适用于未发布的令牌/桶算法。
【解决方案3】:

对于速率限制,您需要注意的是每用户每秒。

我使用了一个脚本,它每 1.3 秒发送一批 10 个请求,该脚本工作正常。

在 13 秒内发送一批 100 个请求,但在中途开始出现 403 错误。

所以结论:注意每秒,而不是每 100 秒的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2015-02-20
    • 1970-01-01
    • 2018-05-21
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多