Axon, 基于CQRS模式的分布式事务解决方案框架神器
Axon框架背景
一个简短的历史
随着时间的推移,对软件项目的需求迅速增加。公司希望他们的(网络)应用程序与他们的业务一起发展。这意味着不仅项目和代码库变得更加复杂,而且还意味着功能不断被添加,更改并且(遗憾的是不够)被删除。如果发现看似易于实现的功能可能需要开发团队拆分整个应用程序,那将是令人沮丧的。此外,今天的网络应用程序面向潜在数十亿人的受众,使可扩展性成为无可争辩的要求。
虽然有许多应用程序和框架可以解决可扩展性问题,例如GigaSpaces和Terracotta,但它们存在一个基本缺陷。这些框架试图解决可伸缩性问题,同时让开发人员使用他们习惯的分层架构开发应用程序。在某些情况下,它们甚至会阻止或严格限制真实领域模型的使用,从而迫使所有领域逻辑写入服务。虽然开始构建应用程序的速度更快,但最终这种方法会导致复杂性增加和开发速度变慢。
命令查询责任隔离(CQRS)模式通过彻底改变应用程序的架构方式来解决这些问题。逻辑不是将逻辑分离成单独的层,而是根据它是在改变应用程序的状态还是查询它来分离。这意味着执行命令(可能会更改应用程序状态的操作)由不同于查询应用程序状态的组件执行。这种分离的最重要原因是每种技术都有不同的技术要求和非技术要求。执行命令时,查询组件(a)使用事件同步更新。这种通过事件进行更新的机制正是使这种体系结构具有可扩展性,可扩展性和最终可维护性的原因。
注意
CQRS的完整说明不在本文档的范围内。如果您想了解有关CQRS的更多背景信息,请访问Axon Framework网站:www.axonframework.org。它包含背景信息的链接。
由于CQRS与构成当今软件领域的分层架构根本不同,因此开发人员在试图找到解决方案的同时走进一些陷阱并不罕见。这就是Axon Framework构思的原因:帮助开发人员实施CQRS应用程序,同时专注于业务逻辑。
什么是Axon?
Axon Framework通过支持开发人员应用Command Query Responsibility Segregation(CQRS)架构模式,帮助构建可伸缩,可扩展和可维护的应用程序。它通过提供最重要的构建块的实现来实现,例如聚合,存储库和事件总线(事件的调度机制)。此外,Axon提供了注释支持,允许您构建聚合和事件监听器,而无需将代码绑定到Axon特定逻辑。这使您可以专注于业务逻辑,而不是管道,并帮助您使代码更容易单独测试。
Axon不以任何方式试图隐藏开发人员的CQRS架构或其任何组件。因此,根据团队规模,仍然建议让一个或多个开发人员对每个团队的CQRS有透彻的了解。但是,在确保向正确的事件侦听器传递事件并以正确的顺序同时处理事件时,Axon确实提供了帮助。这些多线程问题通常难以处理,导致难以跟踪的错误,有时还会导致应用程序失败。当你有一个紧迫的截止日期,你可能甚至不想关心这些问题。Axon的代码经过全面测试,可以防止出现这些类型的错误。
Axon Framework由许多模块(jar)组成,这些模块提供了构建可扩展基础架构的工具和组件。Axon Core模块为不同的组件提供基本API,以及为单JVM应用程序提供解决方案的简单实现。其他模块通过提供专用构建块来解决可伸缩性或高性能问题。
什么时候使用Axon?
并非每个应用程序都会受益于Axon。简单的CRUD(创建,读取,更新,删除)应用程序可能无法从CQRS或Axon中受益。但是,有很多应用程序可以从Axon中受益。
可能受益于CQRS和Axon的应用程序是那些显示以下一个或多个特征的应用程序:
当前系统会持续的以增加新功能的方式进行扩展。例如,在线商店可能会从跟踪订单进度的系统开始。在稍后阶段,可以对库存信息业务进行扩展,以确保在销售商品时正确地更新库存。甚至以后,会计部门可能需要记录销售的财务统计数据等。虽然很难预测软件项目将来如何发展,但系统一直是出于持续变化和扩展的状态的。
该应用程序具有很高的读写比。这意味着数据只写了几次,读的次数多了很多次。由于查询的数据源与用于命令验证的数据源不同,因此可以优化这些数据源以进行快速查询。重复数据不再是问题,因为事件是在数据更改时发布的。
系统以多种不同的形式呈现数据。如今,系统基本上在数据不断发生变化并需要在网页上显示信息时是不会停止的。例如,某些应用程序会发送每月电子邮件,会通知用户可能与其相关的更改。搜索引擎是另一个例子。它们使用与系统相同的元数据,但采用的方式是不一样的,它针对快速搜索进行了优化。报告工具将信息聚合到报告中,以显示数据随时间的演变。这又是相同数据的不同格式。使用Axon,每个数据源可以实时或定期彼此独立地更新。
当应用程序将具有不同受众的组件明确分开时,它也可以从Axon中受益。这种应用的一个例子是在线商店。员工将更新网站上的产品信息和可用性,同时客户下订单并查询订单状态。使用Axon,这些组件可以部署在不同的计算机上,并使用不同的策略进行扩展。它们使用事件保持最新,Axon将分发给所有订阅的组件,无论它们部署在哪台机器上。
与其他应用程序集成可能是繁琐的工作。使用命令和事件严格定义应用程序的API可以更轻松地与外部应用程序集成。任何应用程序都可以发送命令或侦听应用程序生成的事件。