系统架构师考点--软件架构的演化和维护

news2025/1/11 21:55:14

大家好。今天来总结一下软件架构的 演化和维护。这部分内容属于新增内容,之前未曾考过,可能会在论文中出现,在上午场客观题出现几率不大,可能会占分。

一、软件架构演化和定义

软件架构的演化和维护就是对架构进行修改和完善的过程,目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等,是一个不断选代的过程,直至满足用户需求。

本质上讲,软件架构的演化就是软件整体结构的演化,演化过程涵盖软件架构的全生命周期包括软件架构需求的获取、软件架构建模、软件架构文档、软件架构实现以及软件架构维护等阶段。

软件架构演化的重要性体现在:一是架构是整个系统的骨架,是软件系统具备诸多好的特性的保障;二是软件架构作为软件蓝图为人们宏观管控软件系统的整体复杂性和变化性提供了一条有效途径。

软件架构的演化能降低软件演化的成本的原因:

(1)对系统的软件架构进行的形式化、可视化表示提高了软件的可构造性,便于软件演化。

(2)软件架构设计方案涵盖的整体结构信息、配置信息、约束信息等有助于开发人员充分考虑未来可能出现的演化问题、演化情况和演化环境。

(3)架构设计时对系统组件之间的耦合描述有助于软件系统的动态调整。

软件架构的定义包含组件、连接件、约束三大要素,这类软件架构演化主要关注的就是这三者之间的添加、修改和删除等。

二、面向对象软件架构演化

对象演化

在顺序图中,组件的实体是对象,会对架构设计的动态行为产生影响的演化只包括 Add0bject(A0)Delete0bject(D0) 两种。

A0 表示在顺序图中添加一个新的对象。这种演化一般是在系统需要添加新的对象来实现某种新的功能,或需要将现有对象的某个功能独立以增加架构灵活性的时候发生。

D0 删除顺序图中现有的一个对象。这种演化一般在系统需要移除某个现有的功能,或需要合并某些对象及其功能来降低架构的复杂度的时候发生。

消息演化

将消息演化分为 AddMessage(AM)、DeleteMessage(DM)、SwapMessage0rder (SMO)、OverturnMessage(OM)、ChangeMessageModule (CMM) 5种。

AM 增添一条新的消息, 产生在对象之间需要增加新的交互行为的时候。

DM 删除当前的一条消息产生在需要移除某个交互行为的时候,是AM 的逆向演化。

SMO交换两条消息的时间顺序,发生在需要改变两个交互行为之间关系的时候。

OM 反转消息的发送对象与接收对象,发生在需要修改某个交互行为本身的时候。

CM 改变消息的发送或接收对象,发生在需要修改某个交互行为本身的时候。

复合片段演化

复合片段是对象交互关系的控制流描述,表示可能发生在不同场合的交互,与消息同属于连接件范畴。复合片段的演化分为AddFragment(AF)、DeleteFragment(DF)、FragmentTypeChange(FTC)FragmentConditionChange(FCC)

FCC 改变复合片段内部执行的条件,发生在改变当前控制流的执行条件时。自动机中与控制流执行条件相对应的转移包括两个,一个是符合条件时的转移,另一个是不符合条件时的转移,因此每次发生FFC 演化时会同时修改这两个转移的触发事件。

AF 在某几条消息上新增复合片段,发生在需要增添新的控制流时。复合片段所产生的分支是不同类型的。

DF 删除某个现有的复合片段,发生在需要移除当前某段控制流时。DF 与AF 互为逆向演化过程。

FTC 改变复合片段的类型,发生在需要改变某段控制流时。类型演化意味着交互流程的改变,一般伴随着条件、内部执行序列的同时演化,可以视为复合片段的删除与添加的组合。

约束演化

约束演化即直接对约束信息进行添加和删除。

AC(Add Constraint)直接添加新的约束信息,会对架构设计产生直接的影响,需要判断当前设计是否满足新添加的约束要求。

