架构简洁之道有感,谈谈软件组件聚合的张力

0896bc89d432d95e40c99054236bfc05.jpeg

配图由腾讯混元助手生成

这篇文章介绍了软件架构设计中组件设计思想,围绕“组件间聚合的张力”这个有意思的角度,介绍了概念,并且结合架构设计示例对这个概念进行了进一步阐述。

组件聚合?张力?这标题,有种字都认识,但连在一起就看不懂的感觉。但别着急,往下看就知道了。

虽然类似的思想我们可能也都看过,或者已经在使用了,但我觉得这个描述很有意思,还是花点时间再记录下。

什么是软件组件

组件是软件的部署单元,是整个软件系统在部署过程中可以独立完成部署的最小实体。

组件聚合或者拆分的基本原则

芒格给自己的投资活动列了一些基本原则,每次投资活动时都会搬出来,作为一个检查清单,来审视投资活动。

组件设计上,以及之前软件模块设计上,这些设计原则也是类似作用。当我们做架构设计时,可以把这些原则搬出来对比看看。

三个与构建组件相关的基本原则:

1.REP:复用/发布等同原则 软件复用的最小粒度应等同于其发布的最小粒度。不遵守的话,组件可能很难被复用。

2.CCP:共同闭包原则 将由于相同原因而修改,并且需要同时修改的东西放在一起。将由于不同原因而修改,并且不同时修改的东西分开。不遵守的话,即使简单的变更可能都会影响到许多组件。

3.CRP:共同复用原则 不要强迫一个组件的用户依赖他们不需要的东西。不遵守的话,可能会引起很多不必要的发布。

什么叫组件聚合的张力

上述三个原则之间彼此存在着竞争关系。REP和CCP原则是黏合性原则,它们会让组件变得更大,而CRP原则是排除性原则,它会尽量让组件变小。软件架构师的任务就是要在这三个原则中间进行取舍。

这是一张组件聚合三大原则的张力图,图的边线所描述的是忽视对应原则的后果。

3d9819ade3855a9aa97b83da753895d7.png

只关注REP和CRP的软件架构师会发现,即使是简单的变更也会同时影响到许多组件。相反,如果软件架构师过于关注CCP和REP,则会导致很多不必要的发布。

优秀的软件架构师应该能在上述三角张力区域中定位一个最适合目前研发团队状态的位置,同时也会根据时间不停调整。

例如在项目早期,CCP原则会比REP原则更重要,因为在这一阶段研发速度比复用性更重要。一般来说,一个软件项目的重心会从该三角区域的右侧开始,先期主要牺牲的是复用性。然后,随着项目逐渐成熟,其他项目会逐渐开始对其产生依赖,项目重心就会逐渐向该三角区域的左侧滑动。

换句话说,一个项目在组件结构设计上的重心是根据该项目的开发时间和成熟度不断变动的,我们对组件结构的安排主要与项目开发的进度和它被使用的方式有关,与项目本身功能的关系其实很小。

说两个事例

单体服务与微服务

后端服务架构上的单体服务和微服务就是类似的。早期功能还不那么复杂,这时候搞个单体服务就够用;随着业务规模扩大和需求增加,这时候单体服务的缺点也暴露出来,可能一点微小的变更都需要进行全局发布,这时候就拆分成了多个微服务。

ac714714d485c8d5fa1e9e62f20a8770.jpeg

最近刚好看到一篇腾讯文档的文章《回归单体成为潮流?腾讯文档如何实现灵活架构切换》。

腾讯文档在 C 端场景中,以微服务的形式部署在 TKEx 平台上;而在私有化场景,将微服务合并成少数几个单体服务。

cc898813284dfbcb301176072771c8b6.jpeg

腾讯文档的这个自动化操作还是挺有意思。不过本质上它的组件还是拆开的,只是在部署形态上合在一起了。

控制面与转发面分离

