首页 > 其他分享 >复杂度来源------可扩展性

复杂度来源------可扩展性

时间:2024-04-13 14:57:24浏览次数:24  
标签:需要 可扩展性 复杂度 ------ 架构师 设计模式 变化

        软件系统复杂度的第三个来源可扩展性。

可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。

        由于软件系统固有的多变性,新的需求总会不断提出来,因此可扩展性显得尤其重要。在软件开发领域,面向对象思想的提出,就是为了解决可扩展性带来的问题;后来的设计模式,更是将可扩展性做到了极致。

        设计具备良好可扩展性的系统,有两个基本条件:正确预测变化完美封装变化。但要达成这两个条件,本身也是一件复杂的事情,我来具体分析一下。

    预测变化

         软件系统与硬件相比,有一个很大的差异:软件系统在发布后还可以不断地修改和演进,这就意味着不断有新的需求需要实现。如果新需求能够不改代码甚至少改代码就可以实现,那当然是皆大欢喜的,否则来一个需求就要求系统大改一次,成本会非常高,程序员心里也不爽(改来改去),产品经理也不爽(做得那么慢),老板也不爽(那么多人就只能干这么点事),因此作为架构师总是试图去预测所有的变化,然后设计完美的方案来应对.

        有一句谚语,“唯一不变的是变化”,每次设计方案都要考虑可扩展性。例如,架构师准备设计一个简单的后台管理系统,当架构师考虑用 MySQL 存储数据时,是否要考虑后续需要用 Oracle 来存储?当架构师设计用 HTTP 做接口协议时,是否要考虑要不要支持 ProtocolBuffer?甚至更离谱一点,架构师是否要考虑 VR 技术对架构的影响从而提前做好可扩展性?如果每个点都考虑可扩展性,架构师会不堪重负,架构设计也会异常庞大且最终无法落地。但架构师也不能完全不做预测,否则可能系统刚上线,马上来新的需求就需要重构,这同样意味着前期很多投入的工作量也白费了。

   综合分析,预测变化的复杂性在于:

  • 不能每个设计点都考虑可扩展性。
  • 不能完全不考虑可扩展性。
  • 所有的预测都存在出错的可能性。

对于架构师来说,如何把握预测的程度和提升预测结果的准确性,是一件很复杂的事情,而且没有通用的标准可以简单套上去,更多是靠自己的经验、直觉,所以架构设计评审的时候经常会出现为某个判断争得面红耳赤的情况,原因就在于没有明确标准,不同的人理解和判断有偏差,而最终又只能选择一个判断。

    应对变化

        假设架构师经验非常丰富,目光非常敏锐,看问题非常准,所有的变化都能准确预测,是否意味着可扩展性就很容易实现了呢?也没那么理想!因为预测变化是一回事,采取什么方案来应对变化,又是另外一个复杂的事情。

第一种应对变化的常见方案是将“变化”封装在一个“变化层”,将不变的部分封装在一个独立的“稳定层”

无论是变化层依赖稳定层,还是稳定层依赖变化层都是可以的,需要根据具体业务情况来设计。例如,如果系统需要支持 XML、JSON、ProtocolBuffer 三种接入方式,那么最终的架构就是上面图中的“形式 1”架构,也就是下面这样。

如果系统需要支持 MySQL、Oracle、DB2 数据库存储,那么最终的架构就变成了“形式 2”的架构了,你可以看下面这张图。

无论采取哪种形式,通过剥离变化层和稳定层的方式应对变化,都会带来两个主要的复杂性相关的问题。

    1. 系统需要拆分出变化层和稳定层

        对于哪些属于变化层,哪些属于稳定层,很多时候并不是像前面的示例(不同接口协议或者不同数据库)那样明确,不同的人有不同的理解,导致架构设计评审的时候可能吵翻天。

    2. 需要设计变化层和稳定层之间的接口

        接口设计同样至关重要,对于稳定层来说,接口肯定是越稳定越好;但对于变化层来说,在有差异的多个实现方式中找出共同点,并且还要保证当加入新的功能时原有的接口设计不需要太大修改,这是一件很复杂的事情。例如,MySQL 的 REPLACE INTO 和 Oracle 的 MERGE INTO 语法和功能有一些差异,那存储层如何向稳定层提供数据访问接口呢?是采取 MySQL 的方式,还是采取 Oracle 的方式,

        第二种常见的应对变化的方案是提炼出一个“抽象层”和一个“实现层”。抽象层是稳定的,实现层可以根据具体业务需要定制开发,当加入新的功能时,只需要增加新的实现,无须修改抽象层。这种方案典型的实践就是设计模式和规则引擎。考虑到绝大部分技术人员对设计模式都非常熟悉,我以设计模式为例来说明这种方案的复杂性。

