未处理消息的 Akka 持久化
Akka persistence of unprocessed messages
在我的应用程序中,我有一个发送电子邮件以响应各种用户事件的服务。一直存在一个问题,即由于某种原因,电子邮件发送将失败,因此我们丢弃了该消息,并且不再尝试重试。此故障模型中包括正在关闭的 JVM。规则是不应该发生重复的电子邮件,并且不发送电子邮件是非常不可取的,但可以接受。基本上我们应该能够重试而不用担心重复。
Akko-Persistence 表面上会出现以解决上述问题,但它似乎适合存储所有消息然后重放其中的一部分以进行恢复。
期望的行为是在 actor 恢复时重播任何未处理的消息(包括发生故障时正在处理的消息)。此外,如果系统被退回,则会发送任何待处理的电子邮件。
我是否遗漏了 Akka 文档的某些部分或完成上述任务的简单方法?
郑重声明,我们正在为此评估 Akka 2.4.8:http://doc.akka.io/docs/akka/2.4.8/
可能无法保证准确一次交付,但对于这种用例,您可能已经足够接近了。
如果您在发送失败时收到异常或某种回调,并且您可以将其视为成功的某种确认,您可以这样做:
给每封邮件一个唯一的 id 并保持一个持久的 actor 状态,它由飞行中的邮件组成,只有在确认你要发送邮件的事实后才发送邮件,当邮件被确认发送时,将其从飞行中移除。
这将导致事件日志中出现两个域事件,例如 MailSent
和 MailSendConfirmed
。在 actor 重放完成后重新启动后,您可以重新发送正在发送但未确认的邮件。
当然,如果您想解决发送电子邮件可能失败的所有其他问题,那么它会更难(例如,发送完成但邮件退回,因为电子邮件地址拼写错误)。
在我的应用程序中,我有一个发送电子邮件以响应各种用户事件的服务。一直存在一个问题,即由于某种原因,电子邮件发送将失败,因此我们丢弃了该消息,并且不再尝试重试。此故障模型中包括正在关闭的 JVM。规则是不应该发生重复的电子邮件,并且不发送电子邮件是非常不可取的,但可以接受。基本上我们应该能够重试而不用担心重复。
Akko-Persistence 表面上会出现以解决上述问题,但它似乎适合存储所有消息然后重放其中的一部分以进行恢复。
期望的行为是在 actor 恢复时重播任何未处理的消息(包括发生故障时正在处理的消息)。此外,如果系统被退回,则会发送任何待处理的电子邮件。
我是否遗漏了 Akka 文档的某些部分或完成上述任务的简单方法?
郑重声明,我们正在为此评估 Akka 2.4.8:http://doc.akka.io/docs/akka/2.4.8/
可能无法保证准确一次交付,但对于这种用例,您可能已经足够接近了。
如果您在发送失败时收到异常或某种回调,并且您可以将其视为成功的某种确认,您可以这样做:
给每封邮件一个唯一的 id 并保持一个持久的 actor 状态,它由飞行中的邮件组成,只有在确认你要发送邮件的事实后才发送邮件,当邮件被确认发送时,将其从飞行中移除。
这将导致事件日志中出现两个域事件,例如 MailSent
和 MailSendConfirmed
。在 actor 重放完成后重新启动后,您可以重新发送正在发送但未确认的邮件。
当然,如果您想解决发送电子邮件可能失败的所有其他问题,那么它会更难(例如,发送完成但邮件退回,因为电子邮件地址拼写错误)。