DC(Delete Constraint)直接移除某条约束信息,发生在去除某些不必要条件的时候,一般而言架构设计均会满足演化后的约束。

三、软件架构演化方式分类

3种典型的分类方法

(1)按照软件架构的实现方式和实施粒度分类:基于过程和函数的演化、面向对象的演化、基于组件的演化和基于架构的演化。

(2)按照研究方法将软件架构演化方式分为4类:第1类是对演化的支持,如代码模块化的准则、可维护性的指示(如内聚和祸合)、代码重构等;第2类是版本和工程的管理工具;第3类是架构变换的形式方法,包括系统结构和行为变换的模型,以及架构演化的重现风格等;第4类是架构演化的成本收益分析,决定如何增加系统的弹性。

(3)针对软件架构的演化过程是否处于系统运行时期,可以将软件架构演化分为静态演化和动态演化。

软件架构的演化时期包括:设计时演化、运行前演化、有限制运行时演化、运行时演化

软件架构的静态演化

软件架构静态演化主要是在设计时演化以及运行前演化。与此相对应的维护方法有3类:更正性维护、适应性维护和完善性维护。

软件的静态演化一般包括如下5个步骤:

软件理解:查阅软件文档,分析软件架构,识别系统组成元素及其之间的相互关系,提取系统的抽国象表示形式。

需求变更分析:静态演化往往是由于用户需求变化、系统运行出错和运行环境发生改变等原因所引国起的,需要找出新的软件需求与原有的差异。

演化计划:分析原系统,确定演化范围和成本,选择合适的演化计划。

系统重构:根据演化计划对系统进行重构,使之适应当前的需求。

系统测试:对演化后的系统进行测试,查找其中的错误和不足之处。

一次完整软件架构演化过程可以看作经过一系列原子演化操作组合而成。所谓原子演化操作是指基于UML 模型表示的软件架构,在逻辑语义上粒度最小的架构修改操作。每经过一次原子演化操作架构会形成一个演化中间版本。

架构演化的可维护性度量基于组件图表示的软件架构,在较高层次上评估架构的某个原子修改操作对整个架构所产生的影响。这些原子修改操作包括增加/删除模块间的依赖、增加/删除模块间的接口、增加/删除模块、拆分/聚合模块等。

架构演化的可靠性评估基于用例图、部署图和顺序图,分析在架构模块的交互过程中某个原子演化操作对交互场景的可靠程度的影响。这些原子修改操作包括增加/除消息、增加/删除交互对象、增加/删除/修改消息片段、增加/删除用例执行、增加/删除角色等。

软件架构的动态演化

动态演化是在系统运行期间的演化,需要在不停止系统功能的情况下完成演化,较之静态演化更加困难。具体发生在有限制的运行时演化和运行时演化阶段。

架构的动态演化主要来自两类需求:

①软件内部执行所导致的体系结构改变,例如许多服务器端软件会在客户请求到达时创建新的组件来响应用户需求。

②软件系统外部的请求对软件进行的重配置,例如操作系统在升级时无须重新启动,在运行过程中就完成对体系结构的修改。

软件的动态性分为3个级别:

①交互动态性,要求数据在固定的结构下动态交互。

②结构动态性,允许对结构进行修改,通常的形式是组件和连接件实例的添加和删除,这种动态性是研究和应用的主流。

③架构动态性,允许软件架构的基本构造的变动,即结构可以被重定义,如新的组件类型的定义。

根据所修改的内容不同,软件的动态演化主要包括以下4个方面:

属性改名:目前所有的ADL都支持对非功能属性的分析和规约,而在运行过程中,用户可能会对这些指标进行重新定义(如服务响应时间)。

行为变化:在运行过程中,用户需求变化或系统自身服务质量的调节都将引发软件行为的变化。

拓扑结构改变:如增删组件,增删连接件,改变组件与连接件之间的关联关系等。

