DDDplus 业务中台开发框架 快速入门

原创
2020/10/20 23:01
阅读数 4.4K

Tip:使用该框架,需要对DDD的分层架构有基本了解:该框架面向的是DDD的domain层的开发框架。

IDomainService,领域服务,在DDD里是facade,完成一个完整的业务活动,例如接单。

接单在订单履约系统里,是非常复杂的过程,包括:服务产品校验,客户校验,供应商校验,店铺校验,承运商校验,增值服务校验,价格校验,促销规则校验,券抵扣,订单商品项校验,冷链的温层校验,目标仓寻源,承运商分单,库存预占,订单拆分,预分拣,地址解析等数十个(复杂场景甚至百个)的步骤,对应IDomainStep:一个业务活动是由多个步骤组成的。

步骤,相当于隐藏业务细节而把业务活动进行拆解的抽象,体现的是Divide and Conquer思想。

不同的业务场景下,步骤的顺序不同,步骤项不同,例如:B2B场景,接单是由步骤(A, B, D, F)完成的;而B2C场景,接单是由步骤(C, D, E, M, N)组成的。IDomainStep就是一种可以被编排的领域服务。

步骤的编排,有些是可以预先计算的,有些是动态计算的,例如:在D步骤需要调用预分拣API,根据返回结果才能决定后续步骤,一个步骤的动态编排示例

步骤执行过程中,可能抛出异常,为了保证业务一致性,之前已经成功执行的步骤需要回滚,实现了IDomainStep的子类IRevokableDomainStep就需要实现业务回滚操作。这些机制,是模板方法类StepsExecTemplate实现的:一种Sagas Pattern实现。

如何实现不同场景下对步骤的不同编排?同一个业务语义,不同场景的执行逻辑可能不同,例如:库存预占,有的商家要求零库存预占,有的要求缺量出库,有的要求预占失败要有冲正动作,有的要求预占成功后给商家回传状态等等,这如何解决?

这些问题,本质上属于业务的多态。在中台架构下,该问题更为突出,因为中台要覆盖更多的业务场景,即所谓的企业级能力复用平台

这引出了IDomainExtension,扩展点:业务语义确定,但不同业务场景执行逻辑不同的业务功能点,即业务的多态。

该框架下,扩展点机制是分层的:

  • IDomainExtension,最底层的扩展点,解决业务执行逻辑的不确定性
  • IDecideStepsExt,步骤编排扩展点,解决业务流程的不确定性
  • IModelAttachmentExt,解决业务模型的不确定性,可以简单理解为如何解决多业务场景下数据库字段的问题

扩展点机制,实现了业务多态,但运行时一项业务到底是哪一个扩展点的实现来执行?

这引出了IIdentityResolver:业务身份解析器,根据IDomainModel判断该业务是否属于自己,同时与某一个扩展点实现进行绑定,从而完成扩展点的路由机制。

这里的业务身份是完全动态的,支持任意场景,满足业务不确定性的需求,而不是基于经验进行建模编码的机制。

IIdentityResolver有2个机制:

  • Pattern:业务模式,可以任意维度叠加的水平业务,解决中台部门内部的个性化
  • Partner:前台合作伙伴,维度唯一、不可叠加的垂直业务,解决前台部门的个性化,来扩展中台能力

本质上,IIdentityResolver,相当于把之前散落在各处的某个业务逻辑的if判断条件进行收敛,使得这些业务判断显式化,有形化,并有了个名字(统一语言 UL)。

本质上,IDomainExtension,相当于把if后面的code block显式化,有形化,并可以进行组织分工:前台部门开发前台的逻辑,中台部门开发中台的逻辑,InnerSource机制更可能真正落地,协同建设一套企业级能力复用平台

什么是业务场景?在中台下,它是不确定的。它可能是任意维度,甚至我们想象不到的维度。

即使凭经验定义了一些维度,在2B业务下也不堪一击,很难保证它的稳定。下面列举一些业务场景的维度:

  • 冷链的订单
  • 大件的订单/中小件订单
  • 某个商家的订单
  • 某个行业的订单
  • 出库仓库类型
  • 出库时是否越库
  • 配送是是否自提,到哪里自提
  • 业务模式
  • 订单项是否包含违禁品
  • etc

以上,是该框架的最朴素逻辑。

更详细的内容,可以参考:

需要提醒的是,这是个业务中台开发框架,它能帮助你建立可落地的业务架构顶层设计,但它无法替代业务梳理、业务抽象、业务建模等具体工作。

此外,它也不是万能的业务开发框架,它主要针对的是复杂、个性化特征明显、重业务逻辑的目标系统。 如果你的系统很简单,CRUD特征明显,不建议使用。It is no silver bullet.

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部