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

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

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

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

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

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

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

    预测变化

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

        有一句谚语,“唯一不变的是变化”,每次设计方案都要考虑可扩展性。例如,架构师准备设计一个简单的后台管理系统,当架构师考虑用 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/18134740

相关文章

  • ansible模块 playbook
    推荐原生模块:大部分幂等性,能重复执行。常看所有模块:3k个https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html  找关键字常见重要模块:service selinux hosnamefilecopycronyumscriptshell 使用方式:1、命令行  :ansible all -mshe......
  • 账号和权限管理
    目录管理用户账号和组账号(1)Linux基于用户身份对资源访问进行控制:(2)用户账号文件/etc/passwd、/etc/shadow(1)添加用户账号-useradd(2)设置/更改用户口令(修改用户密码)-passwd(3)修改用户账号的属性(修改已存在的用户)-usermod(4)删除用户-userdel(5)用户账号的初始配置文件(3)组账号文件(1)添加组账......
  • 原型设计工具比较及实践
    一、对比分析原型设计工具的各自的适用领域及优缺点1.墨刀:适用领域:墨刀适用于快速原型设计和交互设计。优点:墨刀的界面简洁易用,学习曲线较低,支持多人协作和实时预览,方便团队协作。同时,墨刀还提供了云端存储和版本控制功能,方便设计师进行项目管理,提供丰富的模板和组件库,能够快......
  • 实验二
    任务一include<stdio.h>include<stdlib.h>include<time.h>defineN5intmain(){intnumber;inti;srand(time(0));for(i=0;i<N;++i){ number=rand()%65+1; printf("20238331%04d\n",number);}return0;}问题一:在一到六十五之......
  • 实验2
    实验一#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5intmain(){intnumber;inti;srand(time(0));for(i=0;i<N;++i){number=rand()%65+1;printf("20238331%04d\n",number);......
  • 30 天精通 RxJS (18):可观察运算符 - switchMap, mergeMap, concatMap
    今天我们要讲三个非常重要的operators,这三个operators在很多的RxJS相关的library的使用示例上都会看到。很多初学者在使用这些library时,看到这三个operators很可能就放弃了,但其实如果有把这个系列的文章完整看过的话,现在应该就能很好接受跟理解。OperatorsconcatMapconcat......
  • js混淆简介
      JS混淆技术通过降低JS程序的可读性来对网站进行取证分析。JavaScript(JS)混淆在流行网站中非常普遍。最近的研究表明,Alexa前10万个网站中95.90%的网站至少包含一个混淆的JS程序,混淆的JS程序给各种任务带来了挑战。JS混淆技术通过降低JS程序的可读性来阻止对网站源......
  • 校园二手交易平台
    以下是对墨刀、Axure和Mockplus这三种原型设计工具的比较:墨刀(MockingBot)适用领域:-主要针对移动应用和微信小程序的原型设计。-适合快速原型设计和迭代。优点:-简单易用,上手快,适合新手和有经验的设计师。-丰富的UI素材和模板,支持Sketch设计稿的导入。-支持多人实时......
  • 高校社团
    一、原型设计工具当涉及原型设计工具时,墨刀、Figma和InVision都是受欢迎的选择。下面是它们各自的适用领域和优缺点的比较:墨刀优点:在线协作:墨刀支持多人在线协作,团队成员可以实时共享和编辑项目,便于团队合作。简单易用:墨刀的界面简洁清晰,操作简单易上手,即使是初学者也可以快......
  • 目录和文件管理
    目录1.Linux目录结构(1)树形目录结构;2.查看及检索文件(1)查看文件内容-cat(2)查看文件内容-more(3)查看文件内容-less(4)查找文件内容-head、tail(5)统计文件内容-wc(6)检索和过滤文件内容-grep3.压缩及解压缩文件(1)压缩命令-gzip、bzip2(2)归档命令-tar通过tar命令制作压缩包,采用gzip程序进行压......