软考高级架构 —— 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…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
