1

当命令在 CQRS 系统中执行时发生的事件是否与命令具有相同的 id,以便它们可以与命令相关联。

我目前正在我的 CQRS 系统中实现 Saga,据我所知,saga 的概念是它们处理特定事件,然后定义和执行命令以完成由 Saga 表示的过程。

我现在的问题是 Saga 如何知道它正在处理的事件是它正在等待的事件。

我是否应该存储传递给 Saga 中 CommandBus 的命令的 ID 以等待具有相同 ID 的事件?如果命令的执行导致许多不同的事件,它们都具有相同的 Id 怎么办?

4

2 回答 2

1

对于 sagas,必须有一些关于组成消息的相关键。有时这可能是一个自然的业务域键,例如 OrderId。其他时候,全局唯一键更合适,例如 Guid。此键关联与 saga 实现的单个任务相关的消息。

在您的情况下,这个相关 ID 似乎是启动传奇的命令的 ID。

我是否应该存储传递给 Saga 中 CommandBus 的命令的 ID 以等待具有相同 ID 的事件?

是的。如果您可以断言此 ID 是唯一的并且完全标识了 saga 实现的任务,那么这应该是 saga 的相关 ID。

如果命令的执行导致许多不同的事件,它们都具有相同的 Id 怎么办?

它们都共享一个相关 ID,但我不认为它是事件的 ID。事件本身可能有一个单独的 ID,但要让 saga 发挥作用,它必须有一个相关 ID。

于 2012-11-21T01:11:42.520 回答
1

我同意 eulerfx 并想补充一点:

如果 Saga 与特定的聚合相关,聚合的 ID 就足够了。

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 回答