【问题标题】:What is the order of Akka.Persistence recovery?Akka.Persistence 恢复的顺序是什么?
【发布时间】:2016-08-09 20:57:34
【问题描述】:

我在 Petabridge 博客上阅读了 Akka.Persistence intro,我发现这部分代码有点混乱:

    Recover<string>(str => _msgs.Add(str)); // from the journal
    Recover<SnapshotOffer>(offer => {
        var messages = offer.Snapshot as List<string>;
        if(messages != null) // null check
            _msgs = _msgs.Concat(messages);
    });

您可能想要在恢复时做的是...首先拍摄最后一个快照,然后重播上面日志中的消息。

但是这里我们有两个Recover() 声明,并且日志是第一个。当 Akka .NET 执行恢复时,这些Recover() 方法的顺序实际上是如何发挥作用的?

【问题讨论】:

    标签: akka.net akka.net-persistence


    【解决方案1】:

    Recover 仅用于在声明的 Actor 中注册消息处理程序,与 ReceiveActor 中的 Receive 工作方式相同。因此,声明恢复处理程序的顺序并不重要。

    来自下面的评论:

    在恢复过程中,持久性actor首先询问是否有任何快照,它可以用来从中恢复 - 因此SnapshotOffer 将始终在其余事件之前触发。然后它询问快照后发生的事件,它收到了。它们将按顺序处理,它们来自事件日志并由第一个匹配的Recover 处理程序处理。

    【讨论】:

    • 不,Command 用于注册消息处理程序。 Recover 是另外一回事。
    • Command 用于注册消息处理程序。 Recover 用于注册事件处理程序(存储在事件日志中的对象),一旦持久性参与者恢复其状态,就会重播。抱歉,我没有写,在您的用例中似乎是不言自明的。
    • 好吧,既然你有两个 Recover() 声明,Akka .NET 如何决定先做哪个?
    • 在恢复过程中,持久性actor首先询问是否有任何快照,它可以用来恢复-因此SnapshotOffer将始终在其余事件之前触发。然后它询问快照后发生的事件,它收到了。它们将按顺序处理,它们来自事件日志并由第一个匹配的Recover 处理程序处理。
    • 好,你为什么不在你的答案中加入这个解释(也许有一个支持它的参考)?
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2018-06-19
    相关资源
    最近更新 更多