【问题标题】:can an entity within an aggregate move to another aggregate (same type) in Axon聚合中的实体可以移动到 Axon 中的另一个聚合(相同类型)吗
【发布时间】:2019-11-20 14:28:51
【问题描述】:

假设我们有一个聚合类 A 和实体类 B 和实体类 C,使用事件溯源和 AggregateMember 与 ForwardMatchingInstances。

创建了 2 个聚合 A,ID 为 aId1 和 aId2。

我们发送一个命令,将 B 类的新实体添加到 aId1,id 为 bId1

我们发送一个命令,将 B 类的新实体添加到 aId1,id 为 bId2


现在出于某种原因,我们希望将其中一个实体移动到另一个聚合中,因为业务逻辑具有 B 类型实体的特定逻辑(对于 C 也是如此)。


轴突可以支持吗? -> 我们可以在不改变 bId1 的情况下将实体 bId1 移动到聚合 aId2(保持相同的 id,只是移动聚合)。

为此,我会使用 saga 来确保:

  • 首先检查 bId1 是否可以移动到 aId2,会发出一个事件(如 ReservedXXXEvent)
  • Saga 向 aId1 发送命令以从 aId1 中删除 bId1,aId1 发出事件
  • Saga 等待事件然后向 aId2 发送命令以添加 bId1,aId2 发出事件然后 saga 结束

本应转到 aId1 并对 bId1 执行操作的待处理命令会发生什么情况? (不再存在例外?)

在进行更改后,是否将 bId1 的新命令发送到聚合 aId2(bId1 现在在聚合 aId2 中,具有相同的实体 ID)?

【问题讨论】:

    标签: java events cqrs axon


    【解决方案1】:

    我认为回答这个问题的唯一方法:

    轴突可以支持吗? -> 我们可以在不改变 bId1 的情况下将实体 bId1 移动到聚合 aId2(保持相同的 id,只是移动聚合)。

    有一个NO。这不是因为 Axon,而是因为 CQRS 和 Event Sourcing。您不想在其中发出包含实体状态的事件。 您唯一拥有的就是汇总到“发生了什么”的踪迹。您需要做的是,从商业角度找出“移动”的真正含义。

    在实现方面,您通常会将其视为添加和删除(以任何顺序)。如果操作失败(可能 add 无效),您将需要能够弥补失败。如果经常预料到失败,那么是的,“保留并确认”的方法会比“尝试和补偿”的方法更好。

    在 Axon 中,您可以使用 Saga 或仅使用控制器。在后一种情况下,您只需发送一个命令,然后根据结果发送第二个命令。当第二个命令返回失败时,您可以补偿第一个。

    请注意,命令永远不会“发送给实体”。它们被发送到聚合,基于 @TargetAggregateIdentifier 注释字段(或您配置的 CommandTargetResolver 可能使用的任何方法)。该字段定义加载哪个聚合实例。然后,一旦加载了聚合,Axon 将定义聚合中的哪个实体定义处理程序以实际处理命令。

    最后的评论:很多时候,这些情况取决于很多特定领域的细节。如果没有任何有关您为其构建的领域或案例的信息,很难明智地回答这样一个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多