2

在我的应用程序中,我有一个发送电子邮件以响应各种用户事件的服务。一直存在一个问题,即由于某种原因,电子邮件发送将失败,因此我们丢弃该消息并且不尝试重试。此故障模型中包括正在关闭的 JVM。规则是不应该发生重复的电子邮件,并且未能发送电子邮件是非常不受欢迎但可以接受的。基本上我们应该能够重试而不用担心重复。

Akko-Persistence 表面上会出现以解决上述问题,但它似乎旨在存储所有消息,然后重播其中的一部分以进行恢复。

期望的行为是当参与者恢复时重播任何未处理的消息(包括发生故障时正在处理的消息)。此外,如果系统被退回,则发送任何待处理的电子邮件。

是否有我错过的 Akka 文档的某些部分或完成上述操作的简单方法?

作为记录,我们正在为此评估 Akka 2.4.8:http: //doc.akka.io/docs/akka/2.4.8/

4

1 回答 1

3

可能无法保证仅交付一次,但对于这种用例,您可能已经足够接近了。

如果您在发送失败时收到异常或某种回调,并且您可以将其视为成功的某种确认,您可以这样做:

给每封邮件一个唯一的 id 并保持一个持久的参与者状态,该状态由正在运行的邮件组成,只有在坚持你要发送它的事实后才发送邮件,当确认发送邮件时,将其从 in航班。

这将在事件日志中产生两个域事件,例如MailSent和。MailSendConfirmed在演员重播完成后重新启动后,您可以重新发送正在进行但未确认的邮件。

当然,如果您想采取其他所有可能导致发送电子邮件失败的事情,那么这将更加困难(例如,由于电子邮件地址拼写错误,发送完成但邮件退回)。

于 2016-07-28T05:56:19.753 回答