DDD建模系列(二)

简介: DDD建模系列(二)

一:DDD的历史

①:领域驱动设计(简称DDD)历史悠久。

②:领域驱动设计最初由Eric Evans提出,2004年著名建模专家eric evans(埃里克埃文斯)发表的她最具影响力的书籍:<<domain-driven design-tackling complexity in the heart of software>>(中文译名:领域驱动设计一软件核心复杂性应对之道)一书。标志着DDD这种设计和架构方法的诞生。

③:传统的数据驱动架构设计:我们日常的开发中,经常针对一些功能点争论:这个功能不应该我改,应该是你那边改。最终被妥协改了之后都改不明白为什么这个功能要在自己这边改。而领域驱动设计DDD也许在这个时候能够帮助你做到清晰的划分。

④:多年以来一直停留在理念阶段,然而,真正能实现并且落地的项目和公司少之又少。近年来,包括阿里在内的很多大厂,都在大力推行DDD的设计方法。

⑤:它主要可以帮助我们解决传统单体式,集中式,大泥球架构难以快速响应业务需求落地的问题,并且针对中台和微服务盛行的场景做出指导。

⑥:DDD为我们提供的架构设计的方法论,既面向技术也要面向业务,从业务的角度,自顶向下来把握设计方案。

二:DDD的巨大价值

①:统一思想:统一项目各方业务,产品,开发对问题的认知,明确组织当中产品,业务,架构,开发的角色和如何配合。通过统一的语言,明确的定义。统一方方面面的理解误差和理解分歧。DDD工具链能够帮助进一步强化能力逻辑的表达,借助DDD可视化流程构建专业知识库,能够快速提升产品和技术,技术和技术之间的沟通效率。帮助开发同学快速,直观的了解业务,进而提高技术同学对业务有快速/全局了解,反向帮助开发能够方便把握细节,降低反复,返工,甚至推导重来的概率。

②:动态建模:需求是不断变化的,传统HLD,LLD建模的核心思想是静态建模,缺乏有效的动态建模方法论和工具。DDD通过从领域事件,领域命令触发对领域对象进行建模,可以真实的反映这些变化,更好的通过边界划分将复杂的业务领域简单化,将隐藏的业务显性化,隐式流程显性化,隐式字段显性化。帮助我们设计出清晰的领域边界,准确的业务流程,可以很容易地实现业务和技术统一的架构演进。

③:拉通“断层”:传统的需求常常是一句话需求,模型设计常常是工程师负责,工程师的设计路径是库表驱动+界面驱动,结合常规MVC三层架构进行自底向上的设计,完美的实现了业务人员和编码人员断层,需求和开发隔离的目标。DDD拉通了业务和编码,对常规MVC开发模式做了一个反转,以业务为主导,自顶向下的进行领域模型设计,拉通业务和编码之间的巨大断层,使得代码更能反馈业务,反哺业务,提升代码逻辑的准确度和生命值。

业务人员和编码人员隔离的原因:轻设计,重编码。一句话需求,敏捷迭代,很容易把代码弄得杂乱无章,混乱不堪。

④:彻底“反腐”:首先是领域模型与数据模型分离,用领域模型来界定哪些需求在什么地方实现,保持结构清晰,隔离数据模型,存储模型的变化和腐败。除了数据模型,咱们应用中有许多容易腐败的操作,比如直接的外部依赖,例如:Mybatis的Mapper类,HttpClient注入,RocketMQ的监听,缓存的直接操作等。DDD通过防腐层的架构设计,实现业务代码的彻底防腐败。

简单来说:

1:反腐败设计:从一半业务+一半技术,提升到业务代码和基础设施解耦。

2:反腐败设计,使得领域代码更有业务纯度。

同时,DDD帮助沉淀各领域的业务,标准化的流程链路,各领域间无耦合,沉淀的领域能力能够很好的复用。粗粒度的应用能力能基于细粒度领域能力去构建,构建好的能力可以在其他场景直接复用,提高开发效率,最终提升领域代码的生命力,复用力。

⑤:提升“测维扩”能力:可维护性=当依赖变化时,有多少代码需要随之改变,传统的MVC三层架构,面临各种库升级,依赖服务升级,中间件升级,jar包冲突,微服务框架升级,存储扩容升级等依赖变化工作,需要从上到下,每一层的代码都要动,可维护性差。

可扩展性=做新需求或改逻辑时,需要新增/修改多少代码,在库表驱动开发,库表驱动的架构开发流程中,一般做第一个需求都非常的快,但是由于代码复用性低,越做到后面,做第N个需求时需要的时间很有可能呈指数级上升的,绝大部分时间花费在老功能的重构和兼容上,最终你的创新速度会跌为0,促使老应用被推翻重构。

可测试性=运行每个测试用例所花费的时间*每个需求所需要增加的测试用例数量。在库表驱动开发,库表驱动架构的开发流程中,由于设施搭建困难,用例笨重运行耗时长,业务耦合度高用例爆炸等原因,业务代码很难有比较好的测试覆盖,而绝大部分的业务代码在上线前的测试属于人肉的集成测试,低测试率导致我们对代码质量很难有把握,容易错过边界条件,异常case只有线上爆发了才被动发现。

最终这个应用变成了一个不敢升级,不敢部署,不敢写新功能,并且随时会爆发的炸弹,终有一天会给你带来惊喜。

DDD根本上解决上面的问题,提升“测维扩”能力。

⑥:降本增效:以爱奇艺DDD落地案例为例,其会员业务部门在打赏业务中实践DDD后,取得了以下显著成果:新需求接入开发成本节约20%,更换底层中间件开发成本节约20%,项目熟悉成本节约30%(对DDD有基本了解为前提);单测开发成本指数级降低;上线风险,成本降低。

相关文章
|
8天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
4天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2464 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
4天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1503 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19274 29
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18822 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17515 13
Apache Paimon V0.9最新进展
|
6天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
368 11
|
1月前
|
存储 人工智能 前端开发
AI 网关零代码解决 AI 幻觉问题
本文主要介绍了 AI Agent 的背景,概念,探讨了 AI Agent 网关插件的使用方法,效果以及实现原理。
18697 16
|
2天前
|
算法 Java
JAVA并发编程系列(8)CountDownLatch核心原理
面试中的编程题目“模拟拼团”,我们通过使用CountDownLatch来实现多线程条件下的拼团逻辑。此外,深入解析了CountDownLatch的核心原理及其内部实现机制,特别是`await()`方法的具体工作流程。通过详细分析源码与内部结构,帮助读者更好地理解并发编程的关键概念。
|
2天前
|
SQL 监控 druid
Druid连接池学习
Druid学习笔记,使用Druid进行密码加密。参考文档:https://github.com/alibaba/druid
195 82