【问题标题】:"500 Backend Error" using Gmail API - safe to retry?使用 Gmail API 的“500 后端错误” - 可以安全重试吗?
【发布时间】:2017-09-23 08:11:55
【问题描述】:

我正在通过 Gmail API 发送邮件。特别是,我试图在大约 2 秒内从同一个帐户向不同的用户(每个用户 1 封)发送 5-7 封电子邮件。

大约 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"}
    }
}

它似乎不是特定于特定帐户的,因为 6/7 电子邮件可能会成功。

我很犹豫是否要重试,因为害怕向同一个人发送 2 封电子邮件。

有没有办法判断这条消息是否可以安全重试?

【问题讨论】:

    标签: gmail gmail-api


    【解决方案1】:

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

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

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

    解决方案:

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

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

    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. 等待 8 秒 + random_number_milliseconds 秒
    13. 重试请求
    14. 接收具有可重试错误代码的错误响应
    15. 等待 16 秒 + random_number_milliseconds 秒
    16. 重试请求

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

    【讨论】:

    • > 正常的解决方案是等待几秒钟,然后再次发送相同的请求。是的,但问题是错误消息是如此模糊,以至于我不知道它是否实际上发送了。很容易想象正在发送的消息和导致 500 的其他错误。我没有内部信息。你在那里工作并且知道得更多吗?
    • 这是谷歌错误。不,我不为 Google 工作,但我已经使用 Google API 工作了五年。
    • 忘了这个我几周前写了这篇关于同一主题的博文daimto.com/google-apis-flood-buster
    • 你仍然没有回答我的问题 - 错误并没有说明重试是否安全。
    • 正如我所说,Google 建议您实施指数回退检查任何 Google api 上的文档是否有 500 错误developers.google.com/analytics/devguides/reporting/core/v3/…
    【解决方案2】:

    有时会在发送前发生,有时会在发送后发生。

    我从五个不同的电子邮件尝试中记录了“收件人”和“发件人”,这些尝试都收到了 500 后端错误。这些尝试都没有进入我收件箱的“已发送”文件夹。我的结论是它们从未被发送,并且重试这些消息是安全的。但是,在 cmets 中的其他人(见下文)表示邮件实际上已到达远程邮箱,重试不安全。

    【讨论】:

    • 嘿凯文,这不一定是真的,我们有条件发送它,你会得到一个 500 后端错误。强烈建议您进行检查以确保您不会发送重复的电子邮件,因为这种类型的错误意味着 Google 的代码搞砸了,您不知道它在哪里(发送前或发送后)。
    • 您还应该错开特定 Gmail 帐户的电子邮件。当您过于频繁地点击发送 API 时,有时我会看到 500 Backend Error 显示(我相信安全限制是每 3-4 秒 1 次)。
    猜你喜欢
    • 2015-10-20
    • 2014-11-12
    • 2023-03-29
    • 2016-11-30
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    相关资源
    最近更新 更多