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

How can I ensure that mailbox messages will not be lost if the actors process is restarted - Akka.NET?

我已阅读 Akka.NET 的联机文档。

我看到 Persistence 插件可以使用事件源模式存储 actor 的状态。

但我没有在邮箱中找到任何关于邮件的具体信息。

当一个进程死亡或重启时,参与者的邮箱恢复消息?

根据文档和经验,不是持久化 actor 状态而是改变状态的事件,然后在 actor 重启后应用。

Persist() 或 Recover() 期间的消息将被存储,并且在 actor 重启时邮箱和存储都被保存

("An actor restart replaces only the actual actor object; the contents of the mailbox is unaffected by the restart, so processing of messages will resume after the PostRestart hook returns. The message that triggered the exception will not be received again. Any message sent to an actor while it is being restarted will be queued to its mailbox as usual." 和 "Stashes are handled by Akka.NET out of the actor instance just like the mailbox, so if the actor dies while processing a message, the stash is preserved.")

但它是为了正常重启,看看AtLeastOnceDeliveryActor,也许这就是您正在寻找的保证交付。 并注意preRestart()方法在重启时保存当前正在处理的消息。

演员的邮箱总是in-memory。在actor系统中,消息不仅是与用户域相关的命令,而且是用于控制actor生命周期、实现协议通信等的各种信号。因此消息量in-flight比使用消息代理时要高得多。它们必须以更高的速度传递和处理,而邮箱持久性会大大减慢该过程。

如果你需要从你的域中持久化你的命令,最简单的方法就是使用某种持久化消息队列——比如 RabbitMQ、Azure Service Bus 甚至 Kafka——作为你的 actor 系统前面的门面处理传入的用户请求。