Vaughn Vernonからの引用:
2つ以上のアグリゲートが少なくとも更新に依存している場合は、結果整合性を使用します。
彼はさらに、Domain Eventsを使用して、更新が必要な他のAggregate Rootにアクションを公開できることを示唆しています。
彼はさらに最終的な一貫性が必要な悪かもしれないことを説明します。
1つのリクエスト/トランザクションで複数の集合ルートを更新することが悪い習慣になるのはなぜですか?
私がこれまでに読んだすべてのことから、理由は、1つのトランザクションで複数の集計を変更すると、それらが同じデータベースHostに格納されるという要件が作成されるためと思われます。 (2フェーズコミットについても考慮しません。)
これはトレードオフを導入し、これを経験則ではなく考察にします。
問題の境界コンテキストが複数のデータベースホストに分割されることはありますか?複数ではないデータベース-問題ありません。データベースhosts。
信じられないほどのボリュームを処理する場合、またはテーブルインデックスの選択が得意でない場合を除き、ほとんどのコンテキストは、単一のデータベースホストのみを使用します。これにより、複数の集約変更(1つの境界コンテキスト内)に関連するデータベーストランザクションを使用できます。これにより、一貫性の保証が非常に簡単になります。
すべてを考慮して、私はこのような意思決定プロセスを好む:
#3の例を示すには:
この例では、すべてのイベントが処理されるという保証が必要であることに注意してくださいexactly once。特に、イベントをスキップしてはいけません。それは実行可能ですが、正しくすることは困難です。ほとんどのツールはこの点で気密ではありません。最も簡単に特定できる障害点は、データベースを更新した後、イベントを発行する前にアプリケーションサーバーがクラッシュした場合です。正確に1回のイベントの配信を保証すること自体は、価値のある議論です。
1つのリクエスト/トランザクションで複数の集約ルートを更新することが、このような悪い習慣になるのはなぜですか?
問題はその逆です。単一のトランザクションで複数の集計を変更しようとすることは、集計の境界を正しくモデル化していないことを示しています。
別の言い方をすると、同じトランザクションで2つの異なる集計を変更すると、それらのストレージに制約が導入され(集計は同じデータベースに格納される必要があります)、その制約はmodelには反映されません。それは事実上暗黙的です。