写点什么

领域驱动设计框架 Axon 实践

  • 2020-09-15
  • 本文字数:3445 字

    阅读完需:约 11 分钟

领域驱动设计框架Axon实践

背景

2004 年,Eric Evans 发表了 Domain Driven Design(领域驱动设计,DDD)这一著作,并在书中对领域驱动作出了开创性的理论阐述,至今领域驱动设计已问世十几年。

近几年来随着微服务盛行, ES (Event Sourcing)事件溯源和 CQRS (Command Query Responsibility Segregation)读写分离也成为了一个越来越流行的概念,使用 ES 和 CQRS 好处在此不做赘述,但是也存在颇多弊端,比如事件数量巨大、回溯状态需要提前预热、缺少成熟的框架支撑等。在这种情况下,2009 年 Allard Buijze 在 JVM 平台开源了 Axon Framework 用来解决此问题,简单说来 Axon 就是集成了 DDD、ES 和 CQRS 于一身,落地实现的一套框架方案,并成立了一家公司 Axon IQ,专门与 Axon 产品合作。

爱奇艺号技术团队,在实施微服务化过程中,应用领取驱动思想,采用 Axon 框架落地了多个服务,下面是实施过程中的经验总结。

技术选型

爱奇艺号合同中台面向用户提供签约功能,从发起签约到运营审核、供应商、采购单、扫描件、归档等流程漫长,状态颇多,业务较为复杂,同第三方系统交互较多,对于有问题数据需要进行定位和回溯。项目初期为了更好的满足这些需求,我们调研了一下比较成熟的框架,包括 Cola、Axon、Activiti、Spring StateMachine 等,图 1-1 是框架的一些对比:



图 1-1


从对比中可以看出,Axon 支持事件回溯,排查历史问题较为方便,并且官方文档完善,一直处于更新维护中。StateMachine 较为轻量,流程变更对于历史数据兼容性良好。综合考虑采用 Axon+StateMachine 相结合,实现简版工作流引擎。

Axon 框架介绍

Axon 框架的程序遵循基于领域驱动设计(DDD)、命令查询责任隔离 (CQRS)、事件驱动架构(Event Driven Architecture,EDA)的体系结构模式,这些原则的结合,使基于 Axon 的程序更加健壮、适应性更强。图 1- 2 是基于 Axon 框架程序的典型体系结构:



图 1-2


基于 Axon 框架程序的典型体系结构图特性如下:


  1. 领域驱动模型:可以使业务实体不会“贫血”,更加饱满,实现高内聚、低耦合;

  2. 命令查询责任隔离:命令模型和查询模型的分离,使得每个模型更容易理解,更易开发维护,天然适合高并发场景;

  3. 事件驱动架构:支持事件溯源,方便对历史事件重放,记录数据变化完整过程,便于 BI 分析、线上问题排查、还原系统状态到任意时间点等。


Axon 系统调用链如图 1-3 所示:



图 1-3

Spring StateMachine 介绍

Spring StateMachine 是使用 Spring 框架下的状态机概念创建的一种应用程序开发框架。它使得状态机结构层次化,简化了配置状态机的过程。拥有有现状态机的特性功能:现态、条件、动作、次态,支持触发器、状态转移器、保护机制、状态转移动作和状态事件监听器,可基于 Zookeeper 实现分布式状态机,可配置多层次、结构复杂的状态机。图 1-4 是简单配置效果图:



图 1-4

爱奇艺号合同中台服务实践

【项目介绍】

用户入驻爱奇艺号后发表作品会获得分成收益,账号满足一定条件后可以申请提现,提现之前需要跟公司签约电子合同。为了保证合同安全有效,线上签约流程比较漫长,包括用户填写信息、运营审核、采购单申请审核、合同审核、合同附件盖章邮寄、作品关联等等,累计 20+状态,业务逻辑较为复杂,需求迭代变更频繁,对数据一致性要求较高。


项目 1.0 版本采用的是 Activiti 工作流作为引擎设计实现的,基于 Activiti 特性,可以严格控制每一步状态的流转,历史操作事件都会记录到系统数据库中,对于线上问题排查有一定的优势。但是学习成本较大,需要开发人员了解框架系统的二十多张表功能、使用 BMPN 进行流程定义设计等。图 1-5 是最初版本的流程设计图:



图 1-5


