【问题标题】:Google Drive API throwing userRateLimitExceeded and then dailyLimitExceededUnregGoogle Drive API 抛出 userRateLimitExceeded 然后 dailyLimitExceededUnreg
【发布时间】:2020-05-02 04:26:20
【问题描述】:

我正在使用 google drive API 来获取几千个文档。我用来连接的凭据正在使用 setServiceAccount 和 setServiceAccountPrivateKey。

当我开始提出请求时 - 我会在短时间内收到以下信息:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "User Rate Limit Exceeded. Rate of requests for user exceed configured project quota. You may consider re-evaluating expected per-user traffic to the API and adjust project quota limits accordingly. You may monitor aggregate quota usage and adjust limits in the API Console: https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=<projid>",
    "reason" : "userRateLimitExceeded",
    "extendedHelp" : "https://console.developers.google.com/apis/api/drive.googleapis.com/quotas?project=<projid>"
  }

在几千个项目之后,我最终得到了这个错误:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "reason" : "dailyLimitExceededUnreg",
    "extendedHelp" : "https://code.google.com/apis/console"
  } ],
  "message" : "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}

我访问了配额页面,我有以下值(UI 不允许我请求将这些配额提高到超出这些值 - 它们是允许的最大值):

Queries per day = 1,000,000,000
Queries per 100 seconds per user = 1,000
Queries per 100 seconds = 10,000

1) 是否可以将每个用户的查询配额增加到 10/秒以上?我可以请求更高的配额 10/秒吗?怎么样?

2) 为什么我会遇到 dailyLimitExceededUnreg 错误?我该如何避免呢?

一些sn-ps代码:

Credential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId(serviceAccountId)
                .setServiceAccountPrivateKey(gdrivePrivateKey)
                .setServiceAccountScopes(ImmutableSet.of(DriveScopes.DRIVE,
                    DirectoryScopes.ADMIN_DIRECTORY_USER,
                    DirectoryScopes.ADMIN_DIRECTORY_GROUP))
                .setServiceAccountUser(serviceAccount.getServiceAccountUser())
                .build();

有时检索文件的属性:

File file = drive.files().get(itemid)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();

或使用drive.files.exportdrive.files.get 之一获取文件

谢谢, 呵呵

【问题讨论】:

  • 请包含您的代码
  • 在上面的原始帖子中添加了一些 - 谢谢

标签: java google-drive-api google-api-java-client service-accounts


【解决方案1】:

好吧,这不是一个真正的答案,但它渴望成为一个评论。我无法帮助您解决此问题,但我们或许能够缓解此问题。

userRateLimitExceeded

userRateLimitExceeded 是您要快速进行的防洪。您达到了无法更改的用户配额。因为您使用的是服务帐户,所以所有内容都集中在同一个用户下。所有请求都有一个可选的参数,称为 quotauser,如果你将它添加到所有请求中说一个随机数,它有时会通过覆盖 IP 地址来帮助。

我不是 Java 开发人员,但该库非常接近 .net 库,可能是这样的。

File file = drive.files().get(itemid)
            .setQuotaUser(randomstring)
            .setFields("id, name, createdTime, modifiedTime, size, webContentLink")
            .execute();

我的问题是,你为什么要处理这么多文件,以至于你会达到速度配额。最好的解决办法是放慢速度,确保每 100 秒发出的请求数少于 1000 个。如果您确实收到错误,请停止几秒钟并再次发送请求。

我不久前用 C# 写了这个,但它可能会有所帮助 google apis flood buster

已超出未经验证使用的每日限制。继续使用需要注册。

我不知道为什么您会收到此错误。此错误通常仅在您发送未经身份验证的请求但您使用的是服务帐户时才会出现,因此不应该发生这种情况。

【讨论】:

  • 感谢您的评论。我们在一个地方使用了 setQuotaUser。我已将其添加到其余部分。我遇到了一些 userRateLimitExceeded 错误(我目前没有限制)。不久之后 - 我又收到 dailyLimitExceededUnreg 错误,但我不知道是什么原因造成的。我们提出大量获取请求的原因是因为我们的软件会获取每个文档并对其进行一些分析 - 所以我们需要处理每个文档。
  • 你唯一的选择是放慢速度。服务帐户是您重载该用户的单个用户。该库本身是为指数退避而设计的,因此它尽其所能。您应该等待几秒钟然后再试一次 没有办法真正 100% 消除此问题 它很大程度上取决于您在请求运行时获得的服务器 获得一个快速的服务器,它可以在 10 秒内运行大量请求然后你会在剩下的 90 秒内被阻止。
  • 谢谢。我们将减慢请求速度,看看是否有帮助。遗憾的是,我似乎或多或少地被返回dailyLimitExceededUnreg 的电话卡住了。昨天下午在我收到 dailyLimitExceededUnreg 之前成功管理了几个(少于 100 个)呼叫,现在我需要再等一天才能尝试使用较慢的速率。
  • 对于dailyLimitExceededUnreg 错误。事实证明,我正在创建自己的 HttpRequestInitializer 对象,以便可以增加某些调用的超时时间。在初始化方法中,我没有调用 credential.initialize(request);方法 - 这是使用正确凭据设置请求所必需的。
猜你喜欢
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多