使用Gmail API的“ 500后端错误”-是否可以重试?

Kev*_*rke 5 gmail gmail-api

我正在通过Gmail API发送邮件。特别是,我尝试在2秒钟内将5-7封来自同一帐户的电子邮件发送给不同的用户(每封电子邮件1封)。

这些电子邮件中约有8%出现此错误而失败:

&googleapi.Error{
    Code:500, 
    Message:"Backend Error", Body:`{
        "error": {
            "errors": [
            {
                "domain": "global",
                "reason": "backendError",
                "message": "Backend Error"
            }
            ],
            "code": 500,
            "message": "Backend Error"
        }
    }`, 
    Header:http.Header(nil),
    Errors:[]googleapi.ErrorItem{
        googleapi.ErrorItem{Reason:"backendError", Message:"Backend Error"}
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎并非特定于特定帐户,因为6/7电子邮件可能会成功。

我犹豫要重试此操作,因为担心会向同一个人发送2封电子邮件。

有什么办法可以告诉您此消息是否可以重试?

DaI*_*mTo 5

“代码”:500,“消息”:“后端错误”

基本上是谷歌服务器的问题。您发出的请求花费了很长时间,或者执行请求的服务器很忙并且请求再次花费了很长时间。听起来您正在做的事情不应该导致问题。

不运行时的提示:不要在您将与设置了 cron 作业的每个人一起完成的时间运行,也不要在午夜 (PDT) 运行,因为这是配额重置的时间,并且您将再次与所有设置了 cron 作业的人一起完成爆掉昨天的配额。

解决方案:

正常的解决方案是等待几秒钟,然后再次发送相同的请求。(实现指数退避

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

  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. 重试请求

如果仍然出现错误,请停止并记录错误。


Kev*_*rke 0

有时它可能发生在发送之前,有时发生在发送之后。

我记录了五次不同的电子邮件尝试中的“收件人”和“发件人”,这些邮件均收到 500 后端错误。这些尝试都没有进入我收件箱的“已发送”文件夹。我的结论是它们从未发送过,并且可以安全地重试这​​些消息。然而,评论中的其他人(见下文)指出,邮件实际上已发送到远程邮箱,并且重试并不安全。