随着业务的发展,想要修改流程设计,增加一些新状态,此时 Activiti 的弊端更加暴露出来:如果在原有流程上修改,对于历史数据的显示会报错,如果新增流程,对于正在流程中的数据又没法使用新流程,只能终止掉重新发起。Activiti 针对这种流程升级,或者中国特色式的工作流一直没有很好的解决办法,网上的一些解决方法较为复杂,涉及到修改系统内置数据库,实现起来成本较大。针对这种情况,爱奇艺号开发团队对系统进行了升级,采用 Axon+Spring StateMachine 相结合进行项目架构设计,实现了合同系统 2.0 版本,最终呈现的结果如图 1-6:



图 1-6


架构说明如下:


  1. 用户接口层:主要是 MQ 消息、UI 和 API 接口,接收用户请求、运营审批命令、第三方系统交互通知等;

  2. 应用层:接口参数校验、组装业务参数,转换成 Axon Command 进行命令分发;

  3. 领域层:接收到领域事件,转换成状态机 Event,驱动状态机进行状态更迭,触发对应业务逻辑处理;

  4. 基础服务层:提供底层存储服务,第三方服务等。


系统调用流程如下图 1-7:



图 1-7


Axon+StateMachine 结合,实现简版工作流引擎功能,相比于 Activiti 更加轻量级。以合同对象多为领域对象,系统操作命令使用状态机进行控制流转。所有对系统的修改操作均以 Axon 的 Command 进行,Axon 会记录所有对领域对象操作过的事件,可以还原合同生命周期内每一步的状态,对于问题排查,统计分析有着很大的帮助;snapshot 机制对事件进行预热,解决事件过多加载慢的问题;sage 对系统失败操作进行补偿事件,保证系统间数据状态的一致性;StateMachine 特性,可以修改状态之间流转走向及流转条件,新增状态对于历史数据或者进行中的数据没有影响,对系统的迭代开发有很大的效率提升,天然适合互联网性质工作流。

价值

通过在爱奇艺号后端服务应用 Axon 框架,可以达成以下效果:


1、 开发方面的优势


  • 转换思维:Java 语言开发一直提倡面向对象开发,但是很多业务开发人员的思维还是面向过程开发的思维,按照 MVC 分层进行业务代码的堆叠。Axon 思维更倾向于面向对象,以领域对象为核心,由于领域对象有明确的领域边界,所以容易促进开发人员思维模式的转变。

  • 提升开发效率:项目基于命令模型开发,可以让熟悉业务的开发人员专注于领域层开发,接口和应用层开发则可以由对业务比较陌生的开发人员负责,二者通过命令发送消息机制进行通信。这种职责分离的优势在于不需要所有的开发人员都对业务非常熟悉,减少了熟悉具体业务的时间,且每个开发人员都职责明确,可显著提升开发效率。


2、 运行维护时的优势


  • 便于问题排查:事件溯源机制使得领域对象的每次操作变更状态都有记录,对于排查线上问题有很大的帮助,可以按照先后顺序还原对象的每一步状态。snapshot 机制有很好的解决了 ES 事件预热的问题。对于 BI 的分析也有着更好的支撑。

  • 支持系统高吞吐量:CQRS 的支持,天然适合高并发场景,如果系统有高并发的需求,使用 Axon 框架可以得到更好的支持。

  • 便于维护和拓展:Axon 框架的代码层次清晰,易维护,使用的事件机制让系统更具可扩展性。

难点

  • 分布式事务一致性问题,saga 虽然能保证分布式事务的最终一致性,但是实施起来困难很大,需要开发各种补偿机制来实现。而且没有考虑到服务的宕机、幂等、重试支持等问题

  • 批量事务处理能力较弱,对于一些批量功能,目前只能转换成单独的命令进行处理,没有提供很好的批处理能力。

  • 与 Spring cloud 整合问题,Axon 支持与 Spring Cloud 结合,使用分布式消息队列来实现分布式系统间命令的分发,但是目前没有比较良好的实现,中文文档较少,需要进一步研究实施。

  • Axon 的充血模型虽然是一大特色,但是实施起来比较繁琐,对于简单的业务实现,贫血模型更加适合。

  • 中文文档少,上手难度较高,国内使用人少,遇到问题可请教或讨论的人少。

未来规划

