未处理消息的 Akka 持久化

Akka persistence of unprocessed messages

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

A​​kko-Persistence 表面上会出现以解决上述问题,但它似乎适合存储所有消息然后重放其中的一部分以进行恢复。

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

我是否遗漏了 Akka 文档的某些部分或完成上述任务的简单方法?

郑重声明,我们正在为此评估 Akka 2.4.8:http://doc.akka.io/docs/akka/2.4.8/

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

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

给每封邮件一个唯一的 id 并保持一个持久的 actor 状态,它由飞行中的邮件组成,只有在确认你要发送邮件的事实后才发送邮件,当邮件被确认发送时,将其从飞行中移除。

这将导致事件日志中出现两个域事件,例如 MailSentMailSendConfirmed。在 actor 重放完成后重新启动后,您可以重新发送正在发送但未确认的邮件。

当然,如果您想解决发送电子邮件可能失败的所有其他问题,那么它会更难(例如,发送完成但邮件退回,因为电子邮件地址拼写错误)。