【问题标题】:Akka.Net in-memory persistence calls `Recover` after app restart应用重启后 Akka.Net 内存中持久性调用“Recover”
【发布时间】:2021-10-21 23:36:09
【问题描述】:

我正在尝试测试持久性参与者,但行为很奇怪。

我测试过的演员:

public class PredictionManager : ReceivePersistentActor
{
    public override string PersistenceId => _persistanceId;

    public PredictionManager(string persistenceId)
    {
        _persistanceId = persistenceId;
        Command<AddPredictionRequest>(OnPrediction);
        Recover<SnapshotOffer>(x => OnRecover((PredictionManagerState)x.Snapshot), x => x.Snapshot is PredictionManagerState);
    }
    private void OnPrediction(AddPredictionRequest request)
    {
       /* some code */
        _state.Add(request);
        SaveSnapshot(_state);
    }
    private void OnRecover(PredictionManagerState state)
    {
        foreach(var request in state.RequestMap)
        {
            OnPrediction(request.Value);
        }
    }
}

我的状态保存所有消息并在经理演员收到一些消息后将其删除。当我尝试调试我的测试时,首先调用Recover 函数,然后调用OnPrediction。我的问题是——这怎么可能?如果数据存储在内存中,为什么它有SnapshotOffer?我也尝试从Guid.NewGuid() 生成新的percistenceId,但它不起作用。

        public void AddPrediction_PassToChild_CreateNewManager_PassToChild()
        {
            var sender = CreateTestProbe(Sys);
            var persistanceId = "AddPrediction_PassToChild_CreateNewManager_PassToChild";
            var props = Props.Create(() => new PredictionManager(Mock.Of<IEventBus>(), persistanceId));
            var predictionManager = ActorOf(props);
            var message = new PredictionManager.AddPredictionRequest(Props.Create(() => new ChildTestActor(sender.Ref)), 
                new StartPrediction<IPredictionParameter>("a", 1, "a", new Param() ));
            
            //Act
            predictionManager.Tell(message, sender);
            sender.ExpectMsg<string>(x => x == "ok", TimeSpan.FromSeconds(15));
            
            Sys.Stop(predictionManager);
            predictionManager = Sys.ActorOf(props);

            sender.ExpectMsg<string>(x => x == "ok", TimeSpan.FromSeconds(15));
            Sys.Stop(predictionManager);
        }

【问题讨论】:

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


    【解决方案1】:

    我发现快照的默认存储是LocalStorage 而不是MemoryStorage。所以它将快照存储在文件中,这就是为什么它在应用重启后有SnapshotOffer。但我仍然不明白为什么Guid.NewGuid() 因为persistanceId 不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 2020-11-23
      • 2022-12-06
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2019-11-04
      • 2018-06-13
      相关资源
      最近更新 更多