私があまりはっきりしていないのは、イベントストア自体から集計を再水和する理由です。
「イベント」は記録の本だからです。
「読み取り」データベースへの変更の投影が非常に簡単な場合、スキーマがドメインモデルと完全に一致する「書き込み」データベースへの変更を常に投影しないのはなぜですか。これは、事実上スナップショットデータベースになります。
はい; 毎回その状態をゼロから再生成するのではなく、キャッシュされた集約状態のコピーを使用することがパフォーマンスの最適化に役立つ場合があります。覚えておいてください:パフォーマンスの最適化の最初のルールは「しない」です。ソリューションはさらに複雑になりますが、ビジネスの動機付けが得られるまで、それを避けることをお勧めします。
この場合、イベントストアは、スキーマの変更の結果として「書き込み」データベースを再構築するときにのみ役立ちますか?それとも、もっと大きなものが欠けていますか?
もっと大きなものが足りない。
最初のポイントは、イベントソースソリューションを検討している場合、何が起こったかの履歴を保存する価値があると期待するためです。つまり、非破壊的な変更を行いたいということです。
そのため、イベントストアに書き込みを行うのはこのためです。
特に、これはすべての変更をイベントストアに書き込む必要があることを意味します。
競合するライターは、互いの編集を認識していない場合、互いの書き込みを破壊したり、意図しない状態にシステムを駆動したりする可能性があります。したがって、一貫性が必要な場合の通常のアプローチは、ジャーナル内の特定の位置(HTTP APIの条件付きPUTに類似)に書き込みをアドレス指定することです。失敗した書き込みは、ジャーナルに対する現在の理解が同期していないこと、および回復する必要があることをライターに伝えます。
既知の良好な位置に戻ってから、追加のイベントを再生することは、そのポイントが一般的な回復戦略であるためです。既知の適切な位置は、ローカルキャッシュにあるもののコピー、またはスナップショットストア内の表現です。
幸福なパスでは、集計のスナップショットをメモリに保存できます。利用可能なローカルコピーがない場合にのみ外部ストアに連絡する必要があります。
さらに、記録帳にアクセスできる場合は、完全に追いつく必要はありません。
そのため、通常のアプローチ(スナップショットリポジトリを使用する場合)は、非同期に維持することです。そうすることで、回復する必要がある場合、集約の履歴全体をリロードしてリプレイすることなく回復できます。
有効期間が有効な細粒度の集計では、通常、スナップショットキャッシュの維持コストを上回るメリットを得るのに十分なイベントが収集されないため、この複雑さが重要ではない場合が多くあります。
しかし、それが問題に対して適切なツールである場合、古いモデルの集計を書き込みモデルにロードし、それを追加のイベントで更新することは、完全に合理的なことです。