gpt4 book ai didi

CQRS(事件溯源): Projections with multiple aggregates

转载 作者:行者123 更新时间:2023-12-04 15:29:22 24 4
gpt4 key购买 nike

我有一个关于在 CQRS 架构上涉及多个聚合的投影的问题。

例如,假设我有两个聚合 WorkItemDeveloper并且以下事件按顺序发生(但不是立即发生)

  • WorkItemCreated (workItemId)
  • WorkItemTitleChanged (workItemId, title)
  • DeveloperCreated (developerId)
  • DeveloperNameChanged (developerId, name)
  • WorkItemAssigned (workitemId, DeveloperId)

  • 我希望创建一个作为开发人员工作项的“内部连接”的投影:
    | WorkItemId | DeveloperId | Title  | DeveloperName | ... |
    |------------|-------------|--------|---------------|-----|
    | 1 | 1 | FixBug | John Doe | ... |

    我进行预测的方式是渐进式的。这意味着我从数据库加载保存的投影并在剩余事件发生时应用它们。

    我的问题是,负责在投影表上创建一行的事件是 WorkItemAssigned .但是,该事件不携带以前事件所需的信息(工作项标题、开发者姓名等)。

    以便按时获得所需资料 WorkItemAssigned ,我必须从 eventstore 加载所有事件,将所有状态保存在内存中 WorkItemsDevelopers所以我在 WorkItemAssigned 之前就得到了所需的信息事件到来。

    当然,我可以预测 Workitem , 另一个为 Developer并查询它们以检索它们的最后状态。但看起来工作量很大,如果我要分别为每个聚合创建投影,我不妨创建一个数据库 View 来内部连接它们(实际上,这就是我正在做的。)

    我不是手工完成所有这些,我目前正在使用一个名为 EventFlow 的好框架,但这并没有指导我回答这个问题。

    这是一个关于 CQRS 基本原理的问题,我觉得我在这里遗漏了一些东西。

    最佳答案

    我不认为你缺少任何东西。在事件源系统中投影读取模型与从关系模型中查询相比存在一组不同的问题。问题不一定更容易或更难解决;他们只是 不同 .

    好消息是你有很多选择。事件溯源允许您以任何可以想象的方式投影数据,因此您可以决定最适合每个单独投影的解决方案。我猜“坏”消息(我认为这不是坏消息)是问题的解决方案每次都与关系系统不同,关系系统是使用 JOIN 构造查询。

    您已经确定了一些可能的解决方案:

  • 使用关系模型作为您的读取模型之一
  • 当某种类型的事件进来时,重新查询保存你需要的数据的流,并使用它们来按需投影

  • 您还可以简单地将一些数据保存在临时状态(在内存、文档数据库、文件系统等中),以便您在需要时查找数据并对其进行投影。因此,请保留更新的 WorkItems 和 Developers 列表,以便在 WorkItemAssigned 事件发生时可以读取和使用它们。

    我会说创建一个关系数据库作为临时或永久读取模型是解决问题的一种非常可行的方法,假设您不试图实现大规模的可扩展性。

    关于CQRS(事件溯源): Projections with multiple aggregates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53688339/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com