2016-06-24 14 views
8

Я читал около CQRS+EventSoucing шаблонов (которые я хочу применить в ближайшем будущем), и одна точка, общая для всех колод и презентаций, которые я нашел, - это сделать снимки состояния модели, чтобы восстановить это, но ни одна из этих моделей/стратегий совместного использования.Стратегии снятия снимков и восстановления

Интересно, если вы могли бы поделиться своими мыслями и опытом в этом вопросе, особенно с точки зрения:

  • Когда снимок
  • Как смоделировать магазин снимок
  • Применение/кэш холодного запуска

TL; DR: Как вы внедрили Snapshotting в свое приложение CQRS+EventSourcing? За и против?

ответ

6

Есть несколько примеров, которые нужно сделать для моментального снимка. Но есть пара - общий пример - это учетная запись в книге. У вас будут тысячи, возможно, миллионы кредитных/дебетовых событий, которые дают окончательное состояние учетной записи BALANCE - было бы безумным, если бы не снимок так часто.

Мой подход к snapshoting, когда я разработал Aggregates.NET был его выключен по умолчанию и для того, чтобы ваши агрегаты или объекты должны наследоваться от AggregateWithMemento или EntityWithMemento, которые в свою очередь, ваша организация должна определить RestoreSnapshot, а TakeSnapshot и ShouldTakeSnapshot

решение о том, следует ли делать снимок или нет, остается перед самой сущностью. Обычная картина:

Boolean ShouldTakeSnapshot() { 
    return this.Version % 50 == 0; 
} 

Какой, разумеется, будет сделан моментальный снимок каждые 50 событий.

При чтении потока сущности первое, что мы делаем, это проверка моментального снимка, а затем чтение остальной части потока объекта с момента снятия моментального снимка. IE: Не просите весь поток только ту часть, которую мы не сделали.

Что касается магазина - вы можете использовать буквально все. VOU прав, хотя магазин с ключом лучше всего, потому что вам нужно только 1. проверить, существует ли он. 2. загрузить всю вещь - что идеально подходит для kv

Для перезагрузки системы - я не совсем понимаю, описанный проблема есть. Нет никаких оснований для того, чтобы ваш сервер домена был сдержанным в том смысле, что он делает что-то другое в разные моменты времени. Он должен сделать только одно дело - обработать следующую команду. В процессе обработки команды он загружает данные из хранилища событий, включая моментальный снимок, выполняет команду против объекта, который либо создает бизнес-исключение, либо события домена, которые записываются в хранилище.

Я думаю, что вы можете слишком много оптимизировать с помощью этих разговоров о кешировании и холодном запуске.

4
  • Правило № 1: Не надо.
  • Правило № 2: Не надо.

Снимок модели, основанной на событиях, является оптимизацией производительности. Первое правило оптимизации производительности? Не.

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

Если ваш репозиторий может хранить модель в памяти, то вы не собираетесь ее перезагружать очень часто. Таким образом, выигрыш от моментального снимка будет небольшим. Поэтому: нет.

Если вы можете разложить свою модель на aggregates, что означает, что вы можете разложить историю вашей модели на несколько объектов, которые имеют непересекающиеся истории, то ваша модель с длинной моделью истории становится многою короткой историей что каждый описывает изменения в одном объекте. Каждая история сущностей, которую нужно загрузить, будет довольно короткой, поэтому выигрыш от моментального снимка будет небольшим. Поэтому: нет.

Системы, которые я сегодня работаю, требуют высокой производительности, но не доступности 24x7. Поэтому в ситуации, когда я закрыл свою систему для maintenace и перезапустил ее, мне пришлось бы загружать и перерабатывать весь мой магазин событий, так как моя новая система не знает, какие агрегированные идентификаторы обрабатывают события. Мне нужна лучшая отправная точка для перезагрузки моих систем.

Вы обеспокоены отсутствием SLA для записи, когда тайники памяти хранилища холодные, и у вас есть длинные истории моделей с большим количеством событий для перезагрузки. Болтинг на снимке может быть намного более разумным, чем попытка реорганизовать вашу историю моделей в более мелкие потоки. OK ....

Магазин моментальных снимков модель - в любой момент времени вы должны убрать модель и перестроить ее из сохраненной истории в магазине событий.

С точки зрения хранилища хранилище моментальных копий является кешем; если моментальный снимок не доступен, или если сам магазин не отвечает в SLA, вы хотите вернуться к переработке всей истории событий, начиная с начального состояния семени.

Интерфейс поставщика услуг будет выглядеть как

interface SnapshotClient { 
    SnapshotRecord getSnapshot(Identifier id) 
} 

SnapshotRecord собирается предоставить в хранилище информацию, необходимую для потребления снимок. Это будет включать как минимум

  1. в памяти что позволяет репозитарий регидратации snapshotted государству
  2. описания последнего события, обрабатываемого снимок проектор при создании снимка.

модели будет затем повторно увлажняет snapshotted состояния от сувенира, загрузите историю из хранилища событий, сканирование назад (то есть, начиная с самим последним события) ищут события документированных в SnapshotRecord , затем примените последующие события по порядку.

Сам SnapshotRepository может быть магазин ключ-значение (не более одной записи для любого данного идентификатора), но реляционная база данных с поддержкой больших двоичных объектов будет работать отлично слишком

select * 
from snapshots s 
where id = ? 
order by s.total_events desc 
limit 1 

Проектор снимок, и репозиторий они должны согласовать, каково должно быть состояние объекта для всех возможных историй, им нужно согласиться с тем, как де-гидратировать память, и им нужно согласовать, какой идентификатор будет использоваться для определения моментального снимка ,

Плотная муфта также означает, что вам не нужно беспокоиться, особенно о схеме для памятника; массив байтов будет в порядке.

Однако им не нужно соглашаться с предыдущими воплощениями самих себя. Snapshot Projector 2.0 отбрасывает/игнорирует любые снимки, оставленные Snapshot Projector 1.0 - хранилище моментальных снимков просто кеш в конце концов.

Я разрабатываю приложение, которое, вероятно, будет генерировать миллионы событий в день. что мы можем сделать, если нам нужно, чтобы восстановить вид 6 месяцев спустя

Одним из наиболее убедительных ответов здесь является модель времени явно. Есть ли у вас одна организация, которая живет в течение шести месяцев, или у вас есть 180 объектов, каждый из которых живет в течение одного дня? Учет является хорошей областью для ссылки здесь: в конце финансового года книги закрыты, а книги следующего года открываются с переносом.

Yves Reynhout часто говорит о времени моделирования и планировании; Evolving a Model может быть хорошей отправной точкой.

+0

Системы, которые я сегодня работаю, требуют высокой производительности, но не доступности 24x7. Поэтому в ситуации, когда я закрыл свою систему для maintenace и перезапустил ее, мне пришлось бы загружать и перерабатывать весь мой магазин событий, так как моя новая система не знает, какие агрегированные идентификаторы обрабатывают события. Мне нужна лучшая отправная точка для перезагрузки моих систем. – Mikhas

+0

А что, если вы не сохраните всю историю? на самом деле я разрабатываю приложение, которое, вероятно, будет генерировать миллионы событий в день. что мы можем сделать, если нам нужно перестроить представление через 6 месяцев? Не могли бы вы дать совет? –

+0

См. Правки, и разговор Рейнхаута. – VoiceOfUnreason

 Смежные вопросы

  • Нет связанных вопросов^_^