方舟DDD实践(下)
如果无法正常显示,请先停止浏览器的去广告插件。
1. 请扫码签到
2. 个人简介-李鑫
2014年加入去哪儿网机票目的地事业群,担任软件开发工程师,现负责国内酒店订单
交易技术团队,涉及订单交易、支付结算、订单履约、预售等相关系统架构优化和业
务迭代研发,对高并发、分布式服务高可用,有建设优化经验
课程内容- DDD思想如何应用指导订单交易
以方舟实战案例为起点,介绍DDD核心概念,如何战略战术设计和DDD报价模型、
DDD交易领域模型、方舟系统架构,事件驱动设计以及一致性解决方案等相关知识
总结分享 战略设计、战术设计、实施落地 三个核心阶段+DDD 代码实践
目的地业务研发/交易与供应链
回归面向对象的本质、重拾抽象思维的的价值、
专注业务复杂度分离、突破技术复杂性
实现领域驱动设计
3. 1、希望对一些典型案例、问题
或重要的点,提供更细节的实
战经验分享
2、希望能具体就某一个案例具
体说一下划分过程以及遇到的
困难或者问题之类的
3、希望能有更多的代码实现方
面的内容
4. CONTENTS
目录
分布式存储、
调度中心、流程编排
代码实践
DDD 方舟订单
方舟架构
5. 一致性方案
内
聚合
聚合内一致性处理方案
文档结构、聚合根、ACID
聚合间一致性处理方案
事件驱动、最终一致性
外
6. 聚合内强一致性
标准、原则
一致性原则
保持不变条件(基本)
一个事务只修改一个聚合
小聚合,避免大聚合
公开行为接口
聚合根到聚合根:通过ID关联;
聚合根到其内部的实体和值对象,
直接对象引用;
7.
8. 方舟聚合
内一致性
(脱敏代码示例)
文档结构
9. 订单用户接口层代码实践 ( 脱 敏 示 例 )
功能简介
用户选购商品
生单支付、预定成功
代理商完成下单、成功或拒绝
或用户发起逆向取消退款流程
协议层
10. 订单应用层代码实践 (脱敏代码示例)
原则、标准
安全验证
轻量级
协调领域对象的操作
持久化处理
通过资源库获取聚合实例
应用层
11. 订单聚合根工厂实践 (脱敏代码示例)
要点
保护内部状态对于领域结构很重要,
使用getter&setter方会公开聚合的内
部会导致聚合处于不一致状态。
大型复杂业务系统,实体和聚合创建
过程很复杂,很难去通过简单构造器
方式来创建对象;
工厂模式决解了这个问题,当建立了
聚合根时,其他对象可以自动创建保
证聚合不变条件、封装复杂性
工厂-创建聚合根
12. 订单仓储层代码实践 (脱敏代码示例)
要点
持久化
聚合根保存
聚合根查询
仓储层
13. 支付领域服务代码实践 (脱敏代码示例)
原则、标准
领域中的服务表示一个无状态
的操作,它用于实现特定于某个
领域的任务。
当某个动作不适合放在聚合对
象上时,使用领域服务
以多个领域对象为输入,返回
一个值对象
妥协、非必要
14. 领域服务、应用服务、实体行为 原则
15. 聚合外最终一致性
原则、标准
一个事务只能更新一个聚合
保证最终一致性、领域事件
事件模型、重试、幂等
先保证聚合一致性、再发送事件
用户逆向流程
16. 方舟聚合外一致性 (脱敏代码示例)
监听
审核域
订单域
处理保存
处理保存
发送事件
发送事件
监听
支付域
处理保存
17. 04
DDD 方舟架
构
1、架构模式、四层架构、CQRS、六边形
2、通用分布式存储、事件驱动、流程编排
18. 严格分层架构,某层只能与直接位于其下方的层发生耦合
松散分层架构,则允许任意上方层与任意下方层发生耦合
依赖倒置原则DIP
CommandQueryResponsibilitySegregation
核心思想是将命令和查询操作分离、数据源相互独立
领域模型、服务于查询功能的数据模型
考虑 事务、一致性问题
【分层架构】
【六边形】
内部:application层 domain层
外部:应用的驱动逻辑、基础设施、其
他应用
内部通过端口和外部系统通信,端口代
表了一定协议,暴露API
【CQRS】
19. 四层
松散架构
20. 通用分布式KV存储
最佳实践
方舟聚合内解决方案
文档存储、乐观锁版控、利用ACID、规避大事务、
处理聚合内强一致性
亮点
全文检索、事件驱动、可降低资源层开发成本、持久化
策略方案、物理隔离
21. 方舟架构-插件化
不稳定区间
插件动态
复用性
领域模型
稳定区间
22. 方舟架构-流程编
排
• 业务线实现自己的【能力】如扣减库存、生单动作、支
付分账、发送系统
• 支持EL表达式解析和求值
• 【角色(用户、商家、运营)】使用【能力】列表,履
约单的xml/json支持执行策略,如
order.status=submit,进入履约流程
23.
24. 请扫码填写问卷