架构设计读后有感——设计流程

news2024/11/25 10:23:27

架构也是有套路的

绝大部分的公司中,架构师都是技术人员的终极方向,是技术金字塔的顶端,那么普通人员要想走上这条路,需要掌握适当的方法,逐步完善架构

🏹1 有的放矢——识别复杂度

分析复杂性是设计架构的第一步

因为软件架构的目的就是为了解决软件系统的复杂性,所以先分析复杂性,后续的设计才不会偏离方向。否则就是一错再错

复杂度源于:高性能高可用可扩展等方面
复杂度在很多场景下只是上述三个中的一个,少数情况两个,如果要同时解决三个,那么说明这个系统之前做的太烂了,或者你的判断出现了严重的错误

那么如果真的接手了一个每一个复杂度都存在问题的系统,那么就一个一个去解决,牢记演进原则,一步一步演进,不要妄想一次性解决所有。

1.1复杂度优先级解决法

先将主要的复杂度问题列出,再根据业务、技术、团队等综合情况进行排序,复杂度问题越主要,越优先解决

可能出现问题:可能出现解决了优先级排在前的复杂度,解决后续复杂度,发现之前做的有问题需要推倒重来(大概率不会发生:同一个复杂度问题有多种方案)
即使推倒重来,那么新的方案也要解决之前解决的问题

🗺2 按图索骥——设计备选方案

找到主要的复杂度问题后,就可以开始真正的架构方案设计了。

成熟的架构师首先对已存在的技术非常熟悉,对已经验证过的架构模式熟烂于心,根据自己对业务的理解,挑选合适的进行组合,再调整修改

软件技术经过发展,新技术层出不穷,但是经过检验的成熟的技术更多。

  • 高可用的主备、集群方案
  • 高性能的负载均衡、多路复用方案
  • 可扩展的分层、插件化等技术

当这些方法都不满足需求时才会进行创新,但创新绝大部分情况也是基于已有的成熟技术

  • NoSQL:Memecache只是把数据库的索引单独出来做成一个缓存
  • Hadoop大文件存储方案,就是集群方案+数据复制方案
  • Docker虚拟化,基础是LXC(解释)
  • LevelDB文件存储结构是Skip List(解释)

新技术都是在现有技术的基础上发展起来的,现有技术又来源于先前的技术。将技术进行功能性分组,可以大大简化设计过程,这是技术“模块化”的首要原因。技术的“组合”和“递归”特征,将彻底改变我们对技术本质的认识。——《技术的本质》

2.1 此阶段常见错误

虽然说起来简单,什么组合一下,调整一下就好了,但是不代表架构设计是一件简单的事情,因为组合的方案很多,怎么选才是难点,所以选择最终的方案不是一件容易的事,同时还会犯一些错误

  • 设计最优秀的方案
    • 不要有技术情结!不要有技术情结!不要有技术情结!
    • 遵循“简单原则”要求,先按照自身能力去估算和选型
  • 只做一个方案
    • 心里简单对几个方案进行设想,再简单判断和选择
      • 心里评估过于简单,不全面
      • 架构师局限于自身认知导致对架构的方案判断错误
      • 单一方案会出现过度辩护的情况,也许架构师会再评审时竭尽全力的为自己的设计辩护,导致整个团队的认知偏差
    • 架构师要设计多个备选,3-5个最佳
      • 别多因为消耗脑细胞
      • 别少因为容易局限思维
    • 差异要明显
    • 不要只局限于已经熟悉的技术
      • 可能一个Redis缓存的事,你却不知道并且不想用N哦SQL,反而想用MySQL去解决
  • 备选方案过于详细
    • 备选方案不是最终方案,不需要写清楚每个细节
      • 消耗大量时间和精力
      • 注意力在细节中,忽略了整体的技术设计
    • 正确做法是备选阶段关注技术选型,不同方案的差异要明显有对比

🤔3 深思孰虑——评估和选择备选方案

设计了备选方案,要想从中选出一个最终的方案,也是一个很大的挑战,如下难点

3.1 难点

  1. 每个方案都是可行的,因为不可行是不会被备选上
  2. 每个方案都是有缺点的,并且都是有差异的,不然有一个是完美的就直接选了
  3. 评价标准主观性较强,多个架构师讨论一个认为复杂,另一个觉得正常,无法将复杂一词量化

