专门做钣金的网站,wordpress会员推广系统,网站建设攻略,wordpress dux1.4自适应尼恩说在前面#xff1a;
在40岁老架构师 尼恩的读者交流群(50)中#xff0c;最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格#xff0c;遇到很多很重要的面试题#xff1a; DDD 的外部接口调用#xff0c;应该放在…尼恩说在前面
在40岁老架构师 尼恩的读者交流群(50)中最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格遇到很多很重要的面试题 DDD 的外部接口调用应该放在哪一层 DDD架构如何落地 谈谈你的DDD落地经验 谈谈你对DDD的理解 如何保证RPC代码不会腐烂升级能力强? 微服务如何拆分 微服务爆炸如何解决 你们的项目DDD是怎么落地实操的 所以这里尼恩给大家做一下系统化、体系化的梳理使得大家可以充分展示一下大家雄厚的 “技术肌肉”让面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案收入咱们的 《尼恩Java面试宝典PDF》V155版本供后面的小伙伴参考提升大家的 3高 架构、设计、开发水平。
除了本文尼恩输出了一个 《DDD学习圣经》系列帮助大家彻底掌握DDD。
同时尼恩持续输出最新的《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF请关注本公众号【技术自由圈】获取后台回复领电子书
蚂蚁面试真题说说DDD聚合和MYSQL表的对应关系是什么
这是尼恩社群一个小伙伴面蚂蚁遇到的。
他没有回答好这里个大家做个系统化、体系化、结构化的梳理
首先说说什么是聚合
“聚合”即“高内聚低耦合”中的“内聚”之意
聚合是业务和逻辑紧密关联的实体和值对象组合而成聚合是数据修改和持久化的基本单元一个聚合对应一个数据的持久化
聚合在DDD分层架构中属于领域层领域层包含了多个聚合共同实现核心业务逻辑聚合内的实体以充血模型实现个体业务能力以及业务逻辑的高内聚 跨多个实体的业务逻辑通过领域服务来实现跨多个聚合的业务逻辑通过应用服务来实现
首先我们来看下聚合模式的定义: 将实体和值对象划分为聚合并围绕着聚合定义边界。 选择一个实体作为每个聚合的根并仅允许外部对象持有对聚合根的引用。作为一个整体来定义聚合的属性和不变量并把其执行责任赋予聚合根或指定的框架机制。 一个聚合包含一个聚合根aggregation root和一些相关的其他领域对象。
然后说说什么是聚合根
在《DDD学习圣经》中我们讲到了“什么是聚合根”这里再重复一下。
聚合根中的“聚合”即“高内聚低耦合”中的“内聚”之意
而“根”则是“根部”的意思也即聚合根是一种统领式的存在。
事实上并不存在一个教科书式的对聚合根的理论定义你可以将聚合根理解为一个系统中最重要最显著的那些名词这些名词是其所在的软件系统之所以存在的原因。
为了给你一个直观的理解以下是几个聚合根的例子
在一个电商系统中一个订单Order对象表示一个聚合根在一个CRM系统中一个客户Customer对象表示一个聚合根在一个银行系统中一次交易Transaction对象表示一个聚合根
你可能会问软件中的概念已经很多了为什么还要搞出个聚合根的概念
我们认为这里至少有2点原因
聚合根遵循了软件中“高内聚低耦合”的基本原则聚合根体现了一种模块化的原则模块化思想是被各个行业所证明的可以降低系统复杂度的一种思想。所谓的DDD是“软件核心复杂性应对之道”也即这个意思它将软件系统在人脑中所呈现地更加有序和简单让人可以更好地理解和管控软件系统。
在实际项目中识别聚合根时我们需要对业务有深入的了解因为只有这样你才知道到底哪些业务逻辑是内聚在一起的。
这也是我们一直建议程序员和架构师们不要一味地埋头于技术而要多关注业务的原因。
事实上如果让一个从来没有接触过DDD的人来建模十有八九也能设计出上面的订单、客户和交易对象出来。
没错DDD绝非什么颠覆式的发明依然只是在前人基础上的一种进步而已这种进步更多的体现在一些设计原则上对此我们将在下文进行详细阐述。
最后说说Domain聚合和MYSQL数据表的对应关系是什么
Domain 聚合属于领域建模
MYSQL 数据表设计属于 DB建模
注意从理论上来说 DB建模(数据表建模)和领域建模没有关系二者在处于不同的 设计阶段
领域建模处于 概要设计阶段 理清楚业务的内外边界业务的内外流程成果物为 HLD 概要设计文档。DB建模 处于 详细设计阶段 理清楚业务的“关系数据模型”进而推导出“物理数据模型”成果物为 LLD 详细设计文档。
具体如下图 DDD建模的四个标准动作具体请参见 尼恩《DDD学习圣经》以及配套视频。 数据建模的经典方法就是 E-R Model建模 而当我们做MYSQL E-R建模的时候我们需要考虑
需要建什么主表 - 可以类比为对象 当然也有些表只是为了关系映射表里面需要什么列 - 可以类比为这对象所需的属性需要什么关联 - 表现数据对象与数据对象之间的联系
当然E-R Model是数据模型的一种表现形式(数据建模不只是E-R Model一种表现形式) E-R Model以数据为中心关注的是对象的实体和关系建模时并不考虑Entity的行为。
在E-R概念模型的基础上可以建立“关系数据模型”进而推导出“物理数据模型”这是一条以E-R Model为起始的数据建模的路线
ER模型分为实体、属性、关系三个核心部分。实体是长方形体现而属性则是椭圆形关系为菱形。 ER模型的实体entity即数据模型中的数据对象例如人、学生、音乐都可以作为一个数据对象用长方体来表示每个实体都有自己的实体成员entity member或者说实体对象entity instance例如学生实体里包括张三、李四等实体成员entity member/实体实例entity instance 不需要出现在ER图中。
ER模型的属性attribute即数据对象所具有的属性例如学生具有姓名、学号、年级等属性用椭圆形表示属性分为唯一属性 unique attribute和非唯一属性唯一属性指的是唯一可用来标识该实体实例或者成员的属性用下划线表示一般来讲实体都至少有一个唯一属性。
ER模型的关系relationship用来表现数据对象与数据对象之间的联系例如学生的实体和成绩表的实体之间有一定的联系每个学生都有自己的成绩表这就是一种关系关系用菱形来表示。 ER模型中关联关系有三种
1对11:1 1对1关系是指对于实体集A与实体集BA中的每一个实体至多与B中一个实体有关系反之在实体集B中的每个实体至多与实体集A中一个实体有关系。 1对多1:N 1对多关系是指实体集A与实体集B中至少有N(N0)个实体有关系并且实体集B中每一个实体至多与实体集A中一个实体有关系。 多对多M:N 多对多关系是指实体集A中的每一个实体与实体集B中至少有M(M0)个实体有关系并且实体集B中的每一个实体与实体集A中的至少NN0个实体有关系。
在数据建模中通常将E-R Model就称之为概念数据模型接下来的层面是关系数据模型和物理数据模型
而Domain 建模是属于对象建模、业务建模的范畴Domain 聚合和MYSQL 数据表 二的区别是职责不同 ER建模关心数据如何存储Domain 对象建模需要为对象建立职责对象的行为。
当然Domain 建模 和E-R Model的分析具有很大的相似性
在一些极为简单的业务系统、业务场景中二者可以做简单的映射 Domain 模型里边 聚合根 可以映射到 E-R Model的 主表 Domain 模型里边 普通实体、值对象 可以映射到 E-R Model的 关联表 问题1微服务一定要DDD为什么TDD和DDD 有何关系
具体答案请参见此文 https://mp.weixin.qq.com/s/80Gza3-9pO8bYlSJoEDVWg
问题2DDD架构如何落地
具体答案请参见此文 https://mp.weixin.qq.com/s/_NAHYDIvmT7EbffXkIpqYw
问题3DDD 领域层该如何设计
具体答案请参见此文https://mp.weixin.qq.com/s/njBl791vFCd94UplPJEFKw
问题4微服务如何拆分原则是什么
具体答案请参见此文 https://mp.weixin.qq.com/s/bExjRkVbDLTV2Wf9G6dzrg
问题5给一个需求请用DDD设计出来
具体答案请参见此文 https://mp.weixin.qq.com/s/izzUXIpVmURq6hTCEN0ARQ
参考文献
尼恩特别编著 《DDD学习圣经》
《阿里DDD大佬从0到1带大家精通DDD》
《阿里大佬DDD 落地两大步骤以及Repository核心模式》
《阿里大佬DDD 领域层该如何设计》
《极兔面试微服务爆炸如何解决Uber 是怎么解决2200个微服务爆炸的》
《阿里大佬DDD中Interface层、Application层的设计规范》
《字节面试请说一下DDD的流程用电商系统为场景》
《DDD如何落地去哪儿的DDD架构实操之路》
《DDD落地从腾讯视频DDD重构之路看DDD极大价值》
《DDD落地从美团抽奖平台看DDD在大厂如何落地》
《美团面试微服务如何拆分原则是什么》
《DDD神药去哪儿结合DDD实现架构大调优》
《DDD落地从网易新闻APP重构看DDD的巨大价值》
《DDD落地从阿里单据系统看DDD在大厂如何落地》
《DDD落地有赞的生产项目DDD如何落地》
《DDD落地从携程订单系统重构看DDD的巨大价值》
《DDD落地京东的微服务生产项目DDD如何落地》
《DDD落地从阿里商品域看DDD在大厂如何落地》
《240Wqps美团用户中台 如何使用DDD架构》
《DDD落地爱奇艺打赏服务如何DDD架构》
《大厂痴迷DDD从高德portal重构看DDD的巨大价值》
《高开面试给一个需求请用DDD设计出来》
《大厂痴迷DDD从高德portal重构看DDD的巨大价值》
说在最后有问题找老架构取经
DDD 相关的面试题是非常常见的面试题。也是核心面试题。
以上的内容如果大家能对答如流如数家珍基本上 面试官会被你 震惊到、吸引到。
最终让面试官爱到 “不能自已、口水直流”。offer 也就来了。
在面试之前建议大家系统化的刷一波 5000页《尼恩Java面试宝典》V174在刷题过程中如果有啥问题大家可以来 找 40岁老架构师尼恩交流。
另外如果没有面试机会可以找尼恩来帮扶、领路。
大龄男的最佳出路是 架构 管理大龄女的最佳出路是 DPM 女程序员如何成为DPM请参见
DPM 双栖陪跑助力小白一步登天升格 产品经理研发经理
领跑模式尼恩已经指导了大量的就业困难的小伙伴上岸。
前段时间领跑一个40岁就业困难小伙伴拿到了一个年薪100W的offer小伙伴实现了 逆天改命 。
另外尼恩也给一线企业提供 《DDD 的架构落地》企业内部培训目前给不少企业做过DDD 的内部咨询和培训效果非常好。 尼恩技术圣经系列PDF
《NIO圣经一次穿透NIO、Selector、Epoll底层原理》《Docker圣经大白话说Docker底层原理6W字实现Docker自由》《K8S学习圣经大白话说K8S底层原理14W字实现K8S自由》《SpringCloud Alibaba 学习圣经10万字实现SpringCloud 自由》《大数据HBase学习圣经一本书实现HBase学习自由》《大数据Flink学习圣经一本书实现大数据Flink自由》《响应式圣经10W字实现Spring响应式编程自由》《Go学习圣经Go语言实现高并发CRUD业务开发》
……完整版尼恩技术圣经PDF集群请找尼恩领取 《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF请到下面公号【技术自由圈】取↓↓↓