【从零开始学架构 架构基础】四 架构设计的复杂度来源:可扩展性复杂度来源

news2024/11/25 1:59:02

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体问题具体分析,基于各方考虑设计合适的架构,存在合适的架构,不存在最好的架构。这篇主要讨论可扩展性问题

复杂度来源

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

在软件设计领域,面向对象思想、设计模式主要被用于解决可扩展性问题。设计具备良好可扩展性的系统,有两个基本条件:正确预测变化、完美应对变化

预测变化

软件系统在发布后,还可以不断地修改和演进。这就意味着不断有新的需求需要实现。如果新需求能够少改代码甚至不改代码就可以实现。综合分析,预测变化的复杂性在于:

  1. 不能每个设计点都考虑可扩展性。如果每个点都考虑可扩展性,架构师会不堪重负,架构设计也会异常庞大且最终无法落地
  2. 不能完全不考虑可扩展性。不能完全不做预测,否则可能系统刚上线,马上来新的需求就需要重构,这同样意味着前期很多投入的工作量也白费了
  3. 所有的预测都存在出错的可能性。如果预测的事情出错,我们期望中的需求迟迟不来,甚至被明确否定,那么基于预测做的架构设计就没什么作用,投入的工作量也就白费了

针对上边这些复杂性,有个经验性的原则:只预测 2 年内的可能变化,不要试图预测 5 年甚至 10 年后的变化, 变化快的行业,能够预测 2 年已经足够了;而变化慢的行业,本身就变化慢,预测本身的意义不大,预测 5 年和预测 2 年的结果是差不多的。所以2 年法则在大部分场景下都是适用的

应对变化

即使预测的比较准了,但是系统设计的时候如何应对变化的扩展性也不是一个简单的问题,应对变化有两个方案:

1 提炼出变化层和稳定层

这种方案是:将不变的部分封装在一个独立的稳定层,将变化封装在一个变化层(也叫适配层)。这种方案的核心思想是通过变化层来隔离变化
在这里插入图片描述
无论是变化层依赖稳定层,还是稳定层依赖变化层都是可以的,需要根据具体业务情况来设计。如果系统需要支持 XML、JSON、ProtocolBuffer 三种接入方式,那么最终的架构就是“形式 1”架构;如果系统需要支持 MySQL、Oracle、DB2 数据库存储,那么最终的架构就变成了“形式 2”的架构了
在这里插入图片描述
这种方案的复杂度在于分层的拆分依据,以及各层的接口如何设计

  1. 明确变化层和稳定层如何拆分:对于哪些属于变化层,哪些属于稳定层需要明确
  2. 变化层和稳定层之间的接口如何设计:对于稳定层来说,接口肯定是越稳定越好;但对于变化层来说,在有差异的多个实现方式中找出共同点,并且还要保证当加入新的功能时,原有的接口不需要太大修改

3 提炼出抽象层和实现层

提炼出一个“抽象层”和一个“实现层”,因为抽象层的接口是稳定的不变的,我们可以基于抽象层的接口来实现统一的处理规则,而实现层可以根据具体业务需求定制开发不同的实现细节,所以当加入新的功能时,只要遵循处理规则然后修改实现层,增加新的实现细节就可以了,无须修改抽象层。典型的实践就是设计模式规则引擎

1 写 2 抄 3 重构原则

不要一开始就考虑复杂的可扩展性应对方法,而是等到第三次遇到类似的实现的时候再来重构,重构的时候采取隔离或者封装的方案

  • 1 写:最开始三方支付选择了微信钱包对接,此时不需要考虑太多可扩展性,直接快速对照微信支付的 API 对接即可,因为业务是否能做起来还不确定。
  • 2 抄:后来发现业务发展不错,决定要接入支付宝,此时还是可以不考虑可扩展,直接把原来微信支付接入的代码拷贝过来,然后对照支付宝的 API,快速修改上线。
  • 3 重构:因为业务发展不错,为了方便更多用户,决定接入银联云闪付,此时就需要考虑重构,参考设计模式的模板方法和策略模式将支付对接的功能进行封装。

开始可以写一些if语句进行分支判断,后续场景多起来后可以考虑设计模式去实现。

总结一下

结合这篇Blog,其实我感觉主要是如何在过度设计与不可扩展间去权衡。长期预测的代价和变数太多,可能在落地前业务就凉了,不做预测又可能刚开始迭代就发现难以支持。所以2年预测是一个经验值,如果到了2年业务发展的好了,会倒逼决策层给资源给钱进行架构升级,如果都用不了2年就凉了那5-10年预测就没意义了;在预测的前提下,我们在方案设计的时候是否可以考虑短、中、长三种方案,短期策略一般考虑的变化少,短视,但迅速,修改小,立竿见影。长期策略一般看重远期,但成本高很高,也很可能预测不中。综合成本情况下如果决定采用短期策略,要考虑如果预测的变化发生了,系统修改为长期策略的代价有多大(想在做前),如果可以演化切换那可以,如果成本很高甚至切换不到长期策略,就需要重新思考了;再说重构,重构应该是一个小步快跑的模式,不要一开始就过度抽象的设计去炫技,而是先实现最基本功能,然后逐步随业务迭代进行变化层隔离。

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

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

相关文章

Solidworke学习(装配体3)

目录 本节学习内容: 一、高级配合 (1)对称配合 (2)宽度配合 (3)距离配合 二、机械配合 (1)凸轮配合 (2)槽口配合 三、快捷菜单 本节学习…

折半查找详解

