CQRS(イベントソース)では、イベントストアにグローバルシーケンスカウンターが必要ですか?
-
05-10-2019 - |
質問
CQR(および一般的にDDD)の周りに頭を導こうとすると、2つのイベントが異なる集合体で発生するが、それらの順序にドメインの意味がある状況に遭遇しました。もしそうなら、それらは非常に近くで起こる可能性があるため、タイムスタンプは(私が見たサンプルの実装で使用されているように)それらを区別できません。つまり、イベントストアには順序に曖昧さがあるため、ドメインの「完全な」表現が含まれていません。イベントが発生しました。
例として、ドメインはaを発射できます CustomerCreatedEvent
に適用されます Customer
集計、そしてa CustomerAssignedToAgent
のイベント Agent
集計。 CustomerAssignedToAgent
イベントが前に発生しても意味がありません CustomerCreatedEvent
, 、しかし、通常、これらは両方とも1つの操作の結果として発射される可能性があり、タイムスタンプが事実上同じになる可能性があります。
それで、私は物事をひどくモデル化しているだけですか?異なる集合体にわたる一連のイベントが重要な状況があるべきですか?または、イベントストアにグローバルシーケンス番号を保持して、イベントが発生した正確なシーケンスを識別できるようにする必要がありますか?
解決
一般に、グローバルな秩序を実施することは悪い考えです。集合体は、酸性学の境界を形成することを目的としています。
これは、2つの集計を1つのトランザクションで更新しないでください。グローバル順序を実施する他の手段はありません。
あなたの場合、CustomerCreatedEventの顧客を作成することとともに、Agent Aggregateにそれ自体を割り当てるように伝えるメッセージを送信することが理にかなっています。通常、凝集した通信はメッセージングを介して行う必要があります。
他のヒント
私も見つけました グレッグ・ヤングによるこの投稿 domaindrivendesign yahooリスト:
注文は、集計ルート境界内のハンドラーごとにのみ保証されます。
ハンドラー間または集合体間で秩序の保証はありません。
これらのことを提供しようとすると、暗い側につながります。