Event Sourcing

Event Sourcing — это шаблон для хранения данных в виде событий в журнале. Вместе с событием (что важно) сохраняется также его контекст, где имеются все важные данные. Если при CRUD подходе мы бы обновили в БД запись, в которой хранятся данные сущности, то при реализации Event Sourcing мы просто добавляем новую строку в журнал. При получении текущего состояния сущности мы должны с помощью кода воспроизвести по имеющимся событиям текущие значения данных сущности. Модели ( View Models или Query Models), которые делают такое воспроизведение называют Проекциями.

Преимущество подхода Event Sourcing состоит, прежде всего, в том, что состояние нужной сущности можно получить на любой момент времени. Это достигается получением выборки событий, происходивших с сущностью.

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

Полезным является и то, что для каждого события мы можем хранить и его контекст.

Event Sourcing хорошо согласуется с паттерном CQRS. В нем тоже есть понятие Проекции и он тоже использует события.

Как можно догадаться, основная проблема шаблона Event Sourcing — производительность модели чтения (Проекции). Большое число событий приводит к агрегации большого числа строк. Обычно эту проблему решают с помощью создания Снимков (Snapshots). Снимки можно привязывать к датам (делать снимок каждый месяц или день) или, например, числу событий (делать снимок после каждых 100 или 1000 событий). При таком подходе Проекция сначала получает ближайший имеющийся снимок, а затем добавляет к нему события, которые произошли после этого снимка.

Основной сложностью при работе с Event Sourcing является перестройка мышления разработчиков. Требуется время, чтобы перестроиться с CRUD подхода и во главе поставить события, а не сущность. Также перед реализацией надо тщательно продумать какие события с какими данными буду использоваться в приложении. Ведь поменять эти вещи позже будет затруднительно. Согласно подходу, события, которые мы добавляем в лог являются неизменяемыми. А значит добавив событие однажды придется поддерживать его в коде на протяжении всей жизни приложения.

Leave a Reply

Ваш адрес email не будет опубликован.