其他
严选商品中心DDD实践
1 前言
2 系统的痛点有哪些?
开发完成后自动创建商品 工单审核后自动创建纯组合装商品 直接创建特殊免立项商品 采购迁移后台创建商品
3 DDD简介
更明确的边界 DDD的设计原则,是使系统的边界更加清晰,让我们本能的进行软件系统的分而治之。这是其最具价值的地方,当我们把问题分的越小,它的解决也越简单。 更通用的语言 当边界确定后,边界内的术语(名词对象、动作等),在产品、开发、测试的共同努力下,将形成具有共识的通用语言。特别是可以在后续的迭代保证这些术语是通用的。这里特别提到了通用语言的确定不再只由开发人员来决定了,是业务相关人员的共识,也更能加深大家对领域模型的了解。 更内聚的逻辑 一个明确的问题域中,子问题都会落到边界内负责处理,逻辑更加内聚,对外界隔离。
4 系统改造之路
4.1 战略设计
领域愿景说明(Domain Vision Statement) 由产品技术等人员阐述商品域的核心能力:商品板块负责商品管理:包括商品和SKU等核心数据维护、商品相关配置,负责和支撑严选内部商品相关的业务协同:包括新品开发全流程(新品立项、寻源、报改价、采购侧工单、包装设计、上线信息评审等)、售价变更、重新售卖等。 突出核心(Highlighted Core) 通过对业务的梳理,抽出核心模型:SPU、SKU、物理类目、配送区域、营销配置、售后地址、服务政策等,并将这些模型按聚合关系划分为四个子域。
4.2 战术设计
Entity(实体) 每个实体是唯一的,允许状态发生变化,但是一定有唯一标识。 ValueObject(值对象) 值对象用于描述实体,值对象和实体的区别是不需要感知唯一标识。 Aggregate(聚合) 聚合是一种特殊的实体,是由一组与强相关的实体和值对象组合而成的。 Bounded Context(限界上下文) 用来封装通用语言和领域对象,通常一个子域对应一个限界上下文。
4.3 编码流程
梳理业务节点 抓取关键节点 在对链路分析后,按领域模型相关性,标记核心节点(绿色部分),形成简化版的节点图:
收敛逻辑 在这个过程中,需要对节点进行重构,主要进行节点合并和节点异步化两块内容: 节点合并:校验节点,我们可以归位一个统一节点,实际业务操作的节点也按聚合合并。 非阻塞流程异步化:通过分析,其实有些操作是可以异步化的。例如:操作人、操作日志、上架任务的取消、缓存刷新等可以在消息通知订阅后处理,从而继续简化核心链路。
5 相关设计
5.1 服务架构
5.2 事件机制
事件提交 允许事件提交到当前场景 事件异步和控制 指的是可以控制事件实际对外通知的时机 事件异常重试 异常后支持重试实现业务补偿
容器启动 完成Listeners实例创建 初始化EventBus事件总线 从BeanFactory扫描所有Listeners 注册Listeners到EventBus事件总线
6 讨论
失血模型:实体只有setter/getter 贫血模型:domain ojbect包含了不依赖于持久化的业务逻辑 充血模型:绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层 胀血模型:取消Service层,只剩下domain object和DAO两层,在domain object的domain logic上面封装事务。