Email 使用SendGrid邮件API最多确保一次语义

Email 使用SendGrid邮件API最多确保一次语义,email,sendgrid,sendgrid-api-v3,Email,Sendgrid,Sendgrid Api V3,我有一个[Azure Storage]队列,可以在其中放置要发送的电子邮件。然后,还有一个单独的服务,它监视该队列并使用某些服务发送电子邮件。在本例中,我使用的是SendGrid 因此,从理论上讲,如果发送方在成功调用SendGrid Mail Send API()后立即崩溃,消息将返回队列,稍后重试。这可能会导致同一封电子邮件被多次发送,这对于某些类型的电子邮件来说可能非常烦人 避免这种情况的正常方法是提供某种幂等键来发送API。然后被调用方可以确保操作最多执行一次 在仔细阅读SendGrid

我有一个[Azure Storage]队列,可以在其中放置要发送的电子邮件。然后,还有一个单独的服务,它监视该队列并使用某些服务发送电子邮件。在本例中,我使用的是SendGrid

因此,从理论上讲,如果发送方在成功调用SendGrid Mail Send API()后立即崩溃,消息将返回队列,稍后重试。这可能会导致同一封电子邮件被多次发送,这对于某些类型的电子邮件来说可能非常烦人

避免这种情况的正常方法是提供某种幂等键来发送API。然后被调用方可以确保操作最多执行一次


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

如果API本身不支持幂等键,我想您的选择是有限的

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


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

嗯,我认为这不是一个好主意。当然,“最多一次”是这样保证的,但是为什么要使用电子邮件队列呢?这里队列的整体思想是“消息生成”和“消息传递”的时间解耦。如果我们不使用队列提供的重试和手动重试,为什么还要麻烦使用队列?您目前至少有一次。你最多要求一次。您可以按照我前面提到的方式在这两者之间进行选择,但是如果没有幂等性,您就不能只实现一次,除非您正在谈论的队列和服务都支持某种形式的共享事务。这正是分布式系统的本质。事实上,我只要求过一次(我已经通过在我这边有一个队列部分实现了这一点。另一边缺少的是一个幂等键)。然后答案应该是:“不,使用当前的SendGrid API不可能有一次语义”。我只是担心我错过了什么。看来我不是。谢谢你的确认!