首页 > 其他分享 >【架构】架构复杂度来源之扩展性

【架构】架构复杂度来源之扩展性

时间:2022-11-04 23:24:25浏览次数:81  
标签:架构 预测 可扩展性 复杂度 扩展性 架构师 设计模式 变化

复杂度来源前面已经讲了高性能高可用,今天来聊聊可扩展性。

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

由于软件系统固有的多变性,新的需求总会不断被提出来,因此可扩展性显得尤其重要。在软件开发领域,面向对象思想的提出,就是为了解决可扩展性带来的问题;后来的设计模式,更是将可扩展性做到了极致。得益于设计模式的巨大影响力,几乎所有的技术人员对于可扩展性都特别重视。

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

预测变化

软件系统与硬件或者建筑相比,有一个很大的差异:软件系统在发布后还可以不断地修改和演进,这就意味着不断有新的需求需要实现。如果新需求能够不改代码甚至少改代码就可以实现,那当然是皆大欢喜,否则来一个需求就要求系统大改一次,成本会非常高,改来改去导致研发人员心里很不爽,因频繁修改带来的时间成本使产品经理也不爽,那么多人就只能干这么点事让老板也不爽。因此作为架构师,我们总是试图去预测所有的变化,然后设计完美的方案来应对,当下一次需求真正来临时,架构师可以自豪地说:这个我当时已经预测到了,架构已经完美地支持,只需要一两天工作量就可以了!

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

同时,「预测」这个词,本身就暗示了不可能每次预测都是准确的,如果预测的事情出错,我们期望中的需求迟迟不来,甚至被明确否定,那么基于预测做的架构设计就没起到什么作用,投入的工作量也就白费了。

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

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

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

应对变化

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

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

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

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

img

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

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

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

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

接口设计同样至关重要,对于稳定层来说,接口肯定是越稳定越好;但对于变化层来说,在有差异的多个实现方式中找出共同点,并且还要保证当加入新的功能时原有的接口设计不需要太大修改,这是一件很复杂的事情。例如,MySQLREPLACE INTOOracleMERGE INTO语法和功能有一些差异,那存储层如何向稳定层提供数据访问接口呢?是采取MySQL的方式,还是采取Oracle的方式,还是自适应判断?如果再考虑DB2的情况呢?相信你看到这里就已经能够大致体会到接口设计的复杂性了。

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

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

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

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

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

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

规则引擎和设计模式类似,都是通过灵活的设计来达到可扩展的目的,但「灵活的设计」本身就是一件复杂的事情,不说别的,光是把23种设计模式全部理解和备注,就是一件很困难的事情。

思维导图:

标签:架构,预测,可扩展性,复杂度,扩展性,架构师,设计模式,变化
From: https://www.cnblogs.com/xhb-bky-blog/p/16857537.html

相关文章

  • Oracle Unifier 系统架构简述(安装部署)
     关于OraclePrimaveraUnifier的应用架构,其实在我之前的博客已有介绍相关内容​​谈谈OracleP6,Unifier和其他应用系统间的联系从官方文档方面,其实在《unifier_perf......
  • 软考系统架构师倒计时第1天
    2020年系统架构师考试科目二:案例分析一某公司拟开发一套在线软件开发系统,支持用户通过浏览器在线进行软件开发活动。该系统的重要功能,包括我的编辑,语法高亮提示,代码编频,系......
  • Oracle Unifier 工程项目管理业务架构(含脑图)持续更新中...
    继上文介绍了Unifier学习地图后,可以再依据Unifier强大的零代码配置功能 配置类似SAPERP强大的业务模板功能由此,可以延伸如下一系列工程项目管理中的业务模块功能,同时考虑......
  • ARM+FPGA架构匠心之作,米尔MYC-JX8MMA7新品发布!
    近几年,工业智能化技术发展迅猛,嵌入式应用场景越来越丰富,对嵌入式技术开发硬件需求也越来越高。虽然ARM的功能越来越强大,但是在高端医疗器械、工业数据采集系统、能源电力等......
  • 一文搞懂 SAE 日志采集架构
    简介: 本文将着重介绍了SAE提供了多种日志采集方案,以及相关的架构,场景使用特点,点击下文,立即查看吧~作者:牛通(奇卫) 日志,对于一个程序的重要程度不言而喻。无......
  • 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - .Net应用架构示例项目集锦,研
    .NETApplicationArchitecturehttps://github.com/dotnet-architecture位于Github上dotnet-architecture名下的项目是集结了开源社区智慧的示范结晶,是研究和学习最新D......
  • 如何设计存储架构
    存储架构设计总思路估算性能需求 基于实际的业务场景估算存储量,读写性能用户量预估  规划 根据成本预算目标确定推算 ......
  • 网站停服、秒杀大促…解析高可用网站架构云化
    摘要:高可用架构的主要手段,是数据和服务的冗余备份及失效转移。本文分享自华为云社区《高可用网站架构云化解决方案解析》,作者:琴棋书画-Linda。一、背景早期互联网产品用......
  • 数据结构-频度复杂度
    1.0.1时间频度:相当于代码执行的次数T(n)(语句频度)1.0.1计算时忽略常数项1.0.2抓大头计算,相当于高数中的极限思维里面的抓大头,有高次的可以忽略低次幂。计算技巧:常见......
  • 【架构】架构复杂度来源之高可用
    先来看看维基百科对高可用的定义。系统无中断地执行其功能的能力,代表系统的可用性程度,是进行系统设计的准则之一。这个定义的关键在于「无中断」,但恰好难点也在「无中......