软考高级架构 —— 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…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...