软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护
10.6 大型网站系统架构演化实例
大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,主要解决这类问题。
1. 单体架构
- 特点: 所有资源(应用程序、数据库、文件)集中在一台服务器上。
- 适用场景: 小型网站,用户和数据量较少。
- 限制: 随用户增长,性能和存储空间成为瓶颈。
2. 垂直架构
- 优化: 应用程序与数据分离,分为应用服务器、文件服务器、数据库服务器。
- 优势:
- 根据不同需求优化硬件配置(CPU、内存、硬盘)。
- 数据存储和业务处理能力提升。
- 挑战: 数据库压力依然会随着用户增长增加。
3. 引入缓存
- 原因: 数据访问遵循“二八定律”,80%的访问集中在20%的数据。
- 方法:
- 本地缓存:快速但受服务器内存限制。
- 远程分布式缓存:支持大规模缓存,性能更稳定。
- 效果: 缓解数据库访问压力,但应用服务器连接数有限,成为瓶颈。
4. 应用服务器集群
- 解决方案: 使用负载均衡器,将用户请求分配到多个应用服务器。
- 优势:
- 通过横向扩展增加服务器,提升系统可伸缩性。
- 不依赖更强大的单台服务器。
5. 数据库读写分离
- 问题: 写操作和部分读操作仍集中在主数据库,负载高。
- 优化:
- 主数据库负责写操作。
- 从数据库通过主从复制承担读操作。
- 数据访问模块实现透明的读写分离。
- 效果: 数据库性能进一步提升。
6. 反向代理与 CDN
- 目标: 缓解因区域网络差异导致的访问延迟问题。
- 方法:
- CDN: 部署在网络提供商机房,用户从最近位置获取内容。
- 反向代理: 缓存服务器,用户请求优先访问代理缓存内容。
- 效果: 提升响应速度,降低后端服务器负载。
7. 分布式文件与数据库
- 问题: 单一数据库或文件服务器无法满足持续增长需求。
- 解决方案:
- 分布式文件系统: 将文件分布在多个服务器上。
- 分布式数据库: 拆分业务数据库,减少单表数据规模。
- 效果: 支持海量数据存储与高并发访问。
8. 引入 NoSQL 与搜索引擎
- 原因: 数据结构复杂,传统关系型数据库难以满足需求。
- 优化:
- NoSQL: 提供分布式、弹性的数据存储。
- 搜索引擎: 加速复杂数据检索。
- 效果: 更灵活的数据存储与查询能力。
9. 业务拆分
- 目标: 按产品线拆分网站(如首页、订单、用户等)。
- 方法:
- 每个产品线独立部署为单独应用。
- 应用间通过消息队列或共享数据存储系统通信。
- 效果: 降低单一应用复杂度,提高团队开发效率。
10. 分布式服务化
- 挑战: 应用复杂度增高,维护成本增加。
- 解决方案:
- 提取共用业务逻辑为分布式服务(如用户管理、订单管理)。
- 应用通过服务调用完成具体操作。
- 效果: 简化应用间依赖关系,提升开发与运维效率。

10.7 软件架构维护
-
架构知识管理:
- 定义:包含架构设计和设计决策,用于解释架构方案的选择原因。
- 目标:确保关键设计知识不会因人员流失或变更而丢失,支持架构的演化和长期可维护性。
- 现状:架构知识文档化实践较少,主要由于动机不足、文档维护成本高等问题。
-
架构修改管理:
- 建立隔离区域以最小化修改影响,明确修改规则和类型。
- 追踪修改的副作用和影响范围,提升修改过程的可靠性。
-
架构版本管理:
- 提供演化控制和度量基础,支持静态与动态演化分析。
- 利用矩阵方法分析架构演化的波及效应,量化组件的贡献和影响。
-
架构可维护性度量:
- 圈复杂度(CCN):衡量架构复杂程度,用于早期风险评估,推荐值≤10。
- 扇入扇出度(FFC):表示模块与其他模块的交互频率,高值表明模块关联密集。
- 模块间耦合度(CBO):评估模块依赖关系的程度,高耦合模块维护风险高。
- 模块响应度(RFC):衡量模块提供的功能数量及其复杂性。
- 紧内聚度(TCC) 和松内聚度(LCC):表示模块内部组件的协作程度,评估模块内聚性。
评估方法与结果
- 将系统组件图导出为数据文件(如XML),利用架构评估工具计算各项指标。
- 示例系统的计算结果显示:
- 高度关联的模块(如RSApplication)FFC和CBO较高,维护风险较大。
- 独立模块(如User和DB)度量值较低,复杂性和耦合程度较小。
- 组件内聚性仅适用于包含子模块的组件,如ClientApplication。
建议与实践
-
文档化和知识管理:
- 推动团队建立有效的架构知识管理机制,使用工具化手段记录设计决策。
- 定期复盘设计决策的长期影响,提升架构演化的可预测性。
-
自动化与工具支持:
- 应用架构评估工具(如MSAES)自动化度量指标计算,减少人工误差。
- 在设计初期及演化关键点评估CCN、CBO等指标,指导后续优化。
-
培训与意识提升:
- 强化团队成员对架构知识记录和分享重要性的理解。
- 鼓励在开发过程中注重长远可维护性而非短期利益。
相关文章:

软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护
10.6 大型网站系统架构演化实例 大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,主要解决这类问题。 1. 单体架构 特点: 所有资源(应用程序、数据库、文件)集中在一台服务器上。适用场景: 小型网站&am…...