风格变化:一般软件演化后其架构风格应当保持不变,如果非要改变软件的架构风格,也只能将架构风格变为其衍生风格,如两层C/S到三层C/S。

目前,实现软件架构动态演化的技术主要有两种:采用动态软件架构(DSA)和进行动态重配置(DR)。

DSA 是指在运行时刻会发生变化的系统框架结构,允许在运行过程中通过框架结构的动态演化实现对架构的修改。

DR 从组件和连接件的配置入手,允许在运行过程中增删组件,增删连接件修改连接关系等操作。

实现软件架构动态演化的基本原理:使DSA 在可运行应用系统中以一类有状态、有行为、可操作的实体显式地表示出来,并且被整个运行环境共享,作为整个系统运行的依据。也就是说,运行时刻体系结构相关信息的改变可用来触发、驱动系统自身的动态调整。

系统必须提供SA动态演化的一些相关功能:保存当前软件架构信息的功能、设置监控机制监视系统有无需求变化、保证演化操作原子性。

DSA 实施动态演化大体遵循以下4 步:

①捕捉并分析需求变化。

②获取或生成体系结构演化策略。

③根据步骤2得到的演化策略,选择适当的演化策略并实施演化。

④演化后的评估与检测。

基于软件动态重配置的软件架构动态演化主要是指在软件部署之后对配置信息的修改常常被用于系统动态升级时需要进行的配置信息修改。一般来说,动态重配置可能涉及的修改有:

①简单任务的相关实现修改。

②工作流实例任务的添加和删除。

③组合任务流程中的个体修改。

④任务输入来源的添加和删除。

⑤任务输入来源的优先级修改。

⑥组合任务输出目标的添加和删除。

⑦组合任务输出目标的优先级修改等。

动态重配置模式: 主从模式、中央控制模式、客户端/服务器模式、分布式控制模式。

四、软件架构演化原则

  1. 演化成本控制原则。
  2. 进度可控原则。
  3. 风险可控原则。
  4. 主体维持原则:保证软件系统主体行为稳定。
  5. 系统总体结构优化原则。
  6. 平滑演化原则:演化速率趋于稳定。
  7. 目标一致原则。
  8. 模块独立演化原则。
  9. 影响可控原则。
  10. 复杂性可控原则。
  11. 有利于重构原则。
  12. 有利于重用原则。
  13. 设计原则遵从性原则:判断架构设计原则是否被破坏。
  14. 适应新技术原则。
  15. 环境适应性原则。
  16. 标准侬从性原则。
  17. 质量向好原则。
  18. 适应新需求原则。

五、软件架构演化评估方法

根据演化过程是否已知可将评估过程分为:演化过程已知的评估和演化过程未知的评估。

演化过程已知的评估其目的在于通过对架构演化过程进行度量,比较架构内部结构上的差异以及由此导致的外部质量属性上的变化,对该演化过程中相关质量属性进行评估。

架构演化评估的执行过程如图所示。图中A0和An表示一次完整演化前后的相邻版本的软件架构。每经过一次原子演化,即可得到一个架构中间演化版本Ai。对每个中间版本架构进行度量,得到架构Ai的质量属性度量值qi。D(i-1,i)是版本间的质量属性距离。

v

基于度量的架构演化评估方法,其基本思路在于通过对演化前后的软件架构进行度量比较架构内部结构上的差异以及由此导致的外部质量属性上的变化。具体包括:架构修改影响分析、监控演化过程、分析关键演化过程。

当演化过程未知时,我们无法像演化过程已知时那样追踪架构在演化过程中的每一步变化,只能根据架构演化前后的度量结果逆向推测出架构发生了哪些改变,并分析这些改变与架构相关质量属性的关联关系。
图片

六、大型网络架构演化

主要解决大数据和高并发的问题

第一阶段:单体架构。
图片

第二阶段:垂直架构。
图片

第三阶段:使用缓存改善网站性能。

第四阶段:使用服务集群改善网站并发处理能力。

