【问题标题】:Ensure at-most-once semantic with SendGrid Mail API使用 SendGrid Mail API 确保最多一次语义
【发布时间】:2021-02-02 02:19:22
【问题描述】:

我有一个 [Azure 存储] 队列,用于放置要发送的电子邮件消息。然后,有一个单独的服务可以监视该队列并使用某些服务发送电子邮件。在这种特殊情况下,我使用的是 SendGrid。

因此,理论上,如果发件人在成功调用 SendGrid 邮件发送 API (https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html) 后立即崩溃,则邮件将返回队列并稍后重试。这可能会导致同一封电子邮件被多次发送,这对于某些类型的电子邮件来说可能真的很烦人。

避免这种情况的正常方法是为 Send API 提供某种幂等性密钥。那么被调用方就可以保证操作最多执行一次。

在仔细阅读 SendGrid 文档和谷歌搜索后,我找不到任何方法来实现我在这里寻找的东西(最多一次语义)。有什么想法吗?

【问题讨论】:

    标签: email sendgrid sendgrid-api-v3


    【解决方案1】:

    如果 API 本身不支持幂等性密钥,我认为您的选择是有限的。

    您可以在调用发送 API 之前修改您的电子邮件发送服务以出列并提交。这样,如果服务发送消息失败,将不会重试,因为它已经从队列中删除,最多发送一次。

    此外,您可以对来自 SendGrid 的特定 http 响应(例如 429 和 5xx)实施一些有限的重试,您可以确定消息未发送并且重试可能有用 - 这将保持“最多一次”同时降低故障速度。可能这应该包括每次尝试之间的一些退避时间。

    【讨论】:

    • 好吧,我认为这不是一个好主意。当然,这种方式可以保证“最多一次”,但是为什么要完全使用队列来接收电子邮件呢?这里队列的整个想法是“消息生成”和“消息传递”的时间解耦。如果我们不使用队列提供的重试和手动重试 - 为什么还要使用队列?
    • 您目前至少拥有一次。你要求最多一次。您可以按照我提到的方式在这两者之间进行选择,但是如果没有幂等性,您将无法实现完全一次,除非您正在谈论的队列和服务都支持某种形式的共享事务。这正是分布式系统的本质。
    • 实际上,我只要求一次(我已经通过在我身边设置一个队列部分实现了这一点。缺失的部分是另一边的幂等键)。那么答案应该是:“不,使用当前的 SendGrid API 不可能有完全一次的语义”。我只是害怕我错过了什么。看来我不是。感谢您确认!
    • @DmytroGokun “实际上,我已经要求精确一次”,但您的问题标题是“确保最多一次语义......”。
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多