【发布时间】:2014-11-02 20:38:00
【问题描述】:
我正在寻求支持或特殊知识。
在我的应用中,我使用 Google Drive,需要插入/删除 1000 多个文件的权限。 Google API 不允许我在一个请求中设置多个文件的权限,因此我需要发出 1000 多个请求(或将其打包成一批或几批)。
我的请求如下所示:
POST /drive/v2/files/0B18tlN6SgYRaUzl1MUlnNHlGSEE/permissions?sendNotificationEmails=false&quotaUser=00787465305247954313&alt=json
但是当我尝试向 Google Drive API 发出批量请求时,我收到了带有很多错误响应的批量响应。批处理中很少有第一个响应是可以的,但不是全部。
大部分错误响应如下所示:
Content-Type: application/http
Content-ID: <response-280781395>
HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=UTF-8
Date: Tue, 09 Sep 2014 11:45:03 GMT
Expires: Tue, 09 Sep 2014 11:45:03 GMT
Cache-Control: private, max-age=0
Content-Length: 199
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 403,
"message": "Rate Limit Exceeded"
}
}
其中一些看起来像这样:
HTTP/1.1 500 Internal Server Error
Content-Type: application/json; charset=UTF-8
Date: Tue, 09 Sep 2014 11:45:03 GMT
Expires: Tue, 09 Sep 2014 11:45:03 GMT
Cache-Control: private, max-age=0
Content-Length: 180
{
"error": {
"errors": [
{
"domain": "global",
"reason": "internalError",
"message": "Internal Error"
}
],
"code": 500,
"message": "Internal Error"
}
}
批处理中的最后几个响应如下所示:
Content-Type: application/http
Content-ID: <response-901482964>
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=UTF-8
Date: Tue, 09 Sep 2014 11:45:03 GMT
Expires: Tue, 09 Sep 2014 11:45:03 GMT
Cache-Control: private, max-age=0
Content-Length: 171
{
"error": {
"errors": [
{
"domain": "global",
"reason": "badRequest",
"message": "Bad Request"
}
],
"code": 400,
"message": "Bad Request"
}
}
当我遇到配额限制错误并决定在 Google Drive Console 中增加请求/用户/秒配额时,这很奇怪。它设置为 10000/用户/秒。但是我只批量发送了 1000 个请求,但已经收到“403 Rate Limit Exceeded”错误。然后我开始收到“500 Internal Error”错误。
然后我发现我应该将 'quotaUser' 参数设置为请求,但没有任何改变。我仍然遇到这些错误。
对 Google Drive Web UI 的调查向我展示了如果决定共享 1000 多个文件,Google Drive 如何设置文件权限。我花了大约 20-30 分钟 才共享我的所有文件。在活动面板中,我看到文件成束共享。有时这些束是 1 个文件大小,有时是 40 个文件大小。但最终所有文件都共享了,看起来 Google Drive 团队使用了重试队列之类的东西,或者只是没有为自己的请求设置配额。
主要问题是:
- 为什么我仍然收到这些配额错误(指定为 10000 Google Cloud Console 中的请求/用户/秒限制)以及如何避免 他们?
- 为什么 Google Drive API 返回“500 内部错误”和“400 错误请求”错误?
- 有什么解决方法吗?
P.S.:我有兴趣帮助 Google Drive 团队,我可以提供完整的跟踪和代码示例。
【问题讨论】:
-
见stackoverflow.com/questions/18529524/…和stackoverflow.com/questions/18578768/…。这看起来像是 Google 知道但不会修复的错误
-
@pinoyyid 什么对你有用?任何优雅的批量大小或回退?
-
我放弃了批次,因为它们加剧了问题。你会认为在发送一批之后,Drive 的内部流控制会正确处理它们,但事实并非如此。似乎有一桶 20-30 个令牌,所以如果您更新的令牌少于 30 个,那就没问题了。高于该数字,代币补充感觉(传闻)约为每秒 1 次。这就是前 30 个之后的有效驱动器写入限制。退避是最后的手段 - 它会杀死吞吐量。您应该主动节流以避免它。我在 timeOut(,1500) 循环中提交更新并向我的用户道歉。
标签: javascript google-api google-drive-api quota