未处理消息的Akka持久性
在我的应用程序中,我有一个服务,可以发送电子邮件以响应各种用户事件。有一个持续的问题,即电子邮件发送将失败,由于某种原因,所以我们会删除该邮件,不尝试重试。此故障模型中包括正在关闭的JVM。规则是不应该出现重复的电子邮件,不发送电子邮件是非常不受欢迎的,但可以接受。基本上,我们应该能够重试,而不必担心重复 Akko持久化表面上是为了解决上述问题,但它似乎是为了存储所有消息,然后重放其中的一个子集以进行恢复 所需的行为是,当参与者恢复时,任何未处理的消息(包括发生故障时正在处理的消息)都将被重放。此外,如果系统被跳转,则会发送任何挂起的电子邮件 是否有我遗漏的Akka文档的某些部分,或者有一种简单的方法来完成上述内容未处理消息的Akka持久性,akka,akka-persistence,Akka,Akka Persistence,在我的应用程序中,我有一个服务,可以发送电子邮件以响应各种用户事件。有一个持续的问题,即电子邮件发送将失败,由于某种原因,所以我们会删除该邮件,不尝试重试。此故障模型中包括正在关闭的JVM。规则是不应该出现重复的电子邮件,不发送电子邮件是非常不受欢迎的,但可以接受。基本上,我们应该能够重试,而不必担心重复 Akko持久化表面上是为了解决上述问题,但它似乎是为了存储所有消息,然后重放其中的一个子集以进行恢复 所需的行为是,当参与者恢复时,任何未处理的消息(包括发生故障时正在处理的消息)都将被重放。
为了记录在案,我们正在评估Akka 2.4.8:一次交付可能无法保证,但对于这种用例,您可能已经足够接近了 如果您在发送失败时收到异常或某种回调,并且您可以将其视为成功的确认,您可以这样做: 为每封邮件指定一个唯一的id,并保持一个持久的参与者状态,该状态由飞行中的邮件组成,只有在持久化了您将要发送邮件的事实后才发送邮件,当邮件已确认发送时,将其从飞行中删除 这将导致事件日志中出现两个域事件,如
mailssent
和mailssendconfixed
。重新启动后,当actor replay完成时,您可以重新发送飞行中但未确认的邮件
当然,如果你想接受发送电子邮件时可能失败的所有其他事情,那么这将非常困难(例如,发送完成但邮件会反弹,因为电子邮件地址拼写错误)