方舟DDD实践(上)
如果无法正常显示,请先停止浏览器的去广告插件。
1. 请扫码签到
2. 个人简介-李鑫
2014年加入去哪网机票目的地事业群,担任软件开发工程师,现负责国内酒店订单交
易技术团队,涉及订单交易、支付结算、订单履约、预售等相关系统架构优化和业务
迭代研发,对高并发、分布式服务高可用,有建设优化经验
本期课程内容- DDD思想如何应用指导订单交易
以方舟实战案例为起点,介绍DDD核心概念,如何战略战术设计和DDD报价模型、
DDD交易领域模型、方舟系统架构,事件驱动设计以及一致性解决方案等相关知识
总结分享 战略设计、战术设计、实施落地 三个核心阶段
目的地业务研发/交易与供应链
回归面向对象的本质、重拾抽象思维的的价值、
专注业务复杂度分离、突破技术复杂性
实现领域驱动设计
3. 讲解内容
4.
5. 架构内容
6. 前言
是什么
① Domain-Driven Design(领域驱动设计)简称DDD
② 构建领域模型、高度业务抽象
③ 一种设计思想
④ 面向对象建模方法论
价值在哪里
DDD
① 非常有用的领域模型、业务更准确的定义和被理解
② 业务 = 设计 = 代码
③ 敏捷、迭代式和持续建模、思考战略战术
④ 战略中台指导、微服务拆分
两大支柱
① 最大的挑战需要花费时间、精力思考业务领域、概念、术语和专家沟通、构
建改进通用语言,达成共识
② 事件风暴,划清模型边界、分析领域模型、以驱动设计出识别限界上下文
7. CONTENTS
目录
DDD 方舟项目
DDD基础概念
DDD概念
方舟DDD实践
战略战术
方舟背景
DDD架构
番外篇
8. DDD 战略设计、战术设计
9. DDD 战略设计
发散
用例、场景分析理解业务
梳理对象之间的关系;
收敛
事件风暴、收集实体、命令、
事件、形成聚合、限界上下
文、建立领域模型
重点
业务问题分析
识别核心问域
可指导中台战略、微服务
发散
收敛
10. DDD 战术设计
对象
实体
值对象
聚合
工厂
领域事件
分层架构
资源库
规则
封装、引用、访问、一致性
11. 01
愿景
打造旅游行业最高效、企业级能力复用平台
02
DDD 方舟
项目背景
以门票玩乐业务为起点
目标
02
把不稳定的场景应用和稳定共性功能进行分离沉淀
实现业务流程标准化、规范化,提升迭代效率,降低迭代成本;
通过科学的架构方法,实现复杂业务快速发展
12. 方舟订单交易架构
解决痛点
服务边界不清晰\化维护成本大
DDD架构 VS 烟囱式系统、传统架构
分层
领域层:通过分层架构、领域拆分、
边界划分、降低系统复杂性、降低沟
通成本
仓储层:高可用、扩展、降级、恢复
提供共性问题统一的解决方案
13. 事件风暴
03
DDD
战略设计、战术设计
与方舟实践应用
通用语言、限界上下文、上下文映射
聚合、实体、值对象、领域、领域服务、资源、工厂、领域
事件
14. DDD战略设计思想
15. DDD战略设计原则
16. 通用语言
定义/作用
通用语言:通过团队交流达成共识的,能
够简单、清晰、准确描述业务涵义和规则
的语言
通用语言包含业务术语可以直接反映在代
码逻辑
通用语言中的名词可以给领域对象命名、
动词则表示一个动作或事件对应领域事件
或者命令
项目沟通协商形成的统一语言,准确将业
务需求转化设计,代码的可读性更好
提炼
17. 如何事件风暴
事件分析
快读探索复杂业务领域和领域建模的实践
从领域中关注业务事件、内部讨论、统一语言、
形成领域模型
执行流程
收集寻找领域事件、命令、角色、领域模型、聚合
划分领域、限界上下文
核心
确认领域模型、聚合、聚合根、实体、值对象等
划分子域(核心域、支持)
18. 分析订单问题空间、确认解决方案空间
用户请求
预定/产品快照
产品规则解析
生单支付
资金抽取
问题空间
订单交易
支付表单构建
信息流
支付流
交互支付中心
状态
逆向流程
履约或逆向流程
一致性/数据存储
异步通知 解冻资金
财务 支付中心
清算 冻结账户
分账 现金账户
抽
象
提
炼
解决方案空间
酒店订单、搭售、预售、门票方舟交易共性
购买单元、产品快照、资金、预定规则、逆向规则、交互支付
中心、履约流程、一致性、原子性处理
19. 识别角色、命令、事件
20. 确认聚合、划定边界
规则
领域模型 -> 聚合
领域模型上:聚合根
领域模型下:实体、值对象
形成聚合
划分子域、限界上下文
确认依赖关系、未解问题
双向依赖
循环依赖
...
21. 方舟交易事件风暴回顾
目标
团队成员
收集领域事件(颗粒度、连锁反应)
寻找命令和角色
寻找领域模型、实体、值对象、聚
合
划分领域和限界上下文
场景分析 命令、领域事件
22. 交易聚合的过程
抽取
23. 交易领域
聚合根
定义限界上下文、定义实体、值对象、聚合根
商品聚合根:SPU
订单聚合根:解决信息流、资金流、状态、父子单业务、
逆向流程等、封装处理订单问题
支付聚合根:解决支付业务分账、资金正向、逆向流程、
与支付中心交互、标准API输出、幂等性考虑等、封装处
理资金问题
履约聚合根:解决订单履约业务、确认、审核、封装处理
OFC问题
原则
聚合内:强一致性,聚合根实体统一存储
聚合间:最终一致性,事件驱动、异步、重试补偿
聚合根
聚合
实体
24. 订单域
25. 聚合原则
一致性原则
保持不变条件(基本)
聚合中的实体和值对象应该具有相
同的生命周期,并应该属于一个
业务场景
一个事务只修改一个聚合
小聚合
避免大聚合,考虑性能
一致性、伸缩性
26. 聚合间原则
聚合原则
访问原则:通过全局唯一标识
来引用外部聚合
在边界外使用最终一致性
好处
方舟拆分 订单聚合 支付聚合
避免 大聚合、加载、高耦合
减少更新并发冲突
独立的生命周期和问题域
事件通知、最终一致性
避免大聚合
27. 聚合根
(脱敏代码示例)
定义
根实体
一个实体、独立生命周期
聚合根到聚合根:通过ID关联;
聚合根到其内部的实体,直接对象引用;
聚合根到值对象,直接对象引用;
原则
公开行为接口
保护内部状态、封装、不变条件
全局标识、建模对象导航性、访问原则
领域服务
行为
提交订单、确认订单、取消订单
领域中的服务表示一个无状态的操作,
它用于实现特定于某个领域的任务。
当某个动作不适合放在聚合对象上时,
使用领域服务
28. 工厂
(脱敏代码示例)
聚合根
注入
保护内部状态
封装
不变条件
命令
工厂
应用层、工厂创建订单聚合根、持久化
29. KINGSOFT
订单仓储 (脱敏代码示例)
聚合根注解
订单仓储
聚合根注解
仓储、持久化
聚合内部一致性
验证、持久化
持久化
30. 实体、值对象(VO)
优点
缺点
简化分层 胀血模型 不稳定
OO原则 充血模型 划分逻辑
易维护
贫血模型
失血模型
复用性差
31. 分析资金业务背景
背景
价格单元
日期属性
促销优惠
业务流程
零散
收敛
32. 资金实体-高内聚
资金
分析
内聚
原则
方式
流水号
角色、流向
主题、颗粒度、保证语义
属性类型
支付
退款
属性状态
虚
实
动作
策略
行为
资金方法
33. 资金实体数据 (脱敏代码示例)
数据结构
34. 资金实体 (脱敏代码示例)
实体
唯一标识
生命周期
有状态
体现相关业务行为
计算资金相关方法
订单费用、支付金额、佣金等
行为
35. 面向数据开发 VS 领域驱动 小结
战略设计
战术设计
领域分析
领域建模
面向数据开发
领域驱动
36. 请扫码填写问卷
37.