Akka.net持久性actor恢复失败,消息更改为新属性

时间:2017-04-26 09:43:00

标签: .net akka-http akka.net akka.net-persistence

使用持久性actor将消息持久存储到SQL Server数据库中。初始消息格式如下所示。系统以这种格式运行几次,其中许多消息都是持久的。目前我更改了消息格式以包含少量属性,如下所示。有人能告诉我如何解决这个问题吗?

我目前面临的问题是,在恢复初始保留消息时,新的更改失败并发出如下错误。

“重播persistenceId [tz-persistent-factory]事件时的持久性失败。最后已知的序列号[0]“

public class PlacedMissionDataCommand : IEntityActorMessage
{
    public PlacedMissionDataCommand(int trafficzoneId, int missionId, DateTime finishedTime)
    {
        TrafficzoneId = trafficzoneId;
        MissionId = missionId;
        FinishedTime = finishedTime;
        TaskGroupId = taskGroupId;
        TaskGroupActivated = taskGroupActivated;
        TaskGroupCreated = taskGroupCreated;
        TestData = testData;
    }

    public int TrafficzoneId { get; }
    public int MissionId { get; private set; }
    public DateTime FinishedTime { get; }

    public string EntityId => TrafficzoneId.ToString();
}

完成更改以包含少数属性后

public class PlacedMissionDataCommand : IEntityActorMessage
{
    public PlacedMissionDataCommand(int trafficzoneId, int missionId, DateTime finishedTime, int taskGroupId, DateTime? taskGroupActivated, DateTime? taskGroupCreated)
    {
        TrafficzoneId = trafficzoneId;
        MissionId = missionId;
        FinishedTime = finishedTime;
        TaskGroupId = taskGroupId;
        TaskGroupActivated = taskGroupActivated;
        TaskGroupCreated = taskGroupCreated;
    }

    public int TrafficzoneId { get; }
    public int MissionId { get; private set; }
    public DateTime FinishedTime { get; }

    public int TaskGroupId { get; }

    public DateTime? TaskGroupActivated { get; }

    public DateTime? TaskGroupCreated { get; }

    public string EntityId => TrafficzoneId.ToString();
}

1 个答案:

答案 0 :(得分:2)

这并不意外。您决定将合同(事件架构)更改为没有向后兼容性的合同(在序列化方面) - 已经存储的事件。这不是Akka特定的问题,而是没有任何事件版本控制策略的更广泛的问题。

我前段时间written a post描述了如何在Akka.NET中应用版本化以实现向后不兼容的模式 - 以及为什么不应该使用默认的序列化器。

如果您需要更完整的问题讲座,Greg Young还wrote a book了解事件源系统中的事件版本。