3.2 指导思想

所以实践中很多设计师或架构师就采取了一些指导思想

  • 最简派:挑一个看起来最简单的方案
  • 最牛派:选一个看起来很牛的方案,例如性能最好的、可用性最好,功能最强大,大厂开源的等
  • 最熟派:有过经验,能够快速实施
  • 领导派:领导背锅

3.3 具体做法

有些时候我们要360度环评

  • 列出我们需要关注的额质量属性点
  • 分别从这些点打分评估每个方案
  • 在综合挑选合适的最优方案
    属性点如下:性能、可用性、硬件成本、项目投入、复杂度、安全性、可扩展性。
    在评估属性时,还需要遵循架构设计原则:合适原则简单原则

基本某个质量属性能够满足一定时期内业务发展就可以了,业务翻倍的概率很小,都是慢慢上升然后做优化,遵循演进原则

3.4 架构设计实例

3.4.1 业务背景

  • 20个人规模的创业团队
    • 开发人员6人
  • 做一个垂直电商的网站
  • 想快速上线
  • 架构简单,是一个简单的web网站
  • 目前由于业务发展,性能出现瓶颈,用户访问慢

架构如下
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.4.2 备选方案设计

  1. 方案一:横向扩展
    简单的增加web服务器,拓展为集群,如下
    在这里插入图片描述

  2. 系统拆分:将系统拆成多个子系统
    如电商系统,拆为商品子系统+订单子系统+用户管理子系统
    在这里插入图片描述

3.4.3 备选方案360度环评

  • 分析架构质量属性
  1. 由于背景问题是系统性能不足,所以“性能”问题是关键属性,并且业务快速发展,所以本次做完后,至少要支撑1年内的业务发展
  2. 开发人员只有5个人,所以项目的复杂度和项目的开发时间也是关注的重点,不希望一个方案要做半年
  3. 由于是创业公司,目前未处于盈利状态,所以成本也需要考虑
  4. 业务发展的快,各种新功能不断新增,所以系统的扩展性肯定要保证
  5. 用户增长量很快,系统如果不保证可用,可能会丧失用户
    所以质量属性要保证性能、复杂度、成本、可扩展性、可用性,对比图如下
    在这里插入图片描述

虽然做了对比,也无法做出抉择,因为上述方案没有一个是完美的。
例如:拆分方案在“性能、可扩展、可用性”方面占优,集群方案在“复杂度、开发进度、成本”方面占优,各有各的好。

看似正确,但是错误的做法
  1. 数量对比法:简单看哪个优点多就选哪个——不注重优先级
  • 这种做法相当于将所有的质量属性的重要性划等号,没有考虑某个属性点的优先级,每个公司有不同的优先级
    • 比如,不差钱的公司,不需要考虑成本,但对于初创公司,成本则很重要
  • 当出现优点一样的情况时强行增加一个质量点对比,导致没有考虑优先级
  1. 加权法:给每个属性点加权重
  • 如:性能等权重10、5、3,成本类型的权重5、3、1,将权重得分加起来,得分最高选谁
  • 不是说这种做法不对,但是要有一个明确标准。
正确做法

按照优先级选择:设计师综合当前业务发展情况、团队人员规模和技术,业务发展预测等,将质量按照优先级排序,优先挑选第一优先级,如果备选方案都满足,就看第二优先级,以此类推。

因为我们再选择备选方案时选的是有明显差异的方案,所以绝大多数情况是不会出现两个优先级一模一样的方案

回到电商案例中,开发5人,既要做业务版本开发,又要解决架构性能问题,业务发展又快,所以能否快速实施,简单是优先考虑。所以“集群方案”就选定了。
但是请记住演进原则,业务增长快,用户增多,所以最终还是可能会演化到“拆分架构”也就是我们熟知的微服务、分布式架构,并且演化微服务、分布式架构,就需要足够的人手,以及成员充分了解系统的结构,才好去做拆分

🗿4 精雕细琢——详细方案设计

完成了方案选择和设计,但是整体方案还没有完成,要将方案细化,使的其变成一个可以落地的设计方案。

