Gmail API-超出了速率限制[429],后端错误[500]

PNC*_*PNC 5 c# google-api quota google-api-dotnet-client gmail-api

我们有一个使用Gmail API来访问Gmail中电子邮件的应用程序。

我们随机收到以下错误消息

Google.Apis.Requests.RequestError超出速率限制[429]错误[消息[超出速率限制]位置[-]原因[rateLimitExceeded]域[usageLimits]]

然后我们在错误事件中重试代码并得到

Google.Apis.Requests.RequestError后端错误[500]错误[消息[后端错误]位置[-]原因[backendError]域[全局]]

然后我们在发生错误事件时在我们的代码中重试(我们尝试了3次),它按预期工作。

此处的Gmail API后端存在一些问题。我们每天要进行1000次以下的Gmail API调用,并且没有并行进行,因此我看不到我们违反了任何限制。

还有其他人遇到这种奇怪的行为吗?

这是被调用的代码

 UsersResource.MessagesResource.GetRequest gr = gs.Users.Messages.Get(emailAccount, msgId);
 {
        gr.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;
        Message m = new Message();
        try
        {
            m = gr.Execute();
        }
 }
Run Code Online (Sandbox Code Playgroud)

DaI*_*mTo 1

Gmail API 具有相同的每日使用限制(适用于应用程序发出的所有请求)以及每用户速率限制。

  • 每日使用量 每天 1,000,000,000 个配额单位 每个用户速率限制
  • 每个用户每秒 250 个配额单位,移动平均值(允许短突发)

超过速率限制(速度太快)将导致HTTP 403 or HTTP 429请求响应过多,您的应用程序应通过指数退避重试来响应。

500 错误是服务器故障,服务器响应时间过长,导致您的请求超时。此问题的解决方案与上述错误的解决方案相同,您应该实施指数退避并重试。

指数退避是网络应用程序的标准错误处理策略,其中客户端在逐渐增加的时间内定期重试失败的请求。如果大量请求或繁重的网络流量导致服务器返回错误,指数退避可能是处理这些错误的好策略。相反,它不是处理与速率限制、网络容量或响应时间无关的错误的相关策略,例如无效的授权凭据或文件未找到错误。

如果使用得当,指数退避可以提高带宽使用效率,减少获得成功响应所需的请求数量,并最大限度地提高并发环境中请求的吞吐量。

简单指数退避的实现流程如下。

  1. 向 API 发出请求
  2. 接收具有可重试错误代码的错误响应
  3. 等待 1s + random_number_milliseconds 秒
  4. 重试请求
  5. 接收具有可重试错误代码的错误响应
  6. 等待 2s + random_number_milliseconds 秒
  7. 重试请求
  8. 接收具有可重试错误代码的错误响应
  9. 等待 4s + random_number_milliseconds 秒
  10. 重试请求
  11. 接收具有可重试错误代码的错误响应
  12. 等待 8s + random_number_milliseconds 秒
  13. 重试请求
  14. 接收具有可重试错误代码的错误响应
  15. 等待 16s + random_number_milliseconds 秒
  16. 重试请求
  17. 如果仍然出现错误,请停止并记录错误。