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

news2024/12/23 13:26:40

系统间的七种关系

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

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

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

共享内核(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.coloradmin.cn/o/1265973.html

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

相关文章

9.Spring 整合 Redis

引入依赖:spring-boot-starter-data-redis配置 Redis:配置数据库参数、编写配置类,构造 RedisTemplate访问 Redis: redisTemplate.opsForValue() redisTemplate.opsForHash() redisTemplate.opsForList() redisTemplate.opsForSe…

vue3默认插槽、具名插槽以及作用域插槽实现父子组件通信

默认插槽与具名插槽 父组件 <template><div><h1>我是父组件</h1><child><div style"color: red">我是从父元素插入的值(默认插槽)</div><template #juming><div style"color: green">我是从父元素…

2023亚马逊云科技re:Invent,在开发者板块探究如何利用技术重塑业务

美国当地时间11月27日&#xff0c;一年一度的亚马逊云科技re:Invent大会在美国拉斯维加斯盛大开幕。这场全球云计算领域的前沿盛会&#xff0c;已连续12年成为引领行业的风向标。那么本次2023亚马逊云科技re:Invent大会又有哪些可玩、可看的新项目&#xff0c;下面就一起来瞧一…

评价体系如何构建?

本文将针对权重计算的一些常见问题进行说明&#xff1a;如组合赋权法的综合权重值如何计算&#xff1f;多层级权重如何计算&#xff1f;用多种方法计算得到的权重如何合并为综合权重用于之后的分析&#xff1f;常见的不同权重计算方法的搭配方式&#xff1f; 一、九种权重计算…

(2)(2.1) Lightware SF40/C(360度)

文章目录 前言 1 安装SF40c 2 连接自动驾驶仪 3 通过地面站进行配置 4 参数说明 前言 Lightware SF40/C 360 度激光雷达(Lightware SF40/C 360degree lidar)可在 Copter-3.4 及更高版本的 Loiter 模式下用于物体回避。 &#xff01;Warning 该功能尚未在各种情况下进行过…

网络运维与网络安全 学习笔记2023.11.28

网络运维与网络安全 学习笔记 第二十九天 今日目标 OSPF汇总之域间路由、OSPF汇总之外部路由、OSPF链路认证 OSPF安全认证之区域认证、OSPF虚链路 OSPF汇总指域间路由 项目背景 企业内网运行多区域的OSPF网络&#xff0c;在R1 上存在多个不稳定的链路 R1上的不稳定链路&a…

如何与LEONI建立EDI连接?

莱尼LEONI是一家为汽车及其他行业提供能源数据管理产品、解决方案及服务的全球供应商。供应链范围从研发生产标准化电缆、特种电缆和数据电缆到高度复杂的布线系统和相关组件。本文将介绍如何与莱尼LEONI建立EDI连接。 什么是EDI&#xff1f; EDI全称Electronic Data Interch…

linux(2)之buildroot使用手册

Linux(2)之buildroot配置toolchain Author&#xff1a;Onceday Date&#xff1a;2023年11月27日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Buildroot - Making Embedded Linux Easy 文章目录 Linux(2)之buildroot配置toolchain1. 构建配置1.1 配置config生成…

Spring之AOP理解与应用(更新中)

1. AOP的认识 面向切面编程&#xff1a;基于OOP基础之上新的编程思想&#xff0c;OOP面向的主要对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点&#xff0c;AOP提供了非常强…

【Python小游戏】推荐8款自由的Python游戏项目

推荐8款自由的Python游戏项目 今天给大家推荐8款不错的Python小游戏&#xff0c;这些小游戏所有项目文件&#xff08;包括所需的所有代码、图像和音频文件&#xff09;&#xff0c;给大家已经放到平台的下载频道&#xff0c;需要的可以注意一下文末的链接地址。 下面给大家简单…

Matlab进阶绘图第34期—双三角热图

在《Matlab进阶绘图第29期—三角热图》中&#xff0c;我分享过三角热图的绘制模板。 然而&#xff0c;有的时候&#xff0c;为了节省版面或者方便对比等&#xff0c;需要在一张图上绘制两个三角热图的组合形式&#xff0c;且每个三角热图使用不同的配色方案&#xff0c; 由于…

C++ 红黑树的封装

一.map/set的封装 在实现了红黑树的部分功能后&#xff0c;我们可以便可以将红黑树作为底层结构来封装map 和 set &#xff0c;但是问题也随之而来。我们都知道map是k-v的数据模型&#xff0c;而set是k的数据模型&#xff0c;我们难道要去使用两棵红黑树来封装吗&#xff1f;显…

2023年汉字小达人市级比赛最后一天的整体复习建议和5个提醒

今天是2023年11月29日&#xff0c;明天&#xff08;11月30日&#xff0c;星期四&#xff09;就是2023年汉字小达人市级活动&#xff08;市级比赛&#xff09;比赛的日子了。从孩子今天16点30放学&#xff0c;到明天16点开始比赛&#xff0c;除去生活时间、写学校作业&#xff0…

echarts图表滚动条带动页面窗口滚动条的问题

网上搜了很多方法不管用&#xff0c;后来发现每次滚动echarts或者左右滑动echarts下方都会报错&#xff0c;报错提示如下&#xff0c;看看你们的图表是否这样报错&#xff1a; 报错信息如下&#xff1a;Unable to preventDefault inside passive event listener invocation 原…

什么是Geo Trust OV证书

一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书&#xff0c;它是一种支持OpenSSL的数字证书&#xff0c;具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商&#xff0c;为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…

在Springboot中操作Redis——五大数据类型

在Java中操作Redis Redis的Java客户端 前面我们讲解了Redis的常用命令&#xff0c;这些命令是我们操作Redis的基础&#xff0c;那么我们在java程序中应该如何操作Redis呢&#xff1f;这就需要使用Redis的Java客户端&#xff0c;就如同我们使用JDBC操作MySQL数据库一样。 Red…

pgsql 更新A表的x字段通过查询b表的z字段

查询表t_local_warning_hit_source的send_time 更新到表t_local_warning_source WITH t2 AS ( SELECT ID, send_time FROM t_local_warning_hit_source WHERE send_time > 2023-09-27 00:00:00 AND send_time < 2023-11-28 00:00:00 ) UPDATE t_local_warning_source t…

Web学习笔记

Web学习笔记 flask库前端基础超链接&#xff1a;空连接&#xff1a;图片&#xff1a;视频&#xff08;音频&#xff09;&#xff1a;嵌套使用列表表格格式化表格input表单系列 网络请求GET方式POST请求通过GET方式获取输入参数通过POST方式获取输入参数注册页面 CSS三种使用方式…

leetcode:2133. 检查是否每一行每一列都包含全部整数(python3解法)

难度&#xff1a;简单 对一个大小为 n x n 的矩阵而言&#xff0c;如果其每一行和每一列都包含从 1 到 n 的 全部 整数&#xff08;含 1 和 n&#xff09;&#xff0c;则认为该矩阵是一个 有效 矩阵。 给你一个大小为 n x n 的整数矩阵 matrix &#xff0c;请你判断矩阵是否为一…