如何重新启动actor进程-Akka.NET,确保邮箱消息不会丢失?

时间:2019-05-21 18:22:43

标签: akka.net akka.net-persistence

我已经阅读了Akka.NET的在线文档。

我看到持久性插件可以使用事件源模式存储参与者的状态。

但是我没有发现有关邮箱中邮件的任何具体信息。

一个进程死机或重新启动时,参与者的邮箱会恢复邮件吗?

2 个答案:

答案 0 :(得分:0)

根据文档和经验,不是参与者状态保持不变,而是事件更改了状态,然后在参与者重新启动后应用了状态。

Persist()或Recover()期间的消息将被隐藏,并且在actor重新启动时会同时保存邮箱和存储

(“ Actor重新启动仅替换实际的actor对象;邮箱的内容不受重新启动的影响,因此消息处理将在PostRestart挂钩返回后恢复。触发异常的消息将不再被接收。在重新启动时发送给actor的任何消息都将照常排队到其邮箱中。”和“将存储区由Akka.NET从actor实例中移出,就像邮箱一样,因此,如果actor在处理消息时死亡,藏匿处被保存了。“)

但是它是用于正常重启的,请看一下AtLeastOnceDeliveryActor,也许这就是您在寻找保证交付的东西。 并注意preRestart()方法,以在重新启动时保存当前正在处理的消息。

答案 1 :(得分:0)

演员的邮箱始终仅在内存中。在参与者系统中,消息不仅是与用户域相关的命令,而且还是用于控制参与者生命周期,实现协议通信等的各种信号。因此,正在运行的消息量比使用消息代理时要高得多。必须以更高的速度传递和处理它们,而邮箱的持久性将大大减慢该过程。

如果您需要保留域中的命令,最简单的方法是仅使用某种持久性消息队列(例如RabbitMQ,Azure Service Bus甚至是Kafka)作为actor系统前面的外观来处理传入的用户请求。