DDD 系统间的七种关系梳理与实践

系统间的七种关系

本节将根据耦合度从高到低逐一探讨这些关系。耦合度高有时并不是坏事,它能够让团队内部的系统更加内聚,而不是无法整合的碎块。我们应该根据具体情况进行选择。

因为系统间关系往往也是组织架构的反映,此处每种关系除了描述其相关的技术架构,本节也将描述其适用的组织架构。

七种系统间关系全部来源于《领域驱动设计》原著内容的总结和拓展。

共享内核(Shared Kernel)

系统间共享部分模型和相关逻辑,是最亲密的合作关系。

当负责这两个系统的团队存在非常紧密的合作关系(甚至就是同一个团队),并且业务上十分相似时,共享内核就是一个不错的选择。在职责上,即使共享内核有专门的 owner,其任何修改都需要经过多方探讨,因为其中的任何模型更改都会深刻地影响这几个系统。

最典型的就是业务系统以及业务相关的批量导入导出系统,两者虽然因为技术原因(隔离消耗资源的任务)被划分成了两个系统,但是它们的模型理论上应该完全共享的(即共享内核),这样才能保证业务上的修改及时反映到导入导出中。试想如果这种场景还用 ACL 做隔离的话,每次业务系统修改,还需要同步在导入导出模型中做修改,这将是非常麻烦的。

客户-供应方(Customer-Supplier)

两个系统虽然相对独立发展,但是底层系统(Supplier, 供应方)愿意为上层系统(Customer, 客户)的需求负责,并且做对应的变更。这也是一种非常亲密的合作关系,只比共享内核弱一点。

因为两个系统在实现时会互相考虑对方,此时两者交互部分的模型会非常相似,相比共享内核,它只共享一些模型,不共享逻辑代码。

遵奉者(Conformist)

两个系统完全独立发展,底层系统因为没有人力或者其他原因,不可能因为上层系统的需求做出任何变更。这与下文 ACL 适用的情况类似。

上层系统的模型设计与底层系统的模型严格地保持一致,虽然也是需要一个转换层转换,但是没有做任何“真正”的转换,最多只是简单的属性拷贝,这是和 ACL 的主要区别,ACL 会做更加复杂的转换。

防腐层(ACL)

ACL 对应的组织架构与遵奉者类似。

ACL 适合两种情况:

● 同样的概念在两个系统中有不同的含义:“用户”概念在 IM 中就是消息发起接受方,但是在钉钉通讯录中却是指某个组织内的、含有职位,角色等信息的职员
● 模型相差巨大:比如 excel 表格和钉钉文档中的表格

ACL 是指复杂的数据转换层,在转换数据时需要做概念上的翻译。

另谋它路(Separate Way)

“最好”的解耦方法就是完全另写一套代码。

这有点像阿里现在 “拆中台” 的思路,研究了半天,发现依赖复杂的中台,还不如业务团队自己写一套简单的系统实现。

这已经不能算是系统间关系了,是 “完全没有关系” 的意思。

开放主机服务(Open Host Service)与发布语言(Published Language)

直接举例,底层服务开放一个 Http 接口(开放主机服务),允许以 json 的数据格式(发布语言)进行调用。

它们其实就是开放 RPC 调用。他们被单独列出来完全是因为 《领域驱动设计》这本书成书较早,互联网软件比较少,RPC 也没有特别特别规范的标准。在微服务时代,限界上下文的调用几乎都通过 RPC 进行,并且使用 Hsf, Dubbo 等 RPC 框架将发布语言封装在最底层。这也是我将本条放在最后一个的原因。

总结

软件工程追求的终极目标就是 “高内聚,低耦合”,翻译成两个正面的指标就是内聚和解耦:

● 共享内核:内聚度最高,解耦最差
● ACL:内聚度最低,解耦最强
在这里插入图片描述

这张图恰恰反映了软件工程没有银弹的道理,通过梳理系统间关系,合理的控制系统的内聚与耦合程度,才是项目架构的难点所在。

