使用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)实施一些有限的重试,在这种情况下,您可以确定消息未发送并且重试可能有用 - 这将保持“最多一次”,同时降低失败率速度。可能这应该包括每次尝试之间的一些退避时间。