我自己最近一个项目中,也有类似的示例。初期设计的是网关-控制器的架构,这里的网关既承担了控制面的功能,又负责转发面的事情,在初期没什么问题。可随着业务需求的发展,控制面和转发面都加了越来越多的功能,这时候团队考虑转控分离,控制面独立出一个agent来交付,网关单纯负责转发面事务。这样的好处也显而易见,避免频繁的变更,也起到了爆炸隔离的效果。

小结

回过头来看,大家其实或多或少都接触过这些思想。只是bob大叔用了张力这个表述,足够骚气。领教了。


IoT小能手twowinter的其他精彩文章:

* 动手创造

13块钱DIY微信小程序远程浇花神器

自制一个 LoRa PM2.5 监测器

语音控制智能家居的抽风小仓鼠

* 技术分享

LoRaEdge LR1120 卫星直连通信解读

深度报道 第1个从太空发回的LoRa信号(含视频)

无线节点的空中唤醒技术解析

* 多元学习

文档啊,最重要的还是层次感

你没中过勒索病毒,不知道备份有多重要

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

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

相关文章

华为HCIP认证H12-821题库下

26、6.交换技术核心知识 (单选题)某交换机运行RSTP协议,其相关配置信息如图所示,请根据命令配置情况指出对于Instance 1,该交换机的角色是: A、根交换机 B、非根交换机 C、交换机 D、无法判断 正确答案是&…

本地计算机连接两个Github账号

两个Github账号与本地计算机连接 注册Github账号Git的下载与安装生成SSH密钥为Github账户设置SSH Key编辑config文件连接Github仓库其它命令 注册Github账号 注册两个Github账号。这一步很简单,跟注册其它账号差不多。 Git的下载与安装 下载地址:http…

在C++中->运算符

在C中,->是一个运算符,称为成员访问运算符(Member Access Operator)。它用于通过指针访问对象的成员(变量或函数)。 下面是对->运算符的详细解释: 语法: pointer->member …

汽车锁行业分析:市场销量接近1700万台

汽车防盗锁根据技术原理基本上可划分为三类:机械防盗锁、电子防盗报警锁、联网的防盗抢(定位、跟踪)系统。汽车发动机防盗逻辑,点火开关打开时,钥匙转发器与防盗控制器形成首次信息交汇,钥匙与芯片互会识别码不同,防盗…

SQAlchemy 第二篇

使用数据库元数据 SQLAlchemy 中数据库元数据最常见的基础对象称为 MetaData、Table和Column。下面的部分将说明如何在面向 Core 的风格和面向 ORM 的风格中使用这些对象。 使用表对象设置元数据 当我们使用关系数据库时,我们查询的数据库中的基本数据保存结构称…

php使用OpenCV实现从照片中截取身份证区域照片

<?php // 获取上传的文件 $file $_FILES[file]; // 获取文件的临时名称 $tmp_name $file[tmp_name]; // 获取文件的类型 $type $file[type]; // 获取文件的大小 $size $file[size]; // 获取文件的错误信息 $error $file[error]; // 检查文件是否上传成功 if ($er…

Linux 服务管理和配置

这篇主要是围绕 systemd 的管理和配置&#xff0c;有新的认识会持续更新 一、服务管理 Centos 7 及后续版本 systemd # 无需重启&#xff0c;重新加载服务 一般用于配置文件变更后 systemctl reload daemon # 服务的开机自启动管理 systemctl enable/disable daemon # 服务状…

阶段五:深度学习和人工智能(学习人工智能的应用领域,如自然语言处理,计算机视觉等)

Python是人工智能领域最流行的编程语言之一&#xff0c;它具有简单易学、功能强大、库丰富等优点&#xff0c;因此在自然语言处理、计算机视觉等领域得到了广泛应用。 自然语言处理 自然语言处理是人工智能领域的一个重要分支&#xff0c;它主要研究如何让计算机理解和处理人…

Matlab绘图添加背景色,动态添加背景

