事件的身份由命令发生

时间:2012-11-20 07:40:36

标签: events command identity cqrs

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

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

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

我应该将传递给Saga中CommandBus的命令的Id存储到等待具有相同Id的事件吗?如果执行命令导致许多不同的事件,它们都具有相同的Id吗?

2 个答案:

答案 0 :(得分:1)

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

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

  

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

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

  

如果执行命令会导致许多不同的事件,   他们都有相同的身份证吗?

它们都共享一个相关ID,但我不认为它是该事件的ID。该事件可能有自己的个人ID,但是为了使saga起作用,它必须具有相关ID。

答案 1 :(得分:1)

我同意eulerfx并想补充一点:

如果Saga被归为特定的Aggregate,那么Aggregate的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