2017-04-26 108 views
2

使用持久性参与者将消息持久存入SQL Server数据库。初始消息格式如下。系统几次运行这种格式,并且这些消息中的许多消息被保存。目前我改变了消息格式以包含如下的几个属性。有人能给我一个想法如何解决这个问题吗?Akka.net持久性参与者恢复失败,消息更改为新属性

目前我面临的问题是恢复最初的持久消息与新的更改失败,并给出如下错误。

“重播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(); 
} 

回答

2

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

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

如果您需要关于该问题的更完整的演讲,Greg Young还会在事件源系统中提供关于事件版本控制的wrote a book

+0

也许是Akka.NET待办事项列表的项目:如果您不应该使用默认的序列化程序,那么它不应该是默认的:-) – mwardm

+0

不幸的是,这里有2个问题;)1.有在存储永久数据时,没有像默认串行器那样的东西。 2)有些人已经在使用Akka.Persistence进行制作 - 我猜他们不会很高兴,因为在将库升级到更高版本后,他们将无法再读取他们的数据。 – Horusiath

+0

@Horusiath什么意思由版本容忍通过线序列化?如何在hocon配置中启用它。它解决了这个问题吗? https://github.com/akkadotnet/Hyperion#version-tolerance –