在CQRS/Eventsourcing中,哪种方法是家长修改所有it状态的最佳方法';s儿童??

在CQRS/Eventsourcing中,哪种方法是家长修改所有it状态的最佳方法';s儿童??,cqrs,event-sourcing,Cqrs,Event Sourcing,用例:假设我有以下聚合 根聚合-CustomerRotategrate(管理每个CustomerAggregate) 根聚合的子聚合-CustomerAggregate(共有10个客户) 问题:如何向所有10个CustomerAggregate发送DisableCustomer命令以更新其禁用状态 customerState.enabled = false 解决方案:由于CQRS不允许写端查询读端以获取CustomerAggregate ID列表,因此我想到了以下几点: customerr

用例:假设我有以下聚合

  • 根聚合-CustomerRotategrate(管理每个CustomerAggregate)
  • 根聚合的子聚合-CustomerAggregate(共有10个客户)
问题:如何向所有10个CustomerAggregate发送
DisableCustomer
命令以更新其禁用状态

customerState.enabled = false
解决方案:由于CQRS不允许写端查询读端以获取CustomerAggregate ID列表,因此我想到了以下几点:

  • customerrotateggregate
    始终将其所有
    CustomerAggregate
    的ID作为json存储在数据库中。当
    customerrotaggregate
    收到
    disablecustomers
    的命令时,它将获取customerID json并将
    DisableCustomer
    命令发送给所有子级,每个子级将在应用
    DisableCustomer
    命令之前恢复其状态。但这意味着我必须保持customeridsjson记录的一致性
  • 客户端(浏览器-用户界面)应始终发送要应用
    禁用客户的客户ID列表。但对于拥有数千名客户的数据库来说,这将是一个问题
  • 在RESTAPI层中,检查命令
    DisableAllCustomers
    ,从读取端获取所有ID,并发送DisableAllCustomers(ID),其中ID填充到写入端
  • 哪种方法是推荐的方法,还是更好的方法

    • 根聚合-CustomerRotategrate(管理每个CustomerAggregate)
    • 根聚合的子聚合-CustomerAggregate(共有10个客户)
    首先,语言“子集合”有点混乱。您的模型包含一个直接引用“子”实体的“父”实体,那么这两个实体必须是同一聚合的一部分

    但是,您可能有一个针对每个客户的客户聚合,以及一个管理Id集合的CustomerSet聚合

    如何向所有10个CustomerAggregate发送DisableCustomer命令以更新其禁用状态

    customerState.enabled = false
    
    通常的答案是,运行查询以获取要禁用的客户集,然后向每个客户发送disableCustomer命令

    因此,3和2都是合理的答案,需要注意的是,如果一些不合格的命令失败,你需要考虑你的要求是什么。 2特别具有诱惑力,因为它清楚地说明了客户机(人工操作员)正在描述一项任务,然后应用程序将其转换为由域模型运行的命令

    试图将“数千”个客户ID打包到消息中可能是一个问题,但是对于一些用例,您可以找到一种方法来缩小这个范围。例如,如果任务是“全部禁用”,则客户端可以向应用程序发送有关如何重新创建“全部”集合的说明——即:“针对集合的此特定版本运行此查询”明确描述要禁用的客户列表

    当CustomerRotategrate收到DisableAllCustomers命令时,它将获取CustomerID json并将DisableCustomer命令发送给所有子级,其中每个子级将在应用DisableCustomer命令之前恢复其状态。但这意味着我必须保持customeridsjson记录的一致性

    这接近于一个正确的想法,但并不完全正确。将命令分派到集合聚合。如果接受该命令,它将生成一个描述要禁用的客户ID的事件。此域事件作为集合聚合的事件流的一部分被持久化

    使用负责创建流程管理器的事件处理程序订阅这些事件。此流程管理器是另一个事件源状态机。它看起来有点像一个聚合,但它对事件做出响应。将事件传递给它时,它会更新自己的状态,在当前事务中保存这些事件,然后将命令调度到每个客户聚合

    但是这样做需要做很多额外的工作。传统智慧建议,您通常应该首先假设流程管理器方法不是必需的,并且只有在业务需要时才引入它。“过早的自动化是万恶之源”之类的话