在CQRS系统中执行命令时发生的事件与Command具有相同的ID,以便它们可以与命令关联。
我目前正在我的CQRS系统中实现Saga,据我所知,sagas的概念是它们处理特定事件然后定义和执行命令以完成Saga所代表的过程。
我现在的问题是,Saga如何知道它正在处理的事件是它正在等待的事件。
我应该将传递给Saga中CommandBus的命令的Id存储到等待具有相同Id的事件吗?如果执行命令导致许多不同的事件,它们都具有相同的Id吗?
答案 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