如果删除持久邮箱,如何恢复Akka Actors中的邮件?

时间:2015-09-18 11:50:37

标签: scala akka

我正在使用最新版本的Akka,当时我注意到现在从Akka中移除了持久邮箱。

我需要确保在崩溃后重启时恢复我的消息。是否有其他方法可以在没有持久邮箱的情况下工作或由其他人自定义实现。

我也尝试了Akka Persistence,但它重播了这些消息,我不想在发生崩溃的情况下两次发送相同的消息,因为所有消息的执行都很昂贵。

2 个答案:

答案 0 :(得分:1)

虽然这不是与Akka Actors一起使用的完全解决方案,但它确实在这里解决了原来的问题。

不要在这里使用Akka,我相信使用像Kafka这样的东西以及像akka/reactive-kafka这样的反应流更好。

这样的系统非常适合持久化,并提供非常好的语义来保留崩溃时的消息队列。这比将消息存储在要处理的某个地方更好,并且通常表现更好。

它不一定是Kafka,而是任何可以插入反应流的后端(Akka的实现或其他方式)。

答案 1 :(得分:0)

Akka Persistence重放基于接收到的命令创建的事件。事件是在验证后从命令消息生成的,不应该能够创建无效的actor状态。

这意味着不是最初收到的消息(命令)是必须重播的,但是你可以坚持使用更便宜的事件来重建崩溃后演员的状态。此外,您可以使用snapshots直接恢复状态。

修改 如上所述,评论确实只有演员的状态才会持续存在并在崩溃中幸存下来。此状态仅反映消耗的消息,而不反映仍驻留在actors邮箱中的消息。

然而,不是将消息推送到将存储在持久邮箱中的演员,而是替代可能是“收件人”。从持久性actor中提取消息,该持久性actor将消息列表存储为其状态的一部分。

UntypedPersistentActorWithAtLeastOnceDelivery作为akka持久性的一部分提供了另一种可能性,即发件人负责持久化消息。

我意识到这些不是耐用邮箱的直接替代品,因为它们需要重新考虑系统。到目前为止,拉动消费者的工作对我有用。最初我们还考虑了消息队列产品(具有持久队列的RabbitMQ),但由于我们的初始工作项来自数据库,我们可以处理没有持久消息的akka​​崩溃。