从零开始学架构——架构设计的目的

news2025/7/6 1:14:28

软件架构的历史背景

软件架构真正流行是从20世纪90年代开始的,由于在Rational和Microsoft内部的相关活动,软件架构的概念开始越来越流行。
卡内基梅隆高校的玛丽肖(Mary Shaw)和戴维加兰 (David Garlan)对软件架构做了许多讨论,他们在 1994 年的一篇文章《软件架构介绍》(An Introduction to Software Architecture)中写到:

“When systems are constructed from many components,the organization of the overall system-the software architecture presents a new set of design problems.”
随着软件系统规模的增加,计算相关的算法和数据结构不再构成主要的设计问题;当系统由许多部分组成时,整个系统的组织,也就是所说的“软件架构”,导致了一系列新的设计问题。

所以只有规模较大的软件系统才会面临软件架构相关的问题,例如:

  • 1)系统规模庞大,内部耦合严重,开发效率低;
  • 2)系统耦合严重,牵一发动全身,后续修改和扩展困难;
  • 3)系统逻辑复杂,容易出问题,出问题后很难排查和修复。

架构设计的误区

关于架构设计的目的,常见的误区有:“因为架构很重要,所以要做架构设计”,这是一句正确的废话,架构是很重要,但架构为何重要呢?
不做架构设计系统就跑不起来么?
其实不然,很多创业公司可能就没有架构设计,简单的讨论一下用户诉求就开始编码实现,只要功能能正常使用就可以了,也不会有很多用户量。
做了架构设计就能提升开发效率么?
也不尽然,实际上有时候最简单的设计开发效率反而最高的,架构设计毕竟需要投入时间和人力,这部分投入如果用来今早编码,项目也许会更快。
设计良好的架构能促进业务发展么?
好像有一定的道理,例如设计高性能的架构能够让用户体验更好,但反过来想,我们照抄微信的架构,业务就能达到微信的量级么?肯定不可能。

不是每个系统都需要做架构设计。如果生搬硬套业界其他公司已有的架构,有可能造成架构水土不服,或者运行起来特别扭的情况,最后往往需要不断重构,甚至无奈推倒重来。目前所在的公司做的一个项目强行引入某框架导致的后续问题不断,早期我就提出过这个框架的问题,后续框架问题不断,且问题难以定位,框架和代码耦合严重也难以扩展,已经达到了需要重做的地步。所以框架架构选型一定要根据实际情况来做,否则适得其反。

架构设计的真正目的

整个软件技术发展的历史,其实就是一部与“复杂度”斗争的历史,架构的出现也不例外。简而言之,架构也是为了应对软件系统复杂度而提出的一个解决方案,通过回顾架构产生的历史背景和原因,我们可以基本推导出答案:架构设计的主要目的是为了解决软件系统复杂度带来的问题

简单的复杂度分析案例

以学生管理系统,基本功能包括登陆、注册、成绩管理、课程管理等。首先需要识别复杂度在哪。

  • 性能:一个学校的学生大约1~2万人,学生管理系统的访问频率并不高,平均每天每个学生的访问次数平均不到1次,因此性能这部分并不复杂,存储用MySQL完全能够胜任,缓存可不用,Web服务器用Nginx绰绰有余。
  • 可扩展性:学生管理系统的功能比较稳定,可扩展的空间并不大,因此可扩展性也不复杂。
  • 高可用:学生管理系统即使宕机2小时,对学生管理工作影响并不大,因此可以不做负载均衡,更不用考虑异地多活这类复杂的方案。但是,如果学生的数据全部丢失,修复是非常麻烦的,只能靠人工逐条修复,这个很难接受,因此需要考虑存储高可靠,这里就有点复杂了。我们需要考虑多种异常情况:机器故障、机房故障,针对机器故障,我们需要设计MySQL同机房主备方案;针对机房故障,我们需要设计MySQL跨机房同步方案。
  • 安全性:学生管理系统存储的信息有一定的隐私性,例如学生的家庭情况,但并不是和金融相关的,也不包含强隐私,因此安全性方案只要:Nginx提供ACL(Access Control List)控制、用户账户密码管理、数据库访问权限控制。
  • 成本:由于系统简单,基本上几台服务器就能搞定,成本不高。
    整体架构如下,
    在这里插入图片描述
    学生管理系统虽然简单,但基本上能涵盖软件系统复杂度分析的各个方面,正所谓麻雀虽小但五脏俱全。

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

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

相关文章

408考研计算机之计算机组成与设计——知识点及其做题经验篇目2:指令系统

今天我们来讲一讲指令系统里面的知识点以及做题技巧 1、定义 考点1:指令定义 指令是指示计算机执行某种操作的命令,一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。指令系统是指令集体系结构ISA中最核心的部分,ISA…

The eXtensible Markup Language (XML)

文章目录前言No.1 - XML 基础概念① 简介No.2 - XML 序列形式与树形式的转换① 一般形式转换② nesting elements 的转换③ 当元素含有属性时的转换总结前言 本系列是 COMPSCI 752 的笔记总结,本文为第一篇,XML No.1 - XML 基础概念 ① 简介 XML 指可…

springboot项目中Quartz

