【问题标题】:Identity of Events occured by command命令发生的事件的标识
【发布时间】:2012-11-20 07:40:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: events command identity cqrs


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我同意 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 2021-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多