Axon重新创建聚合状态不明确

时间:2019-10-23 10:33:57

标签: java events aggregate axon

我正在第一个Axon应用程序上工作,我无法弄清楚聚合的使用。我了解每次调用命令处理程序时,所有事件都会重新创建聚合,但是我不知道重新创建聚合还有什么其他用途。

  • 就像我何时应该手动重新创建聚合?
  • 每次调用命令重新创建聚合的好处是什么?

设置应用程序的方式是,使用aggregateview将所需的数据持久保存到数据库中。因此,现在我觉得事件只是存储在事件存储中,并且仅在调用命令后才用于重新创建聚合。对于存储的事件和聚合的汇总,我别无其他事情吗?例如,我不应该重新创建整个聚合,而不是通过ID从数据库中获取聚合视图以进行更新。

1 个答案:

答案 0 :(得分:1)

事件为您的聚合提供源的想法是,这些事件是系统中 any 模型的来源。

因此,如果您创建一个专用的命令模型来处理您描述的命令,则此模型(在Axon看来是@Aggregate(Root)批注类)将从其发布的事件中获取。

此外,您可以引入所需的任何类型的查询模型;您可以将其命名为RDBMS视图,基于文本的搜索解决方案(例如Elastic),时间序列数据库。但是,这些查询模型中的任何一个都仍然是您的Aggregate所在的同一根应用程序的一部分。由于您具有将事件作为向他人通知正在做出的决策的方式,因此很自然地(重用)那些更新您的所有查询模型也是

现在,您完全不愿意为Axon中的聚合使用事件源,从它的角度来看,这被称为State-Stored Aggregate。但是,如果这样做,您将回到在不同的存储机制中拥有不同的模型,而没有单一事实来源

因此,为了利用这些新增的知识回到您的问题,我将陈述以下内容:

  

比如我应该何时手动重新创建聚合?

您永远不会将聚合重新创建为命令模型,因为框架会为您执行此操作。如果您具有镜像的查询模型聚合,那么只要在模型中添加/删除/更改了字段,就可以重新创建该模型。或者,如果您引入了全新的模型。

  

每次调用命令时重新创建聚合有什么好处?

每次都重新创建它的好处是可以确保始终使用最新状态。即使在发布应用程序之间,您也已添加/更改/删除了新字段。 @EventSourcingHandler带注释的方法将简单地填充它们,而无需您例如编写数据库脚本来直接在数据库级别进行调整。


最后,采用这种方法的原因完全在于Axon支持的架构概念。您可以根据需要在AxonIQ的Architectural Concepts页上阅读它们;我相信它将进一步澄清问题。

希望这可以帮助您@ Gisrou8!如果没有,请再提出更多问题,我很乐意进一步解释。


更新:进一步的命令模型说明

在Gisrou8在我的回应下发表的评论中,很明显,这种方法的“不安”主要存在于汇总状态。

正如我在先前的答复中所分享的那样,可以将Axon Framework建模的聚合在事件源设置中视为CQRS系统中的命令模型。

命令模型的主要支柱之一是,它包含的 only 状态是决策逻辑所需的状态。更具体地说,后者存储在Aggregate中的唯一状态是用于确定命令处理程序是否应接受传入命令并作为结果发布事件的状态。

因此,您将在“聚合标识符”旁边引入“聚合”的唯一字段是您做出这些决定所需的字段。 这就是命令模型的目的,因此不必担心这一点。

要回答应用程序中的任何查询,您将引入专用的查询模型,该模型将根据聚合中命令处理程序发布的事件进行更新。正是这种精确的隔离才是该模型的强项,因为它可以更好地扩展规模,改进性能或需要团队分离,以及其他非功能性需求。