Matlab绘图添加背景色&#xff0c;动态添加背景 有没有小伙伴想过绘制这种有背景的曲线图呢&#xff1f;因为矩形是背景&#xff0c;所以要先绘制&#xff0c;然后再绘制曲线&#xff0c;因此&#xff0c;最先想到的思路可能是&#xff1a;先绘制三个背景矩形&#xff0c;然后填…

编译Sqlite3记录

下载源文件&#xff1a; 下载地址&#xff1a;SQLite Download Page 打开QtCreator创建新的工程&#xff0c;选择纯C工程&#xff0c;将main.c删除&#xff0c;将下载的源码解压后的文件复制到并添加到工程中&#xff0c;其中的文件包括&#xff1a;sqlite3ext.h、sqlite3.h、…

云原生之深入解析网络服务Istio、eBPF和RSocket Broker

一、服务治理 ① “服务治理”简介 在微服务时代&#xff0c;一个复杂的应用程序被分解为多个组件化、协作和连接的单元&#xff0c;服务往往会承担越来越多的业务责任&#xff0c;这使得服务治理的难度前所未有&#xff0c;仅仅依靠微服务框架级的治理是不够的&#xff0c;构…

vivado约束方法4

时序约束向导 定时约束向导确定合成或上缺少的定时约束实现的设计。它分析了网表、时钟网络连接和现有的定时限制&#xff0c;以便根据《超快设计方法指南》提供建议用于FPGA和SoC&#xff08;UG949&#xff09;。以下11涵盖了三类约束页面&#xff0c;然后是摘要。包括以下步…

uni-app地图标点展示

使用微信小程序框架编写的。它包含一个模板部分和一个脚本部分。 模板部分: <template>: 这是微信小程序中用来定义页面结构的标签。<view>: 微信小程序的基本组件&#xff0c;用来展示内容或布局。<view class"page-body">: 定义了一个页面主体部…

【论文解读】ICLR 2024高分作:ViT需要寄存器

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2309.16588 摘要&#xff1a; Transformer最近已成为学习视觉表示的强大工具。在本文中&#xff0c;我们识别并表征监督和自监督 ViT 网络的特征图中的伪影。这些…

福德机械:植保无人机的领航者

亲爱的读者们&#xff0c;欢迎来到福德机械的神奇世界。在这个充满活力和创新的世界里&#xff0c;我们专注于植保无人机的发展与应用&#xff0c;以实现农业现代化、智能化和高效化的目标。植保无人机&#xff0c;作为一种高效、环保和安全的农业工具&#xff0c;已经逐渐成为…

VR播控系统深耕VR教学领域,助力开启未来新课堂

作为提升教育质量的技术之一&#xff0c;VR技术已经逐渐成为培养新一代人才、提升教学质量的重要方式&#xff0c;相比于传统教育&#xff0c;VR技术在教学方面的应用&#xff0c;所带来的变化和效果提升都是非常明显的&#xff0c;尤其是VR播控系统的上线&#xff0c;作为VR教…

HTML---初识CSS

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS&#xff0c;开发者可以在不改变HTML标记结构的情况…

Verilog HDL数据类型

1 网络型&#xff08;net型&#xff09;数据 两种驱动方式&#xff1a;在结构描述中将其连接到一个门元件或模块的输出端&#xff1b;或用assign语句对其赋值。 【例】分别调用Verilog HDL提供的门元件和采用assign语句设计一个二输入与非门 input a,b; …

ElasticSearch - networking配置global

版本8.11 单机部署了一个节点 在elasticsearch.yml中 配置了network.host: 8.8.8.8(之前为127.0.0.1) 但启动服务失败 报错信息为: BindTransportException: Failed to bind to 8.8.8.8:[9300-9399] 为啥要配置8.8.8.8 是因为参考的官方说明 Networking | Elasticsearch Gu…

机器学习——特征预处理

【说明】文章内容来自《机器学习入门——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 特征预处理就是对数据进行集成、转换、规约等一系列处理&#xff0c;使之适合算法模型的过程。 sklearn提供了preprocessing模块&#xff0c;用于归一化、标准化、鲁棒化、…