第五阶段:数据库读写分离。

第六阶段:使用反向代理和CDN加速网站响应。

第七阶段:使用分布式文件系统和分布式数据库系统。

第八阶段:使用NoSQL和搜索引擎。

第九阶段:业务拆分。

第十阶段:分布式服务。

图片

七、软件架构维护

软件架构维护过程一般涉及架构知识管理、架构修改管理和架构版本管理。

软件架构知识管理是对架构设计中所隐含的决策来源进行文档化表示,进而在架构维护过程中帮助维护人员对架构的修改进行完善的考虑,并能够为其他软件架构的相关活动提供参考。

架构知识的定义:架构知识=架构设计+架构设计决策。即需要说明在进行架构设计时采用此种架构的原因。

架构知识管理侧重于软件开发和实现过程所涉及的架构静态演化,从架构文档等信息来源中捕捉架构知识,进而提供架构的质量属性及其设计依据以进行记录和评价。

在软件架构修改管理中,一个主要的做法就是建立一个隔离区域保障该区域中任何修改对其他部分的影响比较小,甚至没有影响。为此,需要明确修改规则、修改类型,以及可能的影响范围和副作用等。

软件架构版本管理为软件架构演化的版本演化控制、使用和评价等提供了可靠的依据,并为架构演化量化度量奠定了基础。

好了,今天就总结到这里了。

风大正是扬帆时,奋楫逐浪向未来。加油!

最后依旧是请希望大家能给作者点个关注,谢谢大家!各位老板有钱的捧个人场,没钱的也捧个人场,谢谢各位老板!

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

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

相关文章

jmeter-beanshell学习15-输入日期,计算前后几天的日期

又遇到新问题了,想要根据获取的日期,计算出前面两天的日期。网上找了半天,全都是写获取当天日期,然后计算昨天的日期,照葫芦画瓢也没改出来想要的,最后求助了开发同学。 先放上网上获取当天,计…

使用Canal监听Binlog将数据发送到RocketMQ

文章目录 一、部署RocketMQ二、部署MySQL1、开启mysql的binlog写入功能2、创建一个有相关权限的mysql slave账号 三、部署 Canal1、修改conf/canal.properties配置文件2、修改conf/example/instance.properties配置文件 四、实际操作 一、部署RocketMQ win11 部署RocketMQ 和可…

u盘sd卡格式化怎么恢复数据:从绝望到希望的全面指南

在数字时代,U盘和SD卡已成为我们日常生活中不可或缺的数据存储设备。然而,一不留神的格式化操作,往往会导致重要数据的瞬间消失,让人倍感焦虑与无助。那么,面对这一突如其来的数据灾难,我们是否只能束手就擒…

大模型套壳祛魅:质疑套壳,理解套壳

过去的 2023 年是大模型元年,在国产大模型数量狂飙突进的同时——已经超过 200 个,「套壳」一直是萦绕在大模型头上的舆论阴云。 从年初到年末,从百度文心一言到零一万物,从字节跳动到谷歌 Gemini,各种「涉嫌套壳」的…

案例精选 | 南大港产业园区卫生计生管理服务中心日志系统建设方案

南大港产业园区,坐落于中国河北省沧州市东南部,是一个集工业生产、科技研发、商贸物流、生态居住等多功能于一体的国内知名综合性产业园区。作为区域经济发展的重要引擎,不仅承载着产业升级的重任,还肩负着提升公共服务水平、保障…

刷题了:513.找树左下角的值|112. 路径总和| 113. 路径总和ii|106.从中序与后序遍历序列构造二叉树|105.从前序与中序遍历序列构造二叉树

513.找树左下角的值 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www.bilibili.com/video/BV1424y1Z7pn/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_s…

install第三方jar中包含私服依赖,导致项目无法构建