以设计模式的“装饰者”模式来分析,下面是装饰者模式的类关系图。

图中的 Component 和 Decorator 就是抽象出来的规则,这个规则包括几部分:

1.Component 和 Decorator 类。 2.Decorator 类继承 Component 类。 3.Decorator 类聚合了 Component 类。

这个规则一旦抽象出来后就固定了,不能轻易修改。例如,把规则 3 去掉,就无法实现装饰者模式的目的了。

装饰者模式相比传统的继承来实现功能,确实灵活很多。例如,《设计模式》中装饰者模式的样例“TextView”类的实现,用了装饰者之后,能够灵活地给 TextView 增加额外更多功能,比如可以增加边框、滚动条、背景图片等,这些功能上的组合不影响规则,只需要按照规则实现即可。但装饰者模式相对普通的类实现模式,明显要复杂多了。本来一个函数或者一个类就能搞定的事情,现在要拆分成多个类,而且多个类之间必须按照装饰者模式来设计和调用。





上一章: 复杂度来源--高可用

下一章: 复杂度来源--可扩展性

归类: 从0开始学架构

标签:需要,可扩展性,复杂度,------,架构师,设计模式,变化
From: https://www.cnblogs.com/lz1996/p/18132851

相关文章

  • DiviDuelo
    https://codeforces.com/gym/105053/problem/D我发现了p^alpha=N,alpha%2!=0以及pq=N,(p,q为素数)的情况下先手玩家有必胜策略,然而我不知道如何用O(sqrt(N))的算法分解出上面的东西`#include<bits/stdc++.h>usingnamespacestd;std::vectorfactorize(intn){std......
  • 适用于智能电表、计量插座的高抗干扰液晶驱动芯片VK2C23A/B LCD液晶段码屏驱动芯片
    VK2C23是一个点阵式存储映射的LCD驱动器,可支持最大224点(56SEGx4COM)或者最大416点(52SEGx8COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,也可通过指令进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。L23+01特点:•工作电压2.4-5.5V•内......
  • 数据结构-链表
    数据结构-链表1.链表的基本概念:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(或指针)。2.单向链表:单向链表的每个节点只有一个指向下一个节点的链接。这种结构使得遍历只能单向进行,从头节点开始到尾节点结束。classNode:d......
  • 关于链接脚本和汇编导致的数据段初始化错误的问题
    第一个链接脚本存在data段初始化失败的问题,第二个link脚本增加了At>flash就可以正常的运行了,是为什么?如果只是链接错误的话,那么汇编从ram向同地址的ram中搬运为什么就会运行出错?链接脚本分别如下:有错误的类型MEMORY{flash(rxai!w):ORIGIN=0x20000000,LENGTH......
  • 下拉可进行模糊查询
    效果图:1、无默认值 2、可进行输入模糊查询 3、不进行查询可直接点击右侧部分整个下拉出现 <divclass="form-in"><labelclass="control-labellong">地区名称:......
  • leedcode-
    用二分法查找平方根:classSolution:defisPerfectSquare(self,num:int)->bool:#初始化左右边界left=1right=num#开始二分查找whileleft<=right:#计算中间值mid=left+(......
  • 基本概念(二):方差、协方差、相关系数 原点矩和中心矩
    方差期望反应的时均值概念,方差反应的则是数据的波动概念,为了防止±波动在求和过程中抵消以及防止求abs导致的不可导问题,我们使用平方来统计波动数据。随机变量的方差定义为:\[D(X)=E[(X-E(X))^2]\]对上式展开:\[D(X)=E\lbraceX^2-2XE(X)+E(X)^2\rbrace=\\E(X^2)-......
  • [计组] 计算机编码方式:原码、反码、补码
    原码、反码和补码是计算机中用来表示带符号整数的三种编码方式,它们在计算机内部的运算和表示过程中发挥重要作用。在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。1计算机编码方式:原码/反......
  • 数据结构基础概念
    数据结构基础概念数据结构概念数据结构是计算机科学中用于组织和存储数据的方式。它定义了数据之间的关系,提供了一组操作以访问和修改数据。选择合适的数据结构对于解决特定问题至关重要,不同的数据结构适用于不同的应用场景。以下是数据结构的基本概念:数据元素:数据结构中的基......
  • 固态硬盘价格疯涨50%!SSD要怎么买
    如果关注了存储的价格,那你一定会发现,最近存储尤其是SSD的价格有些离谱了。随便挑一款入门级1TB容量的SSD,就会发现从去年双11的300元到手,涨到了现在的450元,涨幅达到了50%之多,那现在还能买SSD吗?其实存储涨价早有端倪,在去年年末的时候就有分析师表示存储的价格会上涨10%-15%,没想到......