2024美赛数学建模C题:网球比赛中的动量,用马尔可夫链求解!详细分析
文末获取历年美赛数学建模论文,交流思路模型 接下来讲解马尔可夫链在2024年C题中的运用 1. 马尔科夫链的基本原理 马尔科夫链是描述随机过程的一种数学模型,其核心特征是无记忆性。 简单来说,系统在某一时刻的状态只取决于当前状态&#x…...
23种设计模式之状态模式
目录 1. 简介2. 代码2.1 State (定义抽象状态接口)2.2 StartState (实现具体状态类)2.3 EndState (实现具体状态类)2.4 Context (定义上下文类)2.5 Test (测试类…...

Elasticsearch Serverless 中的数据流自动分片
作者:来自 Elastic Andrei Dan 在 Elastic Cloud Serverless 中,我们根据索引负载自动为数据流配置最佳分片数量,从而使用户无需摆弄分片。 传统上,用户会更改数据流的分片配置,以处理各种工作负载并充分利用可用资源。…...

YOLOv10改进,YOLOv10添加U-Netv2分割网络中SDI信息融合模块+GSConv卷积,助力小目标
理论介绍 完成本篇需要参考以下两篇文章,并已添加到YOLOv10代码中 YOLOv10改进,YOLOv10添加U-Netv2分割网络中SDI信息融合模块,助力小目标检测YOLOv10改进,YOLOv10添加GSConv卷积+Slim-neck,助力小目标检测,二次创新C2f结构下文都是手把手教程,跟着操作即可添加成功 目…...

xshell连接虚拟机,更换网络模式:NAT->桥接模式
NAT模式:虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码,只要宿主机能够访问网络,虚拟机也能够访问。对外部网络而言,它看到的是宿主机的IP地址,而不是虚拟机的IP。但是,宿主机可…...
sql的where条件中使用case when
场景: 1、使用oracle数据库,数据类型为number,需要正无穷值。 2、数据表中有两个金额值,最大值和最小值, 如10~20, 30 ~40,40以上,数据库中这样设计 id name min max 1 j 10 20 2 …...
MacOS 上以源码形式安装 MySQL 5.7
以下是在 macOS 上从源码安装 MySQL 5.7 的步骤: 前置条件 安装 Homebrew:如果你还没有安装 Homebrew,可以在终端中运行以下命令进行安装: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install…...
MySQL 事务隔离级别详解
一、事务的基本概念 (一)什么是事务 事务是一个逻辑工作单元,由一组数据库操作组成。这些操作要么全部成功执行,要么全部回滚,以确保数据库的一致性。事务具有以下四个特性,通常被称为 ACID 特性ÿ…...

C语言——高精度问题
1、高精度计算的本质:竖式计算; 2、适用解决超出long long int 范围的大整数计算 #include<stdio.h> #include<string.h> #define N 100 char str1[N4]{0},str2[N4]{0}; int arr1[N4]{0},arr2[N4]{0}; int ans[N5]{0};//将字符串转化成整型…...

aippt:AI 智能生成 PPT 的开源项目
aippt:AI 智能生成 PPT 的开源项目 在现代办公和学习中,PPT(PowerPoint Presentation)是一种非常重要的展示工具。然而,制作一份高质量的PPT往往需要花费大量的时间和精力。为了解决这一问题,aippt项目应运…...

【Qt之·类QSettings·参数保存】
系列文章目录 文章目录 前言一、概述1.1 QSetting是什么1.2 为什么学习QSetting是重要的 二、不同存储位置的优缺点三、 QSetting的高级用法四、实例演示总结 前言 在当今的应用程序开发中,设置管理是一个至关重要的方面。应用程序的设置包括用户偏好、配置选项和其…...

location重定向和nginx代理
文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…...

iptables详解
华子目录 什么是防火墙分类netfilter(数据包过滤)定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...

Edge SCDN深度解析,边缘安全加速的创新实践
边缘安全加速(Edge Secure Content Delivery Network,SCDN)是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术,智能调度使用户就近获取所需内容,为…...

solidworks常见问题已解决
solidworks常见问题已解决 问题1:step总是提示默认模板无效。问题2:异型孔向导”时出现了“找不到标准数据库。问题3:找不到CalloutForm.txt文件,标注将由几何体定义。问题5:工程图显示文件损坏不能保存。问题6&#x…...

vCenter开启HA报错
昨天给客户开启vCenter开启HA功能报错,报错的内容比较多 博通官方给出解决办法 https://knowledge.broadcom.com/external/article/318929/error-vsphere-ha-agent-cannot-be-correct.html 常规的解决办法 1.关闭集群HA,再次开启HA 2.主机进入维护模式,再次加入…...

在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?
make 命令 并不是所有 Ubuntu 系统都默认安装的,但它通常是开发工具链的一部分,许多开发者会在安装系统后配置它。make 是一个非常重要的构建工具,用于自动化编译和构建过程,特别是在编译软件或内核时。 make 的来源 make 是一个…...

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写
问: 我按在要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写? 回答: 问: <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…...

前端使用 Cursor 的最佳助手 - PromptCoder
前端使用 Cursor 的最佳助手 - PromptCoder 你是否正在使用 Cursor 进行前端开发,却苦于繁琐的代码生成和原型图的还原?你是否渴望一个更高效、更智能的工具来提升你的开发效率?那么,你一定不能错过 PromptCoder! Pr…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...