То, что я не очень ясно, это то, почему вы когда-либо регидратировать свои агрегаты из самого магазина событий.
Потому что «события» - это книга рекордов.
Если проецировать изменения в «читаемые» базы данных так просто, почему бы не всегда проектировать изменения в «записывающей» базе данных, схема которой идеально соответствует вашей доменной модели? Это будет эффективно база данных снимков.
Да; Иногда полезно оптимизировать производительность, чтобы использовать кэшированную копию агрегатного состояния вместо того, чтобы каждый раз восстанавливать это состояние с нуля. Помните: первое правило оптимизации производительности - «Не надо». Это добавляет дополнительную сложность к решению, и вы бы предпочли избегать этого, пока у вас не будет убедительной мотивации бизнеса.
Если это так, является ли хранилище событий полезным только при перестройке вашей базы данных «записи» в результате изменений схемы? Или я что-то упустил?
Вам не хватает чего-то большего.
Во-первых, если вы рассматриваете решение, основанное на событиях, то это потому, что вы ожидаете, что будет полезно сохранить историю того, что произошло, то есть вы хотите внести неразрушающие изменения .
Вот почему мы вообще пишем в магазин событий.
В частности, это означает, что каждое изменение должно быть записано в хранилище событий.
Конкурирующие авторы могут потенциально либо уничтожать записи друг друга, либо приводить систему в непреднамеренное состояние, если они не знают о правках друг друга. Поэтому обычный подход, когда вам нужна согласованность, состоит в том, чтобы адресовать ваши записи в определенную позицию в журнале (аналог условного PUT в HTTP API). Неудачная запись говорит автору, что его текущее понимание журнала не синхронизировано, и что они должны восстановиться.
Возврат к известной хорошей позиции с последующим воспроизведением любых дополнительных событий, поскольку эта точка является обычной стратегией восстановления. Эта известная хорошая позиция может быть копией того, что находится в локальном кэше, или представлением в вашем хранилище снимков.
На счастливом пути вы можете сохранить снимок агрегата в памяти; вам нужно обратиться к внешнему хранилищу только тогда, когда нет локальной копии.
Кроме того, вам не нужно быть полностью захваченным, если у вас есть доступ к книге рекордов.
Поэтому обычный подход ( при использовании репозитория моментальных снимков) - поддерживать его асинхронно . Таким образом, если вам нужно восстановить, вы можете сделать это без перезагрузки и повторного воспроизведения всей истории агрегата.
Во многих случаях эта сложность не представляет интереса, потому что мелкозернистые агрегаты с ограниченным временем жизни обычно не собирают достаточно событий, чтобы выгоды превышали затраты на поддержание кэша моментальных снимков.
Но когда это подходящий инструмент для решения проблемы, загрузка устаревшего представления агрегата в модель записи с последующим обновлением его дополнительными событиями является вполне разумной вещью.