【问题标题】:Can I save the state of my entire Actor System in Akka.NET?我可以在 Akka.NET 中保存整个 Actor 系统的状态吗?
【发布时间】:2023-04-11 03:12:01
【问题描述】:

我一直在阅读和研究 Akka.NET,觉得它非常适合我将要开发的一款非常基本的在线多人游戏。

我对 Akka.NET 中的 Persistence 模块特别感兴趣。我希望能够在任何时间点对我的整个 Actor 系统进行快照,并在我选择的时间恢复该快照(本质上是游戏状态的保存/加载机制)。 Actor 持久性的保存和加载似乎是自动发生的,而我希望手动快照系统的当前状态并在我选择的时间恢复。

使用 Akka.NET 持久性是否可以实现这种情况?

【问题讨论】:

    标签: c# akka akka.net akka.net-persistence


    【解决方案1】:

    Akka.NET 持久化使用event sourcing 作为持久化和重新创建参与者状态的方式。它还支持创建完整当前状态的快照,但这应该被视为性能优化,不能单独使用。另请注意,持久性在每个参与者的基础上起作用。您不能将整个系统冻结为一种状态。

    但是,您可以执行以下操作:实现持久性,但从不持久化任何事件。然后,您向顶级参与者发送一条消息,上面写着“SaveSnapshotRecursive”之类的内容。所有收到该消息的参与者都将保存快照并将消息转发给他们的孩子(他们还应该在快照中记录他们当前孩子的列表)。如果您愿意,此快照存储可以只是基于文件的,您可以随时使用它来恢复完整状态。

    【讨论】:

    • 啊,这听起来像是一个计划……谢谢!所以这些快照需要递归恢复然后我也接受吗?是否能够通过名称等选择性地恢复快照?
    • @ProxyTech 如果您恢复,Akka.Persistence 模块将检查快照。我认为它只会使用最新的。但是,当然,您可以保存几个并将一个放置在您需要的位置。然后它将尝试重播自创建快照以来的所有事件。但既然你没有,那没关系。节点都应该恢复它们的子节点,而子节点又会从快照中获取它们的状态,包括它们的子节点列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多