1

CQRS システムでコマンドが実行されたときに発生するイベントは、コマンドに関連付けることができるように、コマンドと同じ ID を持っていますか。

私は現在、CQRS システムに Saga を実装しています。私が理解している限りでは、Saga の概念は、特定のイベントを処理してコマンドを定義および実行し、Saga によって表されるプロセスを完了するというものです。

私の問題は、Saga が処理しているイベントが待機中のイベントであることをどのように認識するかということです。

CommandBus に渡されるコマンドの ID を Saga に保存して、同じ ID を持つイベントを待機する必要がありますか? コマンドの実行によって多くの異なるイベントが発生した場合、それらはすべて同じ ID を持っていますか?

4

2 に答える 2

1

I agree with eulerfx and would like to add a point:

If the Saga is releated to a specific Aggregate the Aggregate's Id would be sufficient.

Command: CreateCustomer { CustomerId = New Guid }
- Creates Customer Aggregate with CustomerId
- Emits Event CustomerCreated { CustomerId = Customer.CustomerId }

Command: BlackListCustomer { CustomerId = Customer.CustomerId }
- Blacklists Customer
- Emits Event CustomerBlacklisted { CustomerId = Customer.CustomerId }

Saga: CustomerLifecycle
- Listens to Event CustomerCreated
- Stores created customer's CustomerId
- Listens to Event BlacklistCustomer and only acts if CustomerIds match
于 2012-11-21T09:42:20.880 に答える
1

サガの場合、メッセージを構成するいくつかの相関キーが必要です。これは、OrderId などの自然なビジネス ドメイン キーである場合があります。それ以外の場合は、Guid などのグローバルに一意のキーがより適切です。このキーは、サガによって実装された単一のタスクに関連するメッセージを関連付けます。

あなたの場合、この相関 ID は、サガを開始するコマンドの ID のようです。

CommandBus に渡されるコマンドの ID を Saga に保存して、同じ ID を持つイベントを待機する必要がありますか?

はい。この ID が一意であり、サガが実装するタスクを完全に識別できると断言できる場合、これはサガの相関 ID である必要があります。

コマンドの実行によって多くの異なるイベントが発生した場合、それらはすべて同じ ID を持っていますか?

それらはすべて相関 ID を共有していますが、それをイベントの ID とは考えていません。イベントには独自の ID がありますが、サガが機能するには相関 ID が必要です。

于 2012-11-21T01:11:42.520 に答える