AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

领域驱动设计框架 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:055268

评论

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

区块链数据共享平台—追踪、溯源、可信

电微13828808271

区块链+

Spring IOC 特性有哪些,不会读不懂源码!

小傅哥

Java spring 小傅哥 控制反转IOC

智慧平安社区建设,创建“三零平安社区”

13530558032

EFT【阿凡提】等级规则、收益、排线方法与EFTalk十大关键点

币圈那点事

Golang 字符串分组

一代咩神

Go 语言

多功能工具箱Quicker+笔记软件flomo,竟然还能擦出这样的火花?

彭宏豪95

效率 工具软件 笔记 工具分享 4月日更

架构实战营作业:模块一

心晴雨亦晴(~o~)

空中交警:借你一双“慧眼”,让你看透这飞机的“黑色十分钟”

华为云开发者联盟

modelarts yolo 华为云ModelArts 模型开发 华为开发者大会2021

区块链产业园区服务平台开发,搭建区块链园区运营平台

13828808769

区块链+ #区块链#

区块链农产品质量安全溯源,保证农产品品质

13530558032

马特量化交易机器人,炒币24小时不停歇

飞亚科技

3w 字长文爆肝 Java 基础面试题!太顶了!!!

苹果看辽宁体育

Java 面试 后端

手把手教你写一个spring IOC容器

华为云开发者联盟

spring 容器 ioc spring框架

花费一月时间吐血整理程序员必读书单,建议收藏

Silently9527

程序员

Linux cat 命令

一个大红包

4月日更

盘点 15 个好用的 API 接口管理神器

Java小咖秀

工具 工具分享

初识Nginx(一)

书旅

nginx

区块链电子合同--助推合同数字化管理

13530558032

旋转木马案例

赫鲁小夫

4月日更

Rust从0到1-结构体-一个例子

rust struct

区块链农产品溯源平台,为农产品质量安全护航

13828808769

区块链 区块链+

技术分享第二讲报名!

神策技术社区

大数据 活动 报名 神策

“区块链+电子处方”,医疗跟更健康

电微13828808271

Spark数据倾斜方案实战(二)

小舰

4月日更

python 调用 cmd 而不显示黑框的方法

一代咩神

Python cmd

团队协作中,如何写出让同事赞不绝口的代码

有道技术团队

代码规范

善盾SD币是什么?

飞亚科技

SumSwap节点预售关注度飙升而Uniswap V3版本却备受争议

币圈资讯

手摸手教你阅读和调试大型开源项目 ZooKeeper

HelloGitHub

Java zookeeper 源码分析 ZooKeeper原理

LeetCode题解:剑指 Offer 49. 丑数,二叉堆,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

年薪百万是社会认同,更是自身价值体现

博文视点Broadview

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