【问题标题】:Google Drive API - Permissions - Rate limit exceeded. User message: Sorry, you have exceeded your sharing quotaGoogle Drive API - 权限 - 超出速率限制。用户留言:对不起,您已超出共享配额
【发布时间】:2015-04-14 14:52:24
【问题描述】:

我一直在使用 Google Drive API 以编程方式创建和共享文档。昨天我开始收到这个错误消息,每次请求插入权限:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
     "domain" : "usageLimits",
     "location" : "user.sharing",
     "locationType" : "other",
     "message" : "Rate limit exceeded. User message: \"Sorry, you have exceeded your sharing quota.\"",
     "reason" : "userRateLimitExceeded"
     } ],
  "message" : "Rate limit exceeded. User message: \"Sorry, you have exceeded your sharing quota.\""
}

我仍然可以以编程方式创建文档,但插入权限的请求总是失败。

这是通过服务帐户完成的,其想法是服务帐户将为应用程序管理这些文档并根据需要与授权用户共享。

在插入大约 50-100 个权限后开始出现错误。我做了一些研究,听起来 Google Drive API 中可能有一个“功能”,它限制了可以插入的权限数量。有没有办法绕过这个限制?


更新:

为了记录,我每天可以创建 51 个权限。创建第 52 个权限在 24 小时内总是失败。不幸的是,此限制使权限 API 对服务帐户完全无用。

【问题讨论】:

    标签: google-drive-api


    【解决方案1】:

    正如@zdegenr 已经说过的,我还体验到您每 24 小时只能创建大约 50 个权限。我可以通过禁用通过sendNotificationEmails 参数发送通知电子邮件来解决这个问题:https://developers.google.com/drive/v2/reference/permissions/insert

    使用此配置,我不再达到配额...

    【讨论】:

    • 谢谢,这行得通!我想这个设置对于防止将通知电子邮件用作垃圾邮件是必要的。
    • 这并不能解决我的问题。 :( 使用 API v2,我们在同一个文件上进行多次插入,但 sendNotificationEmails=False。但我们达到了插入很少的配额(可能是每天 50 次限制)
    【解决方案2】:

    试试https://www.google.com.ph/search?q=you+have+exceeded+your+sharing+quota&oq=you+have+exceeded+your+sharing+quota&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8 结果中有几个建议,包括请求支持的机制。这是速率限制错误之一,在这种情况下会放慢速度,或者是每日配额问题,在这种情况下请求更高的配额。不管谷歌文档怎么说,如果你得到一个速率限制,不要不要做指数退避,因为它会扼杀你的吞吐量。而是将您的请求限制为大约每 3 秒一个,然后加速或减速直到它们消失。

    【讨论】:

    • 感谢 pinoyyid,我对这些结果进行了非常广泛的研究。其中一页表明允许防止垃圾邮件的共享数量有一个隐藏的每日限制(我猜是通过通知电子邮件):link。如果是这种情况,那么我不确定 Google Drive 是否可以用于以编程方式与某些用户共享文件...
    • 不确定您为什么建议避免指数退避。一直对我很好。将其修复为每秒 3 个请求将无法很好地扩展,并且您正在对等待进行硬编码,而回退是动态等待。
    • @ZigMandel。指数退避适用于某些类别的错误,但不适用于速率限制。根据定义,当客户尝试提交大量交易时会发生速率限制错误,例如为了讨论的目的,假设为 1,000。因此,应用程序的目标是在最短的时间内提交 1,000 笔交易,即以最高的可用吞吐量。您的应用程序将快速连续提交 30 个左右而不会失败。在 30 之后,每个连续的交易都将失败 403,直到您开始限制到 Google 允许的速率。 ...
    • ... 如果您的退避时间小于内部 Google 令牌刷新率 (gtrr),您的重新尝试也将失败,之后的尝试也会失败,直到您的退避延迟超过 gtrr。因此,您已经发送了 2-3 次尝试,然后一次成功,并且每次后续尝试(请记住,到目前为止我们已经发送了 31 次并且正在尝试发送 1,000 次)也将失败,重复,重复。因此,结果是浪费了带宽,浪费了 Google 服务器负载,并且用户体验很糟糕,因为他大约每 6 秒等待 1,000 笔交易......
    • ...正确的方法是将交易限制到 gtrr,这是一个秘密数字,但根据经验大约在 1.5-2s 左右。如果您仔细阅读我的答案,您会看到它说“每 3 秒一个,然后加速或减速直到它们消失。”,即。动态调整交易率,直到它与 gtrr 匹配。基于我进行的大量基准测试,3s 只是一个安全的起点。所以,tl;博士,不要对 403 速率限制错误使用指数回退。这是执行该任务的错误工具。
    【解决方案3】:

    这是一个实现是.NET

    var permissionsBody = new Google.Apis.Drive.v3.Data.Permission()
    {
        Type = "user",
        Role = "reader",
        EmailAddress = "emailAddress",
     };
     var permission = _service.Permissions.Create(permissionsBody, fileId);
     permission.SendNotificationEmail = false;
     permission.Execute();
    

    【讨论】:

      【解决方案4】:

      您可能达到了每秒配额限制。您一次只能提出这么多请求。实现Exponential Backoff,这样当你请求失败时,你会给它一点时间再重试。它应该会减少您看到的速率限制错误的数量。

      【讨论】:

      • 我尝试在添加权限之前添加 10 秒延迟,但遇到了同样的错误。大约一个小时前,我能够再次添加权限(似乎是 24 小时锁定),所以我尝试以编程方式添加 100 个文档和 100 个权限,每 2 秒添加一个新文档。在第 50 次迭代的某个地方,我再次被锁定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多