Событие Sourcing и Event / Совокупные версии
Я просто пытался узнать немного больше о CQRS и Event Sourcing.
Просматривая примеры и блоги, я вижу много примеров структур событий, которые похожи на это
public class Event
{
public Guid AggregateId {get; set;}
public string Data {get; set;} //some serialized data
public int Version {get; set;}
}
а затем совокупный
public class Aggregate
{
public Guid AggregateId {get; set;}
public string Name {get; set;}
public int Version {get; set;}
}
Что я не понимаю, так это то, для чего предназначена эта целочисленная версия, и, возможно, из-за отсутствия понимания общей картины я не могу найти ответ.
Это просто счетчик того, какое событие мы проводим в порядке возрастания? Это на самом деле версия события, например, если вы измените схему или что-то еще?
И то же самое с Агрегатами, когда я смотрю на разные агрегаты и вижу одну в версии 1, а другую в версии 2, что именно это должно означать для меня?
1 ответ
Версия события - это на самом деле метаданные, встроенные в полезную нагрузку события, для более легкого доступа к любому потребляющему коду. Это позиция события в определенном потоке, обычно разделенная вдоль оси совокупности.
Теперь некоторые фреймворки / библиотеки должны переносить номер версии, в которой находится агрегат (т. Е. Последнюю занятую позицию, когда агрегат был прочитан), от чтения до записи (добавления новых событий), поэтому вы найдете его в тело совокупного базового класса. Так что, по сути, он существует по причинам оптимистичного параллелизма.
Версии контракта или схемы часто переводятся в имя типа или некоторый атрибут, добавленный к типу (например, пространство имен схемы XML), а не в саму полезную нагрузку (ну, обычно).
Очевидно, что все, представленное как метаданные, может быть внедрено и наоборот.