02 | 领域、子域、核心域、通用域和支撑域:傻傻分不清?
02 | 领域、子域、核心域、通用域和支撑域:傻傻分不清?
讲述:欧创新
时长13:06大小10.48M
如何理解领域和子域?
如何理解核心域、通用域和支撑域?
总结
思考题
赞 100
提建议
精选留言(124)
- 祥敏2019-10-29您好,以我公司新启动的业务线“平安社区”为例,以安防设备为集成基础。安防设备和物联网平台却都是市场成熟厂家提供,划分为通用域;平安社区业务场景如人车双验、异常人员识别等个性化应用属于业务线的支撑域;人员数据、行为数据富有长期价值,这些视为核心域。如果未来在某个细分场景做到了领先且拥有市场壁垒,这样的业务也可能会从支撑域调整为核心域。 所以,核心域、通用域、支撑域的划分本质是公司战略方向的体现,DDD是从战略到战术角度来进行架构设计的方法。展开
作者回复: 是这样的。
共 4 条评论97 - stg6092019-10-22老师你好,关于问题空间和解决方案空间一直不是很理解,子域的划分属于问题空间,而限界上下文则属于解决方案空间。 但是这个所谓的问题空间和解决方案空间到底是啥?对于我们分析问题而言为何要划分这两种空间?
作者回复: 你可以这么理解。问题空间的划分也就是子域的划分过程,实际上还是一个业务粗分过程,因为领域太大的话,你不方便对它进行分析和设计。 只有问题空间小到一定程度后,你才可以熟悉的定义解决方案空间,在这个比较小的空间内进行事件风暴,找出领域对象,构建聚合,划分限界上下文,建立领域模型,再进行微服务的设计,也就是一个解决方案的形成过程。
41 - 海大2019-12-10通用域在基础设施层 理解对吗
作者回复: 不是的,通用域也是业务域,不过是可复用的业务域。跟基础设施层是不同的纬度。
24 - vivi2019-10-16通用域和支撑域对应到企业系统是哪些呢?
作者回复: 通用域是一些大家都需要用的通用系统,比如认证,权限等等,这类应用很容易买到,不需要做太多的定制化,没有企业特点。支撑域具有企业特性,但不具有通用性,比如数据代码类的数据字典等系统。
共 2 条评论24 - 密码1234562019-10-16对于领域问题来说,可以理解为。对一个问题不断的划分,直到划分为,我们熟悉的,能够快速处理的小问题。然后在对小问题处理在排列一个优先级。
作者回复: 赞一个,理解的非常到位。划分到最小就是聚合,聚合之上就是限界上下文,根据限界上下文建立领域模型,然后设计微服务。
20 - Catwell2019-10-1613年以前基本是三层架构开发,13年后开始使用DDD,没系统的研究过,只是看了一些资料,我的理解是基于业务的属性,把原先的三层变成N个三层,相互间用接口或者API传输,不知道我这样理解对不对。
作者回复: DDD包括战略和战术设计两个部分,战略设计完成领域建模,战术设计完成微服务设计。您说的应该属于战术设计的部分,DDD分层架构包括用户接入层、应用层、领域层和基础层四层,每层有不同的服务,职责不同。后面章节有详细介绍,请耐心等待。
共 3 条评论18 - Geek_a916702019-10-18有些领域边界特别模糊,不好划分,例如:某些子领域两边都靠,不知道怎么取舍
作者回复: 看领域大小,不大的话可以考虑放在一个限界上下文内,做成一个微服务。比较大的话,可先做好聚合的边界,以后随时可以根据需要来拆分微服务。
17 - 宝宝太喜欢极客时间了2019-11-03领域跟子域是一个相对的概念,一个领域可能成为另外一个领域的子域,一个子域又可能成为另一个子域的领域。所以再确定领域的时候是不是得先确定好界限上下文?及确定范围呢?在一个范围内再谈领域子域。还有就是子域,到底划分到什么程度的时候就不用再划分下去,老师再文中指出要划分到聚合这里,就是说聚合就是最小的子域了吗?一个聚合对应一个微服务中的服务?
作者回复: 我在文中讲到了,在领域不断划分的过程中,领域会被细分为不同的子域,这个过程实际上是将问题范围不断缩小的过程。借用读者“密码123456”的总结,他认为:“对于领域问题来说,可以理解为,对一个问题不断的划分,直到划分为我们熟悉的,能够快速处理的小问题。然后在对小问题处理再排列一个优先级。”这个理解是很到位的。在领域细分到一定的范围后,我们就可以对这个子域进行事件风暴,为这个子域划分限界上下文,建立领域模型,然后可以基于领域模型进行微服务设计了。 虽然DDD没有明确说明子域和限界上下文的关系。我个人认为,子域的划分是一种比较粗的领域边界的划分,它不考虑子域内的领域对象、对象之间的关系和结构。子域的划分往往按照业务阶段或者功能模块边界进行粗分,其目的就是为了让你能够在一个相对较小的问题空间内,比较方便的用事件风暴来梳理业务场景。而限界上下文本质上也是子域,限界上下文是在明确的子域内,用事件风暴划分出来的。它体现的是一种详细的设计过程。这个过程设计出了领域模型,明确了领域对象以及领域对象的依赖等关系,有了领域模型,你就可以直接进行微服务设计了。 聚合是最小的业务单元,也是可以独立作为微服务的。
15 - 拙言2019-10-16这里没看限界上下文的概念,在桃树的例子中,细胞即为限界的上下文吗?还是说,器官,组织,细胞都是限界的上下文?
作者回复: 你好,段拙言。还是你细心,不过不要纠结这里的限界上下文的概念,限界上下文是由它的语义边界来确定的。在DDD里面一个聚合可以是一个限界上下文,多个不同职能的聚合也可以组成为一个限界上下文,他们都在一个语义环境下。有的组织可能只有单一细胞,有的组织可能由多个不同功能的细胞组成的。我们重温一下生物课哈。由一种细胞所构成的均一组织。而由两种以上细胞构成的不均一的组织称为复合组织。特定功能(特定的语义环境)的组织基本上就可以对应到限界上下文。
共 3 条评论13 - Geek_e8f4b02020-06-18发现文章有点晚最近才看到,很有启发,tks,我有一个疑问:一个子域是不是等于一个限界上下文边界,如果不是,那么如何划分子域,子域与限界上下文又是什么关系,因为你后续相关文章都是提高由事情找实体和值对象,根据实体和值对象找聚合根形成聚合,聚合s+限界上下文+一些微服务的拆分原则构成一个微服务。那子域在其中并没有启动拆分的作用。
作者回复: 最近在准备书的内容,书里面对这一部有详细说明,我就直接复制过来了。 在DDD中包括问题域和解决方案域两个不同的维度。问题域主要从业务视角来考虑,完成从领域到子域的分解,而解决方案域则主要从技术实现的角度,通过划分限界上下文和采用DDD战术设计完成微服务拆分和落地。“子域”和“限界上下文”这两个概念分别从不同的视角,构建起了DDD 处理业务复杂度的根基。 个人认为“子域”和“限界上下文”在大多数情况下是一对一或者一对多的映射关系。从实践角度,我们可以这样理解,我们不妨将业务领域的分解拆分为两个阶段:从领域到子域的粗粒度的分解和从子域到限界上下文的技术实现级的分解。有时候企业的业务领域非常庞大,不太方便用事件风暴对整个领域构建领域模型。所以在领域建模之前,我们先根据业务流程边界或者功能集合等要素,将庞大的领域分解成若干个大小合适的子域,然后根据子域属性划分为核心子域、通用子域和支撑子域。当领域分解到足够小后,我们就可以在这些子域内开展事件风暴,划分限界上下文完成领域建模。 在对不同属性子域构建领域模型时,我们可能会有不同的关注点,比如在通用子域构建领域模型时,我们会更多的关注领域模型的抽象和标准化,以便实现企业级复用,这种设计方法与中台的业务建模方法是一致的。当然,如果你的领域足够小的话,我们就没必要进行从领域到子域的分解和属性归类了,你可以直接开展事件风暴,直接划分限界上下文,完成领域建模。按照这种分解方式,如果子域和限界上下文边界刚好一致,那它们就是一对一的关系,而如果在一个子域内还可以划分为多个限界上下文,那我们最终得到的就是一对多的映射关系。需要注意的是,有些通用子域构建出来的领域模型往往会因为复用的需要,可能会跨多个不同的其他业务子域。 限界上下文本质上就是子域,只不过它会更多的考虑领域对象的语义边界和技术实现细节。限界上下文的划分体现的是一种更为详细的设计过程,这个过程划分了业务的上下文语义边界,完成了领域模型,明确了领域对象以及领域对象之间的依赖关系等。我们依据限界上下文和领域模型就可以完成微服务设计和落地了。
13 - marker2019-11-26您好,我对领域驱动还算是入门比较早的了,看了您的文章后受益匪浅。总结和举例都非常到位,一句话表明了中心,不像其他的DDD课程,说得很官方。点个赞👍
作者回复: 谢谢你的鼓励😄。
11 - huaweichen2019-11-05感谢老师非常深入浅出的桃树比喻。 我们公司是做车险鉴定(Insurance Assessment)的。 我们当时也初步开发了几个领域: 授权领域:这个因该是属于通用域,认证、权限、登陆都在里面;还有日志领域,专门为决策层制定月报告的一些功能;支付和审核领域,也是一个通用域,里面包含了创建账单和发票、收款等。 case领域,claim领域,assessment领域,repair领域等等,这几个是核心域,依次直接面对终端客户——保险方,索赔者,鉴定方,维修厂) 支撑域我还不是很理解,不知道在实际应用中,支撑域和通用域有哪些典型的有区别的例子。展开
作者回复: 个人感觉区分支撑域和通用域的意义不是太大。 挖掘出核心域是有意义的,主要是明确战略重点,将重要的核心资源投入到核心域。 支撑域和通用域在战略上基本上是同级的,有时候两者会转换。
共 3 条评论12 - TH2019-10-16终于理解了DDD是可以逐级细化的,大的DDD里应该是可以套小的DDD,也理解了核心域的意义。对于如何确定边界还存在疑问,希望在后面的课程中得到解答。 关于楼上朋友“子子域模型”的说法,其实只要定下一个大家都能理解的术语就行了,这跟DDD提倡的通用语言是一个道理。另外既然问题域可以逐级细化,那么在高层次看是子子域的范围,深入进去之后就成了“领域”,如果有必要的话也还可以在它下面再细分子域。不知这样理解对不对。展开
作者回复: 非常正确。
8 - Geek_88604f2019-11-20问题域和解决方案域是不是重合的呢
作者回复: 大多数是重合的,但是如果受外界因素影响比较大的话,可能会一个问题域对应多个解决方案域。也就是一个子域可能会有多个微服务。
6 - FelixFly2019-10-16这个领域的划分还是采用的是分治思想,分治过后产生各个子域,由于关注度和作用不同,对这些子域进行标识为核心域、通用域以及支撑域
作者回复: 是的,理解的很到位。
6 - 谭方敏2020-02-21我的理解是领域的划分需要根据所在公司的战略及商业模式这个原则来进行,拆分的方法可以用通用的逻辑工具:MECE(完全独立,相互穷尽)到最后,核心域,通用域,支撑域有很重要的现实意义,这样决定在不同域投入的IT资源的比例,另外对于核心域的把握尤为关键,一般开始有两个原则:1)实打实赚钱的,能产生现金流的,足球主攻手得分王;2)能加快现金流转的,虽然不赚钱,但是起到助攻作用的,比如足球助攻手,至于通用域和支撑域的区分就不显得那么重要了,如果真要说点啥的话,通用域就是可以复用程度比较高的域,而支撑域就是默默付出的域。展开
作者回复: 😄,比喻的很贴切。
6 - 微笑2019-12-16老师,公司是做sass bb2b商城,商品和订单与客户等级、客户紧密关联这样公司的核心域由多个域组成,我这样划分核心域感觉有问题 以下是领域划分: 1.用户域 2.商品域 3.订单域 4.库存域 5.租户域 6.租户应用 通用域:商品,库存,用户 核心域:用户域的客户+商品+订单 支撑域:租户,租户应用展开
作者回复: 核心域的划分最好结合公司的战略和商业模式,一般来说跟公司收入或者能够给公司收入带来很大帮助的业务域是核心域,是企业与其他同业有区别的核心竞争力。当然一般电商来讲的话,客户,商品和订单是支撑核心业务的业务域,当然可能还会有一些营销域等,需要公司比较大的投入。而通用域和支撑域相对比较接近,区分的意义不算太大。
共 3 条评论4 - 白开水有三种味道2019-10-21一个聚合是不是就是一个业务流程中剥离出来的“业务环节”
作者回复: 有一部分情况跟你说的业务环节类似。你可以这样打比方,若干个不同职责的人一起完成一件完整的事情,这些不同的人就是不同的实体或者值对象,完整的事情就是你业务环节里某一个完整业务逻辑。在聚合内将这些实体或值对象组织在一起完成共同的业务目标,这就是聚合。
4 - 起风了2019-10-16领域 简单理解就是指特定的 范围 或 区域,那是不是就可以认为领域其实就是我们要做事情的范围或区域,领域模型我认为就是 设计思想, 也可以理解为 解决方案, 比如现在需要将清结算系统进行微服务拆分,我们现在要做的就是来分析清结算整个系统的业务块,例如清分或结算 , 然后来梳理业务边界,可以简单的认为 领域 就是要在这个范围内要解决的业务问题域。通俗来将就是我们要解决问题的范围即可称之为领域。 2.2 子域 在了解 领域 后可以知道,业务问题域其实就是 子域, 子域 可以分为 清分 和 结算 等,也可以将 清分子域 作为领域,在进行分析清分业务块的业务进行 分域。我举的例子可能比较小,大家可以对应理解领域为 中台服务, 其中有 用户子域 , 交易子域 , 风控子域 , 清洁算子域 等。然后可以在清洁算子域中建立领域模型(清洁算业务模型),在进行子子域的划分,可以把每个子域中建立领域模型。 2.3 核心域 在之前已经将 领域界限 规定到了 清洁算系统, 子域包含 清分子域 , 结算子域, 对账子域,不同的人看到系统的核心并不一样,可能有人认为 清分子域是核心域,也会有人认为 对账子域是核心域,这个就是本身所处的位置和职责不同,导致 核心域不同。 2.4 通用域 通用域 就很好理解了, 反映到了我们的代码上就可以将公共服务作为 通用域 。这个公共服务其实就是全部子域中的其中一个子域。 例如鉴权系统。 2.5 支撑域 支撑域 我认为所存在的意义是为了支撑其他系统而存在但又不所有子域都可以使用的通用系统,都可以称之为 支撑域。 2.6 界限上下文 界限上下文 映射到业务层可以理解为是业务的边界或者系统的边界。 我理解的对嘛?展开
作者回复: 基本没什么问题。领域模型是由若干个领域对象以及业务行为组成的,也就是我们常说的业务模型。
4 - 技术修行者2020-10-31我们目前的解决方案大概分为四层:基础设施层、技术中台、业务中台、业务客户。我负责技术中台部分,向上层提供一些通用的基础服务,例如数据访问服务、消息队列服务、邮件服务等。 我有几个问题想请教一下。 1. 作为技术中台,其实很难和具体业务产生关联的,那么我们应该如何使用DDD呢? 2. 站在整个解决方案的高度看,我理解我现在做的就是通用域,那如果站在技术中台的角度,我应该怎样确定核心域呢?核心域是否一定要和业务相关联?展开
作者回复: DDD一般主要还是用于业务领域的边界和建立领域模型。而技术中台主要还是用于支撑业务中台的开发和运行,很难建立技术中台的领域模型,个人感觉似乎不太适合用DDD的方式来设计。如果您的技术中台适合建立领域模型,那就可以用DDD设计方法。 DDD的核心域、通用域以及支撑域是放在企业整体来考虑的,主要还是偏业务领域的属性划分。
3