在我的应用程序中,我有一项服务,可以发送电子邮件以响应各种用户事件。由于某种原因,一直存在电子邮件发送失败的问题,因此我们放弃了该消息,并且不尝试重试它。此故障模型中包含JVM正在关闭。规则是不应该发生重复的电子邮件,并且未能发送电子邮件是非常不受欢迎的,但可以接受。基本上我们应该能够重试而不必担心重复。
Akko-Persistence将出现在表面上以解决上述问题,但它似乎是为了存储所有消息然后重放它们的一个子集来恢复。
所需的行为是,当actor恢复时,将重放任何未处理的消息(包括发生故障时正在处理的消息)。此外,如果系统被退回,则会发送任何待处理的电子邮件。
是否有一些我错过的Akka文档部分或者是一种简单的方法来实现上述目标?
为了记录,我们正在评估Akka 2.4.8:http://doc.akka.io/docs/akka/2.4.8/
答案 0 :(得分:3)
一旦交付可能无法保证,但您可能已经足够接近这种用例。
如果您在发送失败时遇到异常或某种回调,并且您可以看到某些确认表明它已成功,您可以这样做:
为每封邮件提供一个唯一的ID,并保持一个持久的演员状态,该状态由飞行中的邮件组成,只有在您确定要发送邮件后才发送邮件,当邮件已确认发送时,将其删除从飞行中。
这将在事件日志中产生两个域事件,如MailSent
和MailSendConfirmed
。在演员重播完成后重新启动后,您可以重新发送航班但未确认的邮件。
当然,如果您想通过发送电子邮件来处理其他所有可能失败的事情,那么它将更加困难(发送完成但邮件弹跳,因为电子邮件地址拼写错误)。