起因:新公司项目引入了一个发短信的jar包,我使用下列命令安装到本地库。 mvn install:install-file -DfileD:\workspace\\resources\WEB-INF\lib\xxxx.sdk.sms-0.0.1-SNAPSHOT.jar -DgroupIdxxxx.sdk.sms -DartifactIdxxxx.sdk.sms-0.0.1-SNAPSHOT -Dv…

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理,和NIO里ByteBuffer区别? Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类,专门设计来处理字节数据,…

大模型笔记4 长文本滑动窗口

Extractive QA参考: https://juejin.cn/post/7180925054559977533 https://huggingface.co/learn/nlp-course/en/chapter7/7 目录 滑动窗口例子(提取开始结束点任务) 滑动窗口代码实现 tokenize() 默认添加问题 每个滑窗添加标题和摘要 训练label跨滑窗情况token匹配 …

MyBatis开发: XML配置⽂件

前言 在IDEA的yml文件注释发现乱码 1.配置文件注释中文显示乱码 退出重进,发现不是乱码就成功 一.MyBatis XML配置⽂件 学习了注解的⽅式, 接下来我们学习XML的⽅式. 使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL…

使用Langchain构建简单的数据库Agent

这篇文章我们介绍一个使用LangChain实现SQLagent的方法,LangChain直接内置了自己的SQLagent实现-—SQLDatabaseChain。这个方法使用 SQL Alchemy 与数据库交互。感兴趣的可以考虑一下这两个方案是否可以融合,这样保证SQL的准确性从而提升最终结果的准确率…

修改依赖库

修改依赖库 在开发时,当我们发现使用的依赖库有 bug,需要修改,一般都有这几种处理方式: fork 源码,修复 bug 然后提交 pr,等待作者合并,发布新版本提 issue 等待作者修复(跟方式1类…

从物理学到电气工程:如何自学PLC进入工厂担任助理工程师?

本科物理专业自学 PLC 方向,有机会进厂担任助理电气工程师,但可能会面临一些挑战。在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「PLC的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“…

reactive函数

承上启下 在上一节 ref() 函数中,我们大致理解了 ref() 函数的作用是用来将数据转化为响应式的。但是对于基本类型和引用类型,Vue3底层做的转换不一致:对于基本类型,Vue3 通过 ref() 函数将变量转化为了 RefImpl引用对象从而实现响…

NVIDIA把Llama-3的上下文长度扩展16倍,长上下文理解能力超越GPT-4

在 Llama-3.1 模型发布之前,开源模型与闭源模型的性能之间一直存在较大的差距,尤其是在长上下文理解能力上。 大模型的上下文处理能力是指模型能够处理的输入和输出 Tokens 的总数。这个长度有一个限制,超过这个限制的内容会被模型忽略。一般…

Power功效分析之均值差原理及案例实操分析

Power功效分析常用于实验研究时样本量的计算(或功效值计算),实验研究中均值差的使用较多,具体包括单样本t检验、独立样本t检验、配对t检验、单样本z检验、Mann-whitey检验和配对符号秩和检验等,具体如下表格所述&#…

最新版的,SpringBoot整合Sharding-Jdbc实现读写分离

Sharding-Jdbc实现读写分离 Hello,兄弟们好,我是Feri,最近整理了最新的基于Seata-Server2.0实现分布式事务的demo,希望对你有所帮助,有任何问题,可以随时沟通交流,在成为技术大牛的路上&#xf…

校园点餐系统

1 项目介绍 1.1 摘要 在这个被海量信息淹没的数字化时代,互联网技术以惊人的速度迭代,信息的触角无处不在,社会的脉动随之加速。每一天,我们都被汹涌而至的数据浪潮包裹,生活在一个全方位的数字信息矩阵中。互联网的…

vue3解析markdown文件为html并且高亮显示代码块

前言: 很多时候我们程序员写的文档都是以markdown为主,但是我们每次找相关资料极为不便,如果能直接把markdown文档引进vue项目里,解析成html并且展示出来,然后部署在服务器上,查看是不是极为方便呢。&…