java - 轴突重建聚合状态不清楚
问题描述
我正在开发我的第一个 Axon 应用程序,但我无法弄清楚聚合的使用。我知道每次调用命令处理程序时,所有事件都会重新创建聚合,但我不明白重新创建聚合可能有什么其他用途。
- 比如我什么时候应该手动重新创建一个聚合?
- 每次调用命令时重新创建聚合有什么好处?
我设置应用程序的方式是使用聚合视图将需要的数据保存到数据库中。所以现在我觉得事件只是存储在事件存储中,并且仅在我调用命令后用于重新创建聚合。对于存储的事件和聚合的重新创建,我是否还有其他事情要做?例如,我不应该重新创建整个聚合,而不是通过 ID 从我的数据库中获取聚合视图来更新它。
解决方案
Event Sourcing your Aggregate 背后的想法是,这些事件是系统内任何模型的来源。
因此,如果您创建一个专用的命令模型来处理您描述的命令,那么这个模型(从 Axon 的角度来看是@Aggregate(Root)
注释类)将来自它已发布的事件。
此外,您可以引入任何类型的查询模型;一个 RDBMS 视图、一个基于文本的搜索解决方案(例如 Elastic)、一个时间序列数据库,应有尽有。然而,这些查询模型中的任何一个仍然是您的聚合所在的同一根应用程序的一部分。由于您将事件作为通知其他人正在做出的决定的手段,因此很自然地(重新)使用这些事件来更新您的所有查询模型以及。
现在,您完全不倾向于在 Axon 中为您的聚合使用事件溯源,这是完全正确的,从它的角度来看,它被称为State-Stored Aggregate。但是,如果您这样做,您将回到在不同的存储机制中拥有不同的模型,而没有单一的事实来源。
因此,为了使用这些附加知识回到您的问题,我将说明以下内容:
比如我什么时候应该手动重新创建一个聚合?
您永远不会倾向于将聚合重新创建为命令模型,因为框架会为您执行此操作。如果您有一个镜像查询模型聚合,那么只要您在模型中添加/删除/更改了字段,您就会重新创建它。或者,如果您引入了全新的模型。
每次调用命令时重新创建聚合有什么好处?
每次重新创建它的好处是保证您将始终使用最新状态。即使在您的应用程序发布之间您已经添加/更改/删除了新字段。带注释的@EventSourcingHandler
方法将简单地填充它们,而无需您例如编写数据库脚本来直接在数据库级别对其进行调整。
最后,这种方法的原因完全在于 Axon 支持的架构概念。如果需要,您可以在 AxonIQ 的架构概念页面上阅读它们;我相信它会进一步澄清事情。
希望这可以帮助您@Gisrou8!如果没有,请回来提出更多问题,我很乐意进一步解释。
更新:进一步的命令模型解释
在 Gisrou8 在我的回复下发表的评论中,很明显这种方法的“不安”主要存在于聚合的状态。
正如我在之前的回复中所分享的,可以使用 Axon 框架建模的聚合应该在事件源设置中被视为 CQRS 系统中的命令模型。
命令模型的主要支柱之一是它包含的唯一状态是决策逻辑所需的状态。更具体地说,存储在聚合中的唯一状态是用于决定命令处理程序是否应该接受传入命令并作为结果发布事件的状态。
因此,您将在聚合标识符旁边引入的唯一字段是驱动这些决策所需的字段。这就是命令模型的目的,所以不要担心这一点。
要回答应用程序中的任何查询,您需要引入一个专用的查询模型,该模型会根据聚合中的命令处理程序发布的事件进行更新。正是这种精确的隔离是该模型的强项,因为它允许更好的扩展、性能改进或所需的团队分离,以及其他非功能性需求。
推荐阅读
- excel - 从单元格中检测日期值
- amazon-web-services - AWS Dynamo Db on Services 的连接池
- php - Laravel Dingo 从多个表中获取数据
- javascript - 如何使用 Tampermonkey 重新加载另一个标签?
- html - 图标栏汉堡不工作,只显示一条水平线
- java - 如何使用像 Jayway JsonPath 这样的 java 库添加新的 json 节点
- gem5 - 如何在 gem5 中仅转储单个或某些选定的统计信息?
- mysql - 如何为此场景编写 SQL 查询?
- docker - Docker 基础知识,如何保存已安装的包和编辑的文件?
- javascript - 如何避免 reactjs 索引中的复杂层次结构