Шаблон источник событий подразумевает использование событий в качестве инструмента моделирования бизнес-логики.
В рамках ES источник, состоящий из сохранённых событий, событий должен поднимать события на следующий уровень, и сохранять их.
Шаблон источик событий добавляет новый уровень усовершенствования к архитектуре CQRS. Подразумевается, что основным источником данных в системе являются события. Когда происходит событие, сохраняется связанная с ним коллекция данных. Таким образом система отслеживает то, что происходит, как это происходит, и информацию, которую это приносит.
События должны храниться в журнале, в котором регистрируется всё, что произошло в системе.
Хранилище событий - это база данных, которая не используется для хранения модели данных. а лишь для хранения событий.
- Содержит объекты-собития, содержащие любую информацию, полезную для восстановления состояния объекты, к которому относится событие
- Должно быть в состоянии возвращать поток событий, связанных с данным ключом
- Допускает только добавление и не должно поддерживать обновления и удаления событий.
Событие - простой набор свойств.
Основная задача источников событий - постоянное хранение сообщений, позволяющее отслеживать все изменения в состоянии приложения.
Воспроизведение событий - восстановление состояние системы с помощью прочтения прошлых сообщений.
Проблема связанная с воспроизведением событий в рамках шаблона источника событий - это производительность. Действительно, каждый раз выполнять все операции, произведённые с момента сосдания банковского счёта для того, чтобы узнать, сколько сейчас на нём денег - не самая эффективная операция.
Решением данной проблемы выступают снимки данных
Снимок данных - это сохранение состояния модели в некоторый момент времени.
Снимок данных - это операция сохранения некоторого сосотояния модели после выполнения N операций или хранение в кеше устаревших данных
События способствуют задачно-ориентированному подходу к реализации систем.
Иногда при проектировании системы трудно создать единственнуб полноценную модель событий и эффективнее провести разделение между командами и запросами.
Источники событий - это подход, основанный на идее, что состояние приложения сохраняется как поток событий.
Однако восстановление состояния с нуля может быть ресурсоёмкой задачей, поэтому снимки данных - это один из подходов для решения проблемы подхода источники событий.
Использование шаблона источников событий целесообразно в тех случаях, когда вы получаете выгоду от выражения бизнес-логики благодаря использованию событий в качестве реального источника данных.
Шаблон источники событий подращумевает постоянное хранение событий и восстановление состояния агрегатов по зарегистрированным событиям.
Данный шаблон появился как решение проблемы подхода CRUD, в частности, в связи с тем, что в CRUD довольно сложно отслеживать историю изменений.
-
Когда бизнес требует фиксации намерений и целей операций над данными
- Например, если нужно вывести на экран действия пользователя в системе - заказы, связанные с поездками, которые были совершены, отменены или изменены.
-
Когда нужно выполнить работу на основе зарегистрированных событий
- Например, если нужно вопсроизвести события, чтобы востановить состояние системы, выполнить отмену или откат.
-
Когда в соответствии с бизнес-правилами нужно отделить хранение необработанных данных от моделей и агрегатов.
- Если для написания работоспособной системы достаточно операций CRUD.
- Если в системе не обязательны откаты и восстановления.
Хранилище событий - это обычное постоянное хранилище, в котором сохраняется информация о событиях.
Событие - это по факту DTO, т.е. простой набор свойств.
Проблема возникающая с постоянным хранением событий заключается в том, что не у всех событий есть одна и та же структура и набор свойств.
Обычно для решения этой проблемы используются документо-ориентированные базы даных, например, RavenDB
или MEventStore
.
Шаблон источники событий, конечно, подразумевает обработку событий, но в большей степени он подразумевает использование событий для создания уровня постоянного хранения.
Выбирая этот шаблон, мы не храним данные согласно объектно-ориентированной или реляционной модели, а просто регистрируем происходящие события.
Воспроизведение состояния сущностей реализуется двумя способами:
- Восстановление состояния сущности посредством последовательного выполнения всех событий, произошедших с ней.
- Регистрация события и снимки основных сущностей с определённой переодичностью.