Отже, чого я пропускаю?
Здогадуючись.
Перше, що вам може бути відсутнім, це те, що вам потрібно лише перезавантажити події для стану, який ви відбудовуєте. Якщо ви можете чітко моделювати межі транзакцій, кожен об’єкт може виписати події, позначені власним ідентифікатором, а потім прочитати лише ті події. Використовуючи реляційну базу даних для зберігання подій, буде індексований стовпчик ідентифікатора для прискорення запиту. Використовуючи EventStore, кожен об'єкт мав би свій потік.
У вашій моделі потрібно зробити певну обережність, щоб зробити це чисто, оскільки ви хочете бути впевненими, що ви змінюєте лише один об'єкт у кожній транзакції, і тому вам потрібно подбати про те, щоб ви правильно ізолювали кожен інваріант, який ви намагаєтеся примушувати
У тих випадках, коли це не досить швидко, ви все ще маєте можливість створювати знімки свого стану (запам'ятовування) та зберігати це в "традиційному сховищі". Кожен знімок позначається порядковим номером останньої події, яка використовується для створення знімка; під час перезавантаження сховище схоплює цей знімок спочатку, а потім застосовує до нього новіші події. (Це передбачає певний розумний спосіб захоплення останніх знімків - або події також позначаються порядковим номером, або у вас є якийсь ефективний спосіб прочитати потік подій назад, поки ви не дістанетесь до початкової точки.)
Тут все ще є перевага перед звичайним підходом, оскільки ваші знімки можна будувати паралельно вашим записам, а не об'єднувати їх: ви просто помістите слухача подій у якийсь інший потік / процес і дозвольте йому весело разом виписувати до магазину знімків за будь-якого розкладу здається розумним. Зрештою, знімок не повинен бути особливо своєчасним - достатньо часто, щоб робота з повторного застосування нових подій не підірвала ваш угод.
(Знімок робить складну міграцію; будь-які зміни в серіалізації моделі призведе до недійсності кешу знімків. Звичайно, ви можете відновити знімки, використовуючи нову серіалізацію як частину міграції, а потім "наздогнати", коли зміни почнуть діяти.)
Чи відновлення стану з потоку подій навіть зазвичай робиться?
Так. Що, як правило, показано на прикладах CQRS, це те, що рівень додатків, після того, як представлена команда буде добре сформована, прикладний рівень завантажить доменний об'єкт із сховища, де навантаження є конструктором за замовчуванням з подальшим повтором потоку подій (або рівнозначно, дзвінок на завод із переліком подій).
Дві інші, суперечливі думки.
- За інтерфейсом сховища може бути кеш
- Інвалідація кешу - одна з двох важких проблем.