幸福一箩筐|领域驱动设计框架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是框架的一些对比:
幸福一箩筐|领域驱动设计框架Axon实践图1
从对比中可以看出 , Axon支持事件回溯 , 排查历史问题较为方便 , 并且官方文档完善 , 一直处于更新维护中 。 StateMachine较为轻量 , 流程变更对于历史数据兼容性良好 。 综合考虑采用Axon+StateMachine相结合 , 实现简版工作流引擎 。
Axon框架介绍Axon框架的程序遵循基于领域驱动设计(DDD)、命令查询责任隔离 (CQRS)、事件驱动架构(Event Driven Architecture , EDA)的体系结构模式 , 这些原则的结合 , 使基于Axon的程序更加健壮、适应性更强 。 图2是基于Axon框架程序的典型体系结构:
幸福一箩筐|领域驱动设计框架Axon实践图2
基于Axon框架程序的典型体系结构图特性如下:

  • 领域驱动模型:可以使业务实体不会“贫血” , 更加饱满 , 实现高内聚、低耦合;
  • 命令查询责任隔离:命令模型和查询模型的分离 , 使得每个模型更容易理解 , 更易开发维护 , 天然适合高并发场景;
  • 事件驱动架构:支持事件溯源 , 方便对历史事件重放 , 记录数据变化完整过程 , 便于BI分析、线上问题排查、还原系统状态到任意时间点等 。
Axon系统调用链如图3所示:
幸福一箩筐|领域驱动设计框架Axon实践图3
Spring StateMachine介绍Spring StateMachine是使用 Spring框架下的状态机概念创建的一种应用程序开发框架 。 它使得状态机结构层次化 , 简化了配置状态机的过程 。 拥有有现状态机的特性功能:现态、条件、动作、次态 , 支持触发器、状态转移器、保护机制、状态转移动作和状态事件监听器 , 可基于ZooKeeper实现分布式状态机 , 可配置多层次、结构复杂的状态机 。 图4是简单配置效果图:
幸福一箩筐|领域驱动设计框架Axon实践图4
爱奇艺号合同中台服务实践项目介绍用户入驻爱奇艺号后发表作品会获得分成收益 , 账号满足一定条件后可以申请提现 , 提现之前需要跟公司签约电子合同 。 为了保证合同安全有效 , 线上签约流程比较漫长 , 包括用户填写信息、运营审核、采购单申请审核、合同审核、合同附件盖章邮寄、作品关联等等 , 累计20+状态 , 业务逻辑较为复杂 , 需求迭代变更频繁 , 对数据一致性要求较高 。


推荐阅读