Если Event sourcing для вас новинка, то перед дальнейшим прочтением рекомендую изучить хотя бы некоторые видео из списка ниже:

Краткое описание

Event sourcing – это архитектурный принцип. В разных интерпретациях он немного отличается. Введем определения, чтобы говорить на одном языке:

  • Для изменения данных принимаются команды. Например, RegisterUser. Команда может ответить ошибкой, если посчитает, что невозможно выполнить. Команда формирует 1+ событий.
  • События – это свершившийся факт. Они хранятся отдельно, например, в какой-нибудь табличке в базе. Или в Kafka. Например, UserRegistered. Назовем хранилище event store.
  • Агрегат – центральный термин транзакционности. Каждое событие привязано к нему. Например, User(GUID="...."). Видно, что обычно у агрегата есть тип (user) и id (guid).
  • При чтении данных иногда в памяти создают агрегат, прокручивают в нем события – таким образом получают текущее состояние агрегата – и отдают его в нужной форме. Это называется живая проекция. Звучит на первый взгляд странно, но при размере агрегата до 20 событий работает практически моментально.
  • А иногда используется обычная БД, оптимизированная под чтение. Ее называют проекцией. Потенциально, таких баз может быть несколько (например, Elasticsearch для полнотекстового поиска и Postgres для обычных запросов). Обычно одну из них называют основной проекцией.
  • Чтобы сделать проекции есть обработчики, которые слушают появление новых событий. Их называют проекторы.
  • Если проекторы работают синхронно с добавлением новых событий, то это встроенные проекторы (inline). Иначе это асинхронные проекторы.
  • Для сайд-эффектов (общение с внешними системами, создание вторичных событий) есть отдельный вид обработчиков – реакторы.

Проекции можно разделить на 3 типа:

  • встроенные (inline) проекции - запускается как часть механизма получения команд
  • асинхронные (async) проекции - работают как фоновый процесс (а значит с задержками)
  • живые (live) проекции - не используется дополнительное храналище, вычисляются динамически из событий

Event sourcing замечательно сочетается с “CQRS”. По сути event sourcing – это продолжение CQRS внутри бекэнд части приложения, включая БД. Поэтому их иногда не различают, но это разные вещи.

Кто-то внедряет event sourcing в части приложения, кто-то полностью.

Отмечу, что к схеме выше есть множество вариаций, т.к. это принцип, а даже не определенная архитектура.

Примеры реализаций

Коммерческие движки:

Open source движки:

Open source шаблоны приложений:

1C

Не сразу очевидно, что 1С – это самое популярное event sourcing решение. Оно и не мудрено – там идет интенсивная работа с людьми и деньгами, а значит нужна история.

Журнал документов – event store. Регистры – проекции. И т.п.