【问题标题】:Google Drive Rest API - Create File - QuotaGoogle Drive Rest API - 创建文件 - 配额
【发布时间】:2017-10-21 11:17:57
【问题描述】:

我有一个程序,我必须将大约 500,000 个文件复制到谷歌驱动器上的不同文件夹中。我使用谷歌驱动 v3 nodejs api。我每秒发出大约 2 次上传(每 450 毫秒)。过了一会儿,我从 API 得到 ECONNRESET 或套接字挂断。

当我查看 console.cloud.google.com 上的配额时。我离我的配额还差得很远。为什么会失败?

为了好玩,我尝试了 google filestream,它在我的用户帐户下推入驱动器没有问题。它大约快 5 倍。

有人遇到过这个问题吗?

【问题讨论】:

  • 是否有http错误状态?您特别在寻找 304 Rate Exceeded 错误
  • ECONNRESET:socket hang up 是我得到的错误。我熟悉超出的比率。我有两个阶段的过程;一个创建目录,另一个创建文件。第一阶段,我每秒提供大约 5 个目录。我会受到限制,我实施了指数退避。在这种情况下,它只是上面的错误...
  • 明白了。我不知道。请注意,exp 退避远非实现节流的理想算法。为了获得最大吞吐量,您应该实施自适应退避。

标签: google-drive-api


【解决方案1】:

我认为您的配额本身不是问题。当您在短时间内写入过多数据时,就会发生这种情况。尝试放慢速度并尝试将请求分片到不同的用户帐户。这应该有助于减轻您正在执行的许多请求。另外,不要忘记为 4xx 错误重试实现 exponential backoff。我的两分钱。

【讨论】:

  • 文件大小通常为 2kb。完成大约需要一秒钟,所以我试图获得更快的速度。文件制作器(旧版本的谷歌驱动器)似乎做得更快。当我将它放入谷歌驱动器文件夹时,大约需要 16 个小时,而我的需要 4 天。那是我无法解释的部分。我确实实施了指数休假。但是在某些情况下,谷歌需要几秒钟的时间才能返回失败。所以当谷歌说不时,我已经发送了 10 个文件(每秒 3 个文件)......我降低了 10 秒,所以最后它变成了串行
【解决方案2】:

当我调用传递流时,确实会发生这种情况。 developer.google.com 中没有警告,但他们的 github repository 有警告。

您还可以通过将 media.body 指定为可读流来上传媒体。这可以让您上传无法放入内存的非常大的文件。

注意:您的可读流可能不稳定。使用风险自负。

一旦我将其更改为不使用流,我开始收到正确的错误消息,例如状态代码 403,超出了您的速率限制。

我只是将代码更改为使用直接缓冲区。调用前通过 fs.readFileSync 读取缓冲区。

media: {
  mimeType: 'text/plain',
  body: buf
}

【讨论】:

  • 现在我阅读了我的问题,我可以看到这是部分答案。即使我没有超过配额,我仍然不清楚为什么谷歌会返回 403。我猜我在上传文件时遇到了内部未公开的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多