2017-04-26 50 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 –