ACL 被滥用的原因在于开发者将自己写的一小部分代码像“伊甸园”一样保护起来,这是比较简单的处理方式,但是如果要梳理如何和现有业务与系统结合,却要付出大量精力。这就导致系统过度“解耦”,以至于同一个团队维护的业务系统却给调用方一种支离破碎的感觉。

因此是否引入 ACL 要根据两个系统当前情况和未来规划决定,如果满足下面的一条到两条:

● 同一个团队维护
● 属于同一个业务
● 模型差别不大
● 短时间内目标相同,不需要完全独立发展

其中的一到两条。此时可以考虑暂时不引入 ACL,而是采用共享内核,或者客户-供应商来处理系统间关系。

但是这条定律也只能作为参考,还是需要结合现实中对于内聚与解耦的需求决定,毕竟软件工程中唯一的定律就是没有定律。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日,冷喷涂技术及其在增材制造中的应用专题会在襄阳召开,来自国内外200多名科技工作者齐聚一堂,共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办,湖北超卓航空科技股份有限公司…

【EasyExcel实践】导出多个sheet到多个excel文件,并压缩到一个zip文件

文章目录 前言正文一、项目依赖二、封装表格实体和Sheet实体2.1 表格实体2.2 Sheet实体 三、核心实现3.1 核心实现之导出为输出流3.2 web导出3.3 导出为字节数组 四、调试4.1 构建调试用的实体类4.2 控制器调用4.3 测试结果 五、注册大数转换器,长度大于15时&#x…

webGL开发虚拟实验室

开发虚拟实验室是一个具有挑战性但也非常有趣和有价值的任务。通过 WebGL,你可以创建交互式、沉浸式的虚拟实验室,使用户能够进行实验和学习。以下是一些步骤和关键考虑因素,帮助你开始开发虚拟实验室,希望对大家有所帮助。北京木…

Unity 通过代码控制Texture进行缩放

在实际应用开发中&#xff0c;有时候需要通过代码对Texture进行缩放。 有两个方法&#xff0c;一个是通过控制宽高进行缩放&#xff0c;另一个是通过比例值进行等比例缩放。 1、控制宽高的方法&#xff1a; /// <summary>/// 纹理缩放方法一&#xff0c;指定宽高/// &…

游戏开发原画的设计方法

游戏原画设计是游戏开发中至关重要的一环&#xff0c;因为它直接影响到游戏的视觉吸引力和用户体验。以下是一些常见的游戏原画设计方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 理解游戏概念&…

如何在Python中操作Redis数据库

目录 一、安装redis-py库 二、连接Redis数据库 三、执行操作 1、设置和获取键值对 2、删除键值对 3、获取列表数据 四、处理数据 1、使用哈希表&#xff08;Hash&#xff09;处理关联数据 2、使用列表&#xff08;List&#xff09;处理有序数据 3、使用集合&#xff…

XIAO ESP32S3之AI应用

一、XIAO ESP32S3 AI应用示例 包含 ChatGPT语音助手、关键字识别等 英文:https://wiki.seeedstudio.com/xiao_esp32s3_speech2chatgpt/ 中文:SenseCraft 模型助手部署 | Seeed Studio Wiki 二、XIAO开发板TinyML项目展示 各种XIAO开发板基于Tiny ML的演示项目:XIAO 系列教…

链接共享平台LinkStack

什么是 LinkStack &#xff1f; LinkStack 是一个独特的平台&#xff0c;为在线管理和共享链接提供了高效的解决方案。平台提供了一个类似于 Linktree 的网站&#xff0c;它可以让用户克服社交媒体平台上只能添加一个链接的限制。借助 LinkStack&#xff0c;用户可以轻松链接到…

Jetson AGX XAVIER刷机时提示invalid_request - Authorization flow not allowed

我下的版本是sdkmanager_1.9.2-10899_amd64.deb&#xff0c;安装后后直接在terminal输入 sdkmanager&#xff0c;出来后提示登录有问题&#xff0c;跳到浏览器链接 http://localhost:8080/?error_descriptionAuthorizationflownotallowed&statehttp://localhost:41369&a…