一:折半查找概念 折半查找(也称为二分查找)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是目标值,则搜索过程结束;如果目标值大于或小于中间元素&#x…

Uniapp 默认demo安装到手机里启动只能看得到底tab无法看到加载内容解决方案

Uniapp 默认demo安装到手机里以后,启动APP只能看到底tab栏,无法看到每个tab页对应的内容,HBuilder会有一些这样的报错信息: Waiting to navigate to: /pages/tabBar/API/API, do not operate continuously: 解决方案:…

FastAPI教程III

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 这部分暂无需求的没有记录,仅放置标题。 依赖项 安全性 中间件 你可以向FastAPI应用添加中间件。 ”中间件“是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个…

SpringBoot:使用Spring Batch实现批处理任务

引言 在企业级应用中,批处理任务是不可或缺的一部分。它们通常用于处理大量数据,如数据迁移、数据清洗、生成报告等。Spring Batch是Spring框架的一部分,专为批处理任务设计,提供了简化的配置和强大的功能。本文将介绍如何使用Spr…

cpu,缓存,辅存,主存之间的关系及特点

关系图 示意图: ------------------- | CPU | | ------------- | | | 寄存器 | | | ------------- | | | L1缓存 | | | ------------- | | | L2缓存 | | | ------------- | | | L3缓存 | | | ------------- | ----…

test——认识测试

目录 前言 一什么是测试 1测试场景 2为什么需要测试 3测试定义 二测试的岗位 1测开与测试 2测试与开发的区别 a工作内容 b难易程度 c其它不同 三测试人员具备的素质 1综合能力 a沟通能力 b快速学习能力 c开发能力 d文字能力 2掌握自动化测试技术 前言 互联⽹…

Python基于决策树分类模型、随机森林分类模型、KNN分类模型和GBDT分类模型完成收入预测项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在全球化的今天,收入不平等已经成为各国政府和社会关注的焦点问题之一。了解居民收入状况&…

后端之路第三站(Mybatis)——XML文件操作sql

一、XML映射文件是啥 前面我们学过了在Mapper接口用注解的方式来操作sql语句 那么XML映射文件就另一种操作sql语句的方法 为什么还要有这么个玩意? 我简单说就是:如果有的sql特别复杂的话,比如需要【动态sql】的话,就得用到XM…

木各力“GERRI”被“GREE”格力无效宣告成功

近日“GERRI”被“GREE”格力无效宣告成功,“GERRI”和“GREE”近似不,如果很近似当初就不会通过初审和下商标注册证,但是如果涉及知名商标和驰名商标,人家就可以异议和无效。 “GERRI”在被无效宣告时,引用了6个相关的…

电子电路学习笔记(4)三极管

部分内容参考链接: 电子电路学习笔记(5)——三极管_三极管 箭头-CSDN博客 模拟电子技术基础笔记(4)——晶体三极管_集电结的单向导电性-CSDN博客 硬件基本功-36-三极管Ib电流如何控制Ic电流_哔哩哔哩_bilibili 部分…

算法入门(上)

什么是算法? 算法(Algorithm)是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 给定一个问题,能够解决这个问题的算法是有很多种的。算式中的问题是千奇百怪…

【SCAU操作系统】期末复习简答及计算题例题解析

目录 一、写出下列英文缩写词在计算机系统中的英文或中文全名。 二、进程状态/调度/周转问题 (1)进程状态 (2)进程状态转换 (3)进程调度 (4)最短进程优先调度算法 三、逻辑地…

扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下,文档扫描功能…

51单片机第17步_外部中断

本章重点学习外部中断。 1、外部中断0框图: 2、外部中断1框图: 3、Keil C51中有一些关键字,需要牢记: interrupt 0:指定当前函数为外部中断0; interrupt 1:指定当前函数为定时器0中断&#x…

【Spring Boot】认识 JPA 的接口

认识 JPA 的接口 1.JPA 接口 JpaRepository2.分页排序接口 PagingAndSortingRepository3.数据操作接口 CrudRepository4.分页接口 Pageable 和 Page5.排序类 Sort JPA 提供了操作数据库的接口。在开发过程中继承和使用这些接口,可简化现有的持久化开发工作。可以使 …

电路笔记(电源模块): 基于FT2232HL实现的jtag下载器硬件+jtag的通信引脚说明

JTAG接口说明 JTAG 接口根据需求可以选择20针或14针的配置,具体选择取决于应用场景和需要连接的功能。比如之前的可编程逻辑器件XC9572XL使用JTAG引脚(TCK、TDI、TDO、TMS、VREF、GND)用于与器件进行调试和编程通信。更详细的内容可以阅读11…

(超详细)数据结构——“栈”的深度解析

前言: 在前几章我们介绍了线性表的基本概念,也讲解了包括顺序表,单链表,双向链表等线性表,相信大家已经对线性表比较熟悉了,今天我们要实现线性表的另一种结构——栈。 1.栈的概念 栈:一种特殊…

AI是如何与快充技术结合的?

针对AI技术在快充领域的运用,我们可以进一步深入探讨AI如何与快充技术结合,提升充电效率和用户体验。以下是一些具体的AI技术在快充领域的应用场景: 一、智能充电算法 学习充电模式:AI算法可以学习用户的充电习惯,比…

批量文件名修改软件:一键解决同一编码多型号文件分类与命名难题,高效管理文件

在数字化时代,图片文件已经成为我们工作中不可或缺的一部分。然而,当面对成百上千个同一编码下不同型号的图片文件时,如何快速、准确地进行分类和命名,成为了许多职场人士头疼的问题。现在,我们为您带来了一款神奇的批…