Event Sourcing (журналирование событий) — мощный архитектурный паттерн, который в последние годы окружен ореолом «серебряной пули». Он обещает полный аудит, временные срезы данных и легкое исправление ошибок. Однако его реализация сопряжена со значительной сложностью: eventual consistency, сложности с запросами (CQRS часто идет в паре), необходимость в снэпшотах и событийной совместимости. К счастью, мир архитектуры данных не ограничивается только Event Sourcing. Существуют проверенные альтернативы, которые решают схожие бизнес-задачи, но с иным компромиссом сложности и функциональности. Рассмотрим пять таких подходов, суть которых можно уловить буквально за час.
**1. Паттерн «Аудит-логи» (Audit Trail) в рамках традиционной CRUD-архитектуры.** Это самый простой и часто упускаемый из виду подход. Вместо того чтобы делать события единственным источником истины, вы сохраняете текущее состояние в реляционной или документной БД обычным образом. Параллельно, в отдельную таблицу или коллекцию, вы записывайте журнал всех значимых изменений: кто, когда, что и как изменил (старое и новое значение). Преимущества: простота реализации (триггеры в БД или логика на уровне приложения), использование знакомых инструментов запросов к актуальным данным. Недостаток: история вторична, восстановление состояния на произвольный момент времени может быть нетривиальным. Идеально для: требований compliance и базового аудита без необходимости «путешествий во времени».
**2. Временные (Temporal) таблицы в реляционных СУБД.** Современные СУБД, такие как PostgreSQL, SQL Server, Oracle, поддерживают нативную функциональность temporal tables. Вы определяете таблицу с системными периодами времени (valid_from, valid_to). При обновлении или удалении строки СУБД автоматически архивирует ее предыдущую версию в историческую таблицу. Запрос к текущим данным выглядит стандартно. Чтобы получить состояние на определенную дату, используется специальный синтаксис (например, `FOR SYSTEM_TIME AS OF ...`). Это «Event Sourcing от базы данных» без необходимости писать сложный код событийной модели. Плюсы: прозрачность, производительность, стандартный SQL. Минусы: привязка к конкретной СУБД, история хранится на уровне строк, а не бизнес-событий.
**3. Паттерн «Состояние-событие» (State-Event) или «Двойная запись».**
Это гибридный подход. Основная сущность хранит свое текущее состояние (как в CRUD). Но каждое изменение состояния сопровождается созданием immutable записи-события, которая объясняет, *почему* состояние изменилось. События хранятся в отдельном потоке (stream). Ключевое отличие от чистого Event Sourcing: состояние первично и является источником истины для запросов, а события — это журнал для аудита, анализа и возможной компенсации действий. Это снимает головную боль с запросами, так как не нужно постоянно реиграить события. Подходит для систем, где важна и актуальная картина, и понимание причин изменений.
**4. Использование CDC (Change Data Capture) инструментов.** Инструменты вроде Debezium, AWS DMS или логический декодинг в PostgreSQL позволяют «подписаться» на изменения в транзакционном журнале базы данных. Они в реальном времени захватывают изменения (insert, update, delete) и преобразуют их в события, которые можно отправлять в Kafka или другую шину. Фактически, вы получаете поток событий, не меняя архитектуру основного приложения, которое продолжает работать в привычном CRUD-стиле. Эти события затем можно использовать для построения денормализованных представлений (CQRS), уведомлений других систем или заполнения data lake. Это мощная альтернатива для интеграционных сценариев и аналитики.
**5. Документо-ориентированные БД с версионированием.** Некоторые NoSQL-базы, такие как MongoDB или Couchbase, позволяют легко хранить несколько версий документа. Вы можете сохранять новую копию документа при каждом изменении (полностью или дельту), связывая их по идентификатору и метке времени. Запрос актуальной версии остается быстрым, а при необходимости можно извлечь историю. Подход схож с State-Event, но реализованный на уровне возможностей хранилища. Хорошо подходит для моделей данных с низкой нормализацией.
Выбор альтернативы зависит от ключевого требования. Нужен юридический аудит? Смотрите в сторону Audit Trail или Temporal Tables. Нужно восстанавливать состояние на вчера? Temporal Tables или State-Event. Строите реактивную систему интеграций? Обратите внимание на CDC. Event Sourcing — это специализированный и мощный инструмент для сложных доменов с часто меняющимися бизнес-правилами, где сама последовательность событий является ключевой ценностью. Для многих других задач существуют более простые и pragматичные решения, внедрение которых не потребует переучивания всей команды и перепроектирования системы. Иногда лучшая архитектура — это та, которую ваша команда может эффективно поддерживать.
Event Sourcing — не панацея: 5 рабочих альтернатив для архитектуры данных, которые можно освоить за час
Обзор пяти практических альтернатив паттерну Event Sourcing для организации работы с данными: Audit Trail, Temporal Tables, State-Event, CDC и версионирование в документных БД. Описаны их преимущества, недостатки и идеальные сценарии использования.
130
4
Комментарии (11)