从 4.0 版本开始,Axon 已经不止是个框架,而是一个由 Axon Framework 和 Axon Server 组成的平台。目前官方发布的最新 Axon 版本已经是 v4.3.3,本文中的项目基于 Axon 框架 v3.04 进行开发,并且是基于单机事件传播,对于 Axon Server 机制还未深入研究使用。另外对于一些高级特性如:与 Spring Cloud 整合、分布式命令、分布式事件、分布式事务等需要进一步实践和总结。Axon 命令分发支持与配置 AMQP 协议的 MQ(Message Queue)绑定,MQ 用于把 Event 分发到 MQ 中,采用这种机制可以针对性的对服务进行更细粒度的拆分,命令分发和处理可以配置成不同的模块,按照各自吞吐量进行服务部署。此外,分布式事务一直是个令人头疼的问题,对于 saga 的优雅实现需要花费更多的时间进行深入研究。


领域思想的转变对面向对象开发语言有着重大的帮助,成熟的架构支持及持久的维护性对于技术选型有着很大的影响,流行的 Axon, Akka, Cola 等框架势头正猛,相信领域思想未来会更深入人心。


作者介绍


本文转载自公众号爱奇艺技术产品团队(ID:iQIYI-TP)。


原文链接


领域驱动设计框架Axon实践


2020-09-15 14:055148

评论

发布
暂无评论
发现更多内容

模块9-设计电商秒杀系统

卡西毛豆静爸

#架构训练营

跑赚项目-stepn后续-如何月入过万(33/100)

hackstoic

投资 web3

leecode上的代码到pycharm运行解决历程

武师叔

5月月更

在线Excel列提取导出工具

入门小站

工具

[Day35-02]-[二叉树]-求根节点到叶节点数字之和

方勇(gopher)

LeetCode 二叉树 数据结构算法

[Day35]-[二叉树]-二叉树的锯齿形层序遍历

方勇(gopher)

LeetCode 二叉树 数据结构算法

渗透必备:Kali中安装漏洞靶场Vulhub

喀拉峻

网络安全 漏洞 渗透 靶场

开源字节技术架构

源字节1号

软件开发 后端开发

四、应用高可用之容量设计

穿过生命散发芬芳

5月月更 容量设计

EasyRecovery2022最新版电脑数据恢复工具

茶色酒

数据恢复软件

《敏捷软件测试》的作者将“Agile Testing”改为“Holistic Testing”

BY林子

软件测试 敏捷测试 持续测试

不可谓不“细”!阿里内部价值百万“微服务架构精髓”限时开源

Java架构追梦

Java 微服务 后端开发

撸了一个Spring Boot + VUE 框架开发的分布式网盘系统「源码开源」

Java架构追梦

spring java面试 后端开发

Java并发JUC(java.util.concurrent)线程池

芝士味的椒盐

Java Java多线程 5月月更

【愚公系列】2022 年 05 月 二十三种设计模式(四)-原型模式(Prototype Pattern)

愚公搬代码

5月月更

AI大咖说-如何评价论文的创新性

AIWeker

人工智能 5月月更 论文写作

网络安全日常学习之渗透测试思路总结

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

WebAssembly技术_编译ffmpeg(ubuntu20.04)

DS小龙哥

5月月更

【JAVA秘籍功法篇-分布式事务】事务的实现原理

王老狮

分布式事务 CAP原理 BASE理论 ACID 事物的实现

在线模拟解析Crontab表达式执行时间

入门小站

工具

Harbor v2.5远程复制:制品的签名如影随形

亨利笔记

GitHub霸榜月余的24万字Java面试手册,竟是阿里机密

Java架构追梦

Java 程序员 后端开发

无死角窥探的焦虑:AI如何反击隐私侵占?

脑极体

架构实战营毕业总结

卡西毛豆静爸

架构训练营

linux手误rm可能不需要跑路

入门小站

Linux

架构、框架侃侃而谈算法望而却步?吃透这份笔记轻松掌握算法技能

Java架构追梦

Java 架构

算法:动态规划-斐波那契数列问题

正向成长

动态规划

Java并发JUC(java.util.concurrent)集合不安全

芝士味的椒盐

Java Java集合框架 5月月更

TypeScript 原始数据类型

Emperor_LawD

typescript 基础 5月月更

HUAWEI永远滴神!华为顶级网络专家总结出了这份网络协议开源手册

Java架构追梦

华为 后端开发 网络协议、

2022 之Python操作 Excel,xlrd 与 xlwt 模块一文掌握

梦想橡皮擦

5月月更

领域驱动设计框架Axon实践_开源_爱奇艺技术产品团队_InfoQ精选文章