简单来说,详细的方案就是将方案涉及的关键技术细节确定

  • 如我们是用ES做全文检索,那么就需要确定ES的索引是按照业务划分,还是一个大索引就可以了;分片分多少,集群节点数的个数等
  • 如采用MySQL分库分表,那么就需要确定那些表可能量很大,要做分库分表,按什么维度划分,分库分表后怎么做关联查询
  • 如引入Nginx做负载均衡,那么Nginx的主备怎么做,集群怎么做,负载均衡的策略以及权重分配等

可以看到详细设计方案中每个点也会有很多备选方案(Nginx的负载策略,ES分片策略…)要去做抉择,但是这种抉择比较轻量,不必像方案备选一样操作,根据场景选择一下就好

可能遇到备选时可行,但是详细设计时却发现不行

这种情况可能性极低,但是也可能会出现,比如备选评估时忽略了某一个质量属性的重要性,一般有如下办法进行避免:

  1. 不但要进行备选方案的设计和选型,还要对备选方案的关键细节有深入了解。不能把“细节我们不讨论”挂在嘴边,做一个“PPT架构师”
  2. 通过分步骤、分阶段、分系统等方式,降低方案复杂度,如果将整个方案一起设计,那么一旦推翻一个设计点,可能之前的很多设计都会被推翻——降低耦合
  3. 如果方案本身就复杂,那么就博采众长,汇集团队的智慧和经验来防止1和2两点的思维盲区和经验盲区

📖5 总结

  • 设计架构要先分析出系统的复杂度和点在哪
  • 架构师根据自己对业务的理解,挑选合适的架构模式进行组合,再对组合后的方案进行修改和调整
  • 新技术都是在现有技术上发展起来的
  • 备选方案在3~5个最佳,差异要明显,不要只局限于已经熟悉的技术
  • 360度环评的方式评估备选方案
  • 按照质量属性的优先级来判断备选方案的优劣
  • 要对技术的细节和原理有深入了解,避免返工
  • 通过分阶段、分步骤、分系统来降低方案复杂度和设计耦合度
  • 采取团队思维,博采众长,汇集团队经验减少思维和经验盲区

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

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

相关文章

vscode 代码格式setting设置

