7

CQRS(および一般的にはDDD)に頭を悩ませようとすると、2つのイベントが異なるアグリゲートで発生する状況に遭遇しましたが、それらの順序にはドメインの意味があります。もしそうなら、それらは非常に接近して発生する可能性があるため、タイムスタンプ(私が見たサンプル実装で使用されている)はそれらを区別できません。つまり、順序にあいまいさがあるため、イベントストアにはドメインの「完全な」表現が含まれていません。イベントが発生した場所。

例として、ドメインはアグリゲートにCustomerCreatedEvent適用されるを起動し、Customer次にアグリゲートでCustomerAssignedToAgentイベントを発生させることができAgentます。CustomerAssignedToAgentイベントがの前に発生した場合は意味がありませんCustomerCreatedEventが、通常、これらの両方が1つの操作の結果として発生する可能性があり、タイムスタンプが実質的に同じになる可能性があります。

だから私は物事をひどくモデリングしているだけですか?さまざまな集合体にまたがる一連のイベントが重要になる状況が発生する可能性はありますか?または、イベントが発生した正確なシーケンスを識別できるように、イベントストアにグローバルシーケンス番号を保持する必要がありますか?

4

2 に答える 2

10

また、domaindrivendesignyahooリストでGregYoungによるこの投稿を見つけました。

順序は、集約ルート境界内のハンドラーごとにのみ保証されます。

ハンドラー間またはアグリゲート間の順序は保証されません。

それらを提供しようとすると、ダークサイドにつながります。

于 2010-06-03T08:57:52.633 に答える
8

一般に、グローバルな秩序を強制することは悪い考えです。骨材は、ACID-セマンティクスの境界を形成することを目的としています。

これは、1つのトランザクションで2つの集計を更新してはならず、グローバルな順序を適用する他の手段がないことを意味します。

あなたの場合、CustomerCreatedEventを作成するとともに、Customerは自分自身を割り当てるように指示するメッセージをAgentaggregateに送信する必要があることは理にかなっています。一般に、骨材間の通信はメッセージングを介して行う必要があります。

于 2010-06-02T11:29:56.930 に答える