Восстановление актера постоянства 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 для обратно несовместимых схем, и почему вам не следует использовать сериализатор по умолчанию.
Если вам нужна более полная лекция о проблеме, Грег Янг также написал книгу о версиях событий в системах, основанных на событиях.