使用 SendGrid 邮件确保最多一次语义 API
Ensure at-most-once semantic with SendGrid Mail API
我有一个 [Azure 存储] 队列,用于放置要发送的电子邮件。然后,有一个单独的服务监视队列并使用某些服务发送电子邮件。在这种特殊情况下,我使用的是 SendGrid。
因此,理论上,如果发件人在成功调用 SendGrid Mail Send API (https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html) 后立即崩溃,邮件将返回到队列并稍后重试。这可能会导致同一封电子邮件被多次发送,这对于某些类型的电子邮件来说真的很烦人。
避免这种情况的正常方法是为 Send API 提供某种幂等性密钥。那么被调用方可以保证操作最多执行一次。
在仔细阅读 SendGrid 文档和谷歌搜索后,我找不到任何方法来实现我在这里寻找的东西(最多一次语义)。有什么想法吗?
如果 API 本身不支持幂等键,我认为你的选择是有限的。
您可以修改您的电子邮件发送服务,以便在调用发送 API 之前出列和提交。这样,如果服务发送消息失败,则不会重试,因为它已从队列中删除,最多发送一次。
此外,您可以对来自 SendGrid 的特定 HTTP 响应(例如 429 和 5xx)实施一些有限的重试,您确定消息未发送并且重试可能有用 - 这将保持“最多一次”同时降低故障率。可能这应该包括每次尝试之间的一些退避时间。
我有一个 [Azure 存储] 队列,用于放置要发送的电子邮件。然后,有一个单独的服务监视队列并使用某些服务发送电子邮件。在这种特殊情况下,我使用的是 SendGrid。
因此,理论上,如果发件人在成功调用 SendGrid Mail Send API (https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html) 后立即崩溃,邮件将返回到队列并稍后重试。这可能会导致同一封电子邮件被多次发送,这对于某些类型的电子邮件来说真的很烦人。
避免这种情况的正常方法是为 Send API 提供某种幂等性密钥。那么被调用方可以保证操作最多执行一次。
在仔细阅读 SendGrid 文档和谷歌搜索后,我找不到任何方法来实现我在这里寻找的东西(最多一次语义)。有什么想法吗?
如果 API 本身不支持幂等键,我认为你的选择是有限的。
您可以修改您的电子邮件发送服务,以便在调用发送 API 之前出列和提交。这样,如果服务发送消息失败,则不会重试,因为它已从队列中删除,最多发送一次。
此外,您可以对来自 SendGrid 的特定 HTTP 响应(例如 429 和 5xx)实施一些有限的重试,您确定消息未发送并且重试可能有用 - 这将保持“最多一次”同时降低故障率。可能这应该包括每次尝试之间的一些退避时间。