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