我正在开发我的第一个 Axon 应用程序,但我无法弄清楚聚合的用途。我了解每次调用命令处理程序时,所有事件都会重新创建聚合,但我不明白重新创建聚合可能还有什么其他用途。
- 比如我什么时候应该手动重新创建聚合?
- 每次调用命令时重新创建聚合有什么好处?
我设置应用程序的方式是使用聚合 View 将所需的数据保存到数据库中。所以现在我觉得事件只是存储在事件存储中,并且仅用于在调用命令后重新创建聚合。对于存储的事件和聚合的重新创建,我不需要做任何其他事情吗?例如,我是否应该重新创建整个聚合,而不是通过 ID 从数据库中获取聚合 View 来更新它。
最佳答案
事件溯源聚合背后的想法是,这些事件是系统内任何模型的来源。
因此,如果您创建一个专用命令模型来处理您所描述的命令,那么该模型(从 Axon 的角度来看是 @Aggregate(Root)
注释类)将源自事件已发布。
此外,您可以引入您想要的任何类型的查询模型; RDBMS View 、基于文本的搜索解决方案(例如 Elastic)、时间序列数据库等等。然而,这些查询模型中的任何一个仍然是您的聚合所在的同一根应用程序的一部分。由于您有事件作为通知其他人正在做出的决策的手段,因此很自然地(重新)使用这些事件来更新您的所有查询模型也是如此。
现在,您确实不倾向于对 Axon 中的聚合使用事件溯源,从它的角度来看,这称为 State-Stored Aggregate 。但是,如果您这样做,您将回到在不同的存储机制中拥有不同的模型,而没有单一事实来源。
因此,为了利用这些补充知识回到您的问题,我要声明以下内容:
Like when should I manually recreate an aggregate?
您永远不会倾向于将聚合重新创建为命令模型,因为框架会为您完成此操作。如果您有镜像查询模型聚合,那么每当您在模型中添加/删除/更改字段时,您都需要重新创建它。或者,如果您推出了全新的模型。
What is the benefit of the aggregate being recreated every time I call an command?
每次重新创建它的好处是保证您始终使用最新状态。即使在应用程序发布之间您添加/更改/删除了新字段。 @EventSourcingHandler
注解的方法只需填写它们,而不需要您编写数据库脚本来直接在数据库级别进行调整。
总而言之,采用这种方法的原因完全在于 Axon 支持的架构概念内。您可以在 AxonIQ 的 Architectural Concepts 上阅读它们。如果需要的话,请访问该页面;我相信它会进一步澄清事情。
希望这可以帮助你@Gisrou8!如果没有,请带着更多问题回来,我很乐意进一步解释。
更新:进一步的命令模型解释
在 Gisrou8 在我的回复下发表的评论中,很明显这种方法的“不安”主要在于聚合的状态。
正如我之前的回复中所分享的,在事件源设置中,可以使用 Axon 框架建模的聚合应该被视为 CQRS 系统中的命令模型。
命令模型的主要支柱之一是它包含的唯一状态是决策逻辑所需的状态。更具体地说,存储在聚合中的唯一状态是用于决定命令处理程序是否应该接受传入命令并作为结果发布事件的状态。
因此,您在聚合中与聚合标识符一起引入的唯一字段是驱动这些决策所需的字段。 这就是命令模型的目的,所以不必担心这一点。
为了回答应用程序中的任何查询,您需要引入一个专用的查询模型,该模型会根据聚合中的命令处理程序发布的事件进行更新。正是这种精确的隔离是该模型的强项,因为它可以实现更好的扩展、性能改进或所需的团队分离以及其他非功能性需求。
关于java - 轴突重建聚合状态尚不清楚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58520890/