Восстановление актера постоянства Akka.net завершилось неудачно с изменением сообщения с новыми свойствами

Использовал субъект сохранения для сохранения сообщения в базе данных 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 ответ

В этом нет ничего неожиданного. Вы решили изменить контракт (схему событий) на тот, который не имеет обратной совместимости - с точки зрения сериализации - с событиями, которые уже были сохранены. Это не проблема Akka, а более общая проблема, связанная с отсутствием какой-либо стратегии управления версиями событий.

Некоторое время назад я написал сообщение о том, как применять даже версии в Akka.NET для обратно несовместимых схем, и почему вам не следует использовать сериализатор по умолчанию.

Если вам нужна более полная лекция о проблеме, Грег Янг также написал книгу о версиях событий в системах, основанных на событиях.

Другие вопросы по тегам