{"editor.tabSize": 2,"eslint.validate": ["javascript", // 用eslint的规则检测js文件"vue","html","typescript","typescriptreact"],"editor.codeActionsOnSave": {"source.fixAll…

【NLP】daydayup 循环神经网络基本结构,pytorch实现

RNN 循环神经网络 循环神经网络(Recurrent Neural Network,RNN)是一种神经网络结构,专门用于处理序列数据。 RNN结构原理 RNN架构中,网络通过循环把信息从一个处理步骤传递到下一个,这个循环结构被称为隐…

10个强大的AI驱动售后服务,助力成功

目录 10个AI驱动售后服务 1. 预测性维护以减少停机时间2. 自动化客户支持3. 个性化产品推荐4. 情感分析以改进反馈管理5. AI驱动自助服务平台6. 主动客户沟通7. 智能保修管理8. AI增强服务团队培训9. 高级分析服务优化10. AI驱动忠诚度计划 利用AI提升售后服务体验 在当今竞争…

探索OpenAI的全新里程碑:o1模型

近期,人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型(LLM),o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

分析二极管的交流响应(1)——直流分析,Q点的计算

二极管的直流电路分析我们可以用理想模型,恒压降模型和折线模型去近似分析,但是这些模型仅限于我们的信号是直流的情况。如果遇到交流信号,我们该如何去分析呢? 首先我们来理解Q点的概念: 看这个Q点里的“Q”是个什么…

【C++】C++中如何处理多返回值

十四、C中如何处理多返回值 本部分也是碎碎念,因为这些点都是很小的点,构不成一篇文章,所以本篇就是想到哪个点就写哪个点。 1、C中如何处理多个返回值 写过python的同学都知道,当你写一个函数的返回时,那是你想返回…

【Javascript】原生实现deep watch,使用proxy逐层建立数据监听

原理 使用 proxy对象处理数据,添加监听,然后递归再次添加直到全部添加完毕 代码 /*** 给对象递归建立数据监听,可以监测每一层的每个键的变化* * param {*} obj // 目标对象 * param {*} callback //回调。通过key处理对应的变化* param {…

机器学习EDA探查工具Pandas profiling

在最初的数据探查的时候,可以通过pandas的函数,以及matplotlib做图像绘图,这个工作比较重复和低效,所以pandas针对常用的数据列统计和展示,做了EDA工具profiling,可以自动帮助数据分析。 问题1&#xff1a…

java核心基础

文章目录 1. Java开发基础1.1 DOS常用命令:(以MAC常用命令比较)1.2 JVM、JRE、JDK之间的关系1.3 Java开发环境的搭建1.4 Java的注释,标识符、标识符的命名规范1.5 变量和常量的定义及初始化1.6 Java的运算符1.7 三大语句1.8 常用的类1.8.1 ja…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21 1. AIvril: AI-Driven RTL Generation With Verification In-The-Loop Authors: Mubashir ul Islam, Humza Sami, Pierre-Emmanuel Gaillardon, and Valerio Tenace AIVRIL: 人工智能驱动的RTL生成与验证内…

OpenAPI鉴权(二)jwt鉴权

一、思路 前端调用后端可以使用jwt鉴权;调用三方接口也可以使用jwt鉴权。对接多个三方则与每个third parth都约定一套token规则,因为如果使用同一套token,token串用可能造成权限越界问题,且payload交叉业务不够清晰。下面的demo包…

springBoot --> 学习笔记

文章目录 认识 SpringBoot第一个 SpringBoot 程序彩蛋 banner (emmmmm,哈哈哈哈哈哈,牛逼!)SpringBoot 配置配置文件第一个 yaml 配置 成功案例yaml 存在 松散绑定 JSR 303 数据校验多环境配置以及文件位置访问静态资源…

教你制作一个二维码就能查分的系统

学生和家长对于成绩查询的需求日益增长。为了满足这一需求,很多学校和老师开始使用二维码查询系统,以提高效率和保护隐私。以下内容就是如何制作一个简单易用的成绩查询二维码系统的步骤: 1. 准备电子表格 老师需要准备一个包含学生成绩的电…

(已解决)vscode如何传入argparse参数来调试/运行python程序

文章目录 前言调试传入参数运行传入参数延申 前言 以前,我都是用Pycharm专业版的,由于其好像在外网的时候,不能够通过VPN来连接内网服务器,我就改用了vscode。改用了之后,遇到一个问题,调试或者运行python…

基于Qt5.12.2开发 MQTT客户端调试助手

项目介绍 该项目是一个基于 Qt 框架开发的桌面应用程序,主要用于与 MQTT 服务器进行连接和通信。通过该应用,用户可以连接到 MQTT 服务器,订阅主题、发布消息并处理接收到的消息。项目使用 QMqttClient 类来实现 MQTT 协议的客户端功能&…

第128集《大佛顶首楞严经》

《大佛顶如来密因修正了义诸菩萨万行首楞严经》。监院法师慈悲,诸位法师,诸位同学,阿弥陀佛! 请大家打开讲义296面。 庚一、总示阴相(分四:辛一、结前行阴尽相。辛二、正明识阴区宇。辛三、悬示识阴尽相。…

通过frp 免费内网穿透,端口转发

1.准备工作 (1)拥有一台有公网IP的服务器(系统可以是windows/macos/linux),服务器可以使用云厂商购买的服务器 (2)从下面链接下载最新版本的frp安装包,客户端和服务端是同一个tar包 https://github.com/fatedier/frp/releases 服务端机器A-有外网ip的作为服务端 服务端机器B-需…

前端接口415状态码【解决】

前端接口415状态码【解决】 一、概述 415状态码是HTTP协议中的一个标准响应状态码,代表“Unsupported Media Type”(不支持的媒体类型)。当客户端尝试上传或发送一个服务器无法处理的媒体类型时,服务器会返回这个状态码。这通常意…

二维四边形网格生成算法:paving(五)缝合 Seaming 与 闭合检测 Closure Check

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 参考论文:Paving: A new approach to automated quadrilateral mesh generation 关注公众号回复paving可以获得文章链接 paving(一&#xff0…

python如何将字符转换为数字

python中的字符数字之间的转换函数 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字…