shell_exec 和 exec区别

shell_exec 和 exec 都是用于在 PHP 中执行系统命令的函数&#xff0c;但它们之间有一些区别。 返回值类型&#xff1a;shell_exec 函数返回命令的输出结果作为字符串&#xff0c;而 exec 函数将输出结果存储在数组中。 输出结果&#xff1a;shell_exec 函数返回命令的完整输出…

录音模块:WT588FM01高性能录音语音芯片IC,功能丰富,音质卓越,满足多样化需求

在音频市场日益繁荣的今天&#xff0c;用户对于录音模块的需求也日益多样化。唯创知音针对这一市场趋势&#xff0c;推出了高性能录音语音芯片模块WT588FM01。凭借其远距离录音、优质音质以及多样化的功能&#xff0c;它成为了众多电子产品中的首选之一。 WT588FM01是深圳唯创…

8 有损压缩的.jpg图片文件格式详解,解封装拆包

有损压缩的.jpg文件 作者将狼才鲸创建日期2023-11-28 1&#xff09;简述 JPEG文件描述 JPEG协议格式分为JPEG、渐进式JPEG&#xff08;图片先显示一部分再显示全部&#xff09;、JPEG2000&#xff08;压缩品质更好&#xff0c;压缩率更高&#xff09;压缩模式&#xff1a;顺序…

苹果mac屏幕投屏镜像工具AirServer2024

airserver 是什么软件&#xff1f;AirServer 是一款 Airplay Mac屏幕镜像应用&#xff0c;AirServer可以通过 mac 实时接收iPhone、iPad以及Android设备的实时屏幕画面。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器。在您的大屏幕上启用 AirServer …

Databend 开源周报第 121 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持追加流 Da…

11月27日,每日信息差

今天是2023年11月27日&#xff0c;以下是为您准备的20条信息差 第一、阿里达摩院AI突破胰腺癌早筛难题。通过平扫CT&#xff0c;在2万多真实世界连续病人群体中发现了31例临床漏诊病变&#xff0c;其中2例早期胰腺癌病患已完成手术治愈 第二、丰田汽车将于11月29日恢复丰田车…

python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中&#xff0c;我们可以了解到对象可以使用内置信号&#xff0c;这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。 需求 现在有一个需求&#xff0c;有两个UI界面“untitled.ui”和“u…

深度解析异常值在数据分析中的重要性与应对策略

写在前面 在数据分析的过程中&#xff0c;异常值的存在常常是一个需要认真对待的问题。异常值可能影响分析的准确性&#xff0c;导致误导性的结论。本文将深入探讨以下异常值的应对策略&#xff0c;旨在为数据科学家们提供全面、易读、严谨的一些建议。 1.什么是异常值 异常…

Linux 安装 Minio 配置 HTTPS

安装 创建目录 [roott2 local]# mkdir minio [roott2 local]# cd minio [roott2 minio]# mkdir data下载 [roott2 minio]# wget https://dl.min.io/server/minio/release/linux-amd64/minio [roott2 minio]# chmod x minio # 赋权设置账号密码 minio 默认账号密码为 minio…

如何集成一个TypeScript开发环境?

首先要安装个node.js。Node.js (nodejs.org) 然后我们随便建一个文件夹&#xff0c;并且打开它运行到终端 然后再运行命令&#xff1a; npm install typescript -g 成功后 尝试使用 tsc -v 查看版本 接下来再使用命令&#xff1a; tsc --init 我们在.ts文件中尝试输出一些…

.mat格式文件是什么?及将png,jpg,bmp,gif,tiff,psd等格式图片转为.mat格式(附代码)

很多深度学习网络的输入要求为.mat格式&#xff0c;当然也可以直接修改输入数据的代码&#xff0c;比如修改为使用OpenCV读取图片等&#xff0c;但有些网络修改起来比较麻烦&#xff0c;且.mat数据有很多优势&#xff0c;所以部分网络最好还是用默认的.mat格式数据 目录 一、.…