下面内容大家可在自己创建的 springboot项目中 玩1 定时清理垃圾图片定时任务组件Quartz,可以根据我们设定的周期,定时执行目标任务计划1.1 Quartz介绍(了解)Quartz是Job scheduling(作业调度)领域的一个开源项目&…

树莓派3B搭建HomeAssistant,alist,cpolar,plex,transmission

一、手把手教学树莓派搭建homeassistant环境:内存卡16G,树莓派3B,官方工具烧写镜像,我烧的是树莓派系统,设置里面填写用户名密码,WiFi和密码,同时打开SSH服务。安装docker树莓派使用ssh连接了 先…

C++基础了解-05-C++常量

C常量 一、C常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进…

uni-app框架基础知识

uni-app框架基础知识 uniapp就是vue开发,可以使用vue2和vue3的语法,另外编译和运行都最好在HBuilderX中进行生命周期可以使用vue或者小程序的生命周期不同: 最好不要使用vue的路由,直接使用uniapp的路由(它和小程序一…

项目实战典型案例8——让软件的使用者成为软件的设计者

让软件的使用者成为软件的设计者一:背景介绍二:思路&方案公司的产品设计理念如果你设计的软件猪不能使,你就是猪让每一个软件的使用者都成为我们软件的设计者过程四:总结五:升华一:背景介绍 由于同时对…

2020蓝桥杯真题反倍数 C语言/C++

题目描述 给定三个整数 a,b,c,如果一个整数既不是 a 的整数倍也不是 b 的整数倍还不是 c 的整数倍,则这个数称为反倍数。 请问在 1 至 n 中有多少个反倍数。 输入描述 输入的第一行包含一个整数 n。 第二行包含三个整数a,b,c,相邻两个数之…

Stimulsoft Dashboards.WEB 23.1.8 完美Patch

Stimulsoft Dashboards.WEB 在 Web 应用程序中创建仪表板 Stimulsoft Dashboards.WEB 是一种工具,用于在 ASP.NET、.NET Core、ASP.NET MVC 和 Blazor 平台上开发的 Web 应用程序中创建、编辑、导出和查看仪表板。该产品包括各种数据分析和可视化元素,可…

花括号展开II[栈模拟dfs]

栈模拟dfs前言一、花括号展开II二、栈模拟dfs总结参考资料前言 递归调用,代码非常的简洁。但是可以通过显式栈来模拟栈中的内容,锻炼自己的代码能力,清楚知道栈帧中需要的内容。 一、花括号展开II 二、栈模拟dfs 每碰到一个左括号&#xf…

sheng的学习笔记-服务熔断与降级组件Hystrix

在微服务架构中,一个应用往往由多个服务组成,这些服务之间相互依赖,依赖关系错综复杂。例如一个微服务系统中存在 A、B、C、D、E、F 等多个服务,它们的依赖关系如下图。图1:服务依赖关系通常情况下,一个用户…

基于安森美深力科电子一款能实现大功率DC/DC电源转换 NCP13992ACDR2G 全桥LLC方案

基于安森美深力科电子一款能实现大功率DC/DC电源转换 NCP13992ACDR2G 全桥LLC方案 什么是LLC:LLC电路是由2个电感和1个电容构成的谐振电路,故称之为LLC,由于能实现软开关,有效地减小开关损耗和容许高频运行,所以在高频功率变换领…

网关(Gateway)

本文内容网关,网关作用,默认网关,网关和路由器区别网关协议,网关分类NAT网关一、概述网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议…

计算机网络-- 应用层(day08)

计算机网络两种方式 网络应用程序运行再处于网络边缘的不同端系统上,通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和它们之间的关系。 目前流行的主要有以下两种: 客户/服务器…

libevent 学习笔记

一、参考 libevent Libevent深入浅出 - 《Libevent 深入浅出》 - 书栈网 BookStack libevent 之 event config的相关函数介绍_event_config_new_yldfree的博客-CSDN博客 Libevent之evbuffer详解_有时需要偏执狂的博客-CSDN博客 二、libevent概述 libevent 就是将网络、I…

数组中的逆序对

解题思路1: 看到这个题目,我们的第一反应是顺序扫描整个数组。每扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成了一个逆序对。假设数组中含有n个数字。由于每个数字都要和…

JavaScript的学习

一、引言 1.1 JavaScript简介 JavaScript一种解释性脚本语言,是一种动态类型、弱类型、基于原型继承的语言,内置支持类型。它的解释器被称为JavaScript引擎,作为浏览器的一部分,广泛用于客户端的脚本语言,用来给HTML网…

信息系统基本知识(六)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.7 信息化发展与应用 我国在“十三五”规划纲要中,将培育人工智能、移动智能终端…

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

搜索Query理解和语义召回技术 随着用户规模和产品的发展, 搜索面临着越来越大的 query 长尾化挑战,query 理解是提升搜索召回质量的关键。本次将介绍搜索在 query term weighting,同义词扩展,query 改写,以及语义召回等方向上的实践方法和落地情况。 1.面临问题:长尾 qu…

h264编码概述八(哥伦布编码ue(v))

一、概述 熵编码是无损编码的一种方法。该编码方法的宗旨是找到一种编码,使得码字的平均码长达到熵极限。具体实施是,对出现概率较大的符号,取较短的码长,对出现概率较小的符号取较大的码长。 H.264中使用的熵编码有:…