软考高级架构 —— 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…...
智慧巡检-基于改进RT-DETR的道路交通小目标检测系统(含UI界面、yolov8、Python代码、数据集)基于 PyTorch 和 PyQt5 RT-DETR 或 YOLOv8
智慧巡检-基于改进RT-DETR的道路交通小目标检测系统(含UI界面、yolov8、Python代码、数据集)外接摄像头实时检测识别。以官方yolov8为主干,实现对道路交通小目标检测识别(OpenCV实现对交通目标的检测,训练的分类模型识…...
【Pixel专属Gemini Edge推理引擎】:本地运行LLM不联网、零延迟、功耗降低47%——实测数据首次公开
更多请点击: https://intelliparadigm.com 第一章:Gemini Edge推理引擎的Pixel专属定位与技术边界 Gemini Edge 是 Google 为 Pixel 系列设备深度定制的端侧推理引擎,其核心设计目标并非通用模型部署,而是围绕 Pixel 的硬件协同栈…...
量子电路编译与Trotter分解技术详解
1. 量子电路编译基础与Trotter分解原理量子电路编译是将抽象的量子算法转化为可在实际量子硬件上执行的低级量子门序列的过程。在模拟量子系统动力学时,Trotter-Suzuki分解是最常用的技术之一,它允许我们将连续的量子演化分解为离散的门操作序列。1.1 Tr…...
终极指南:如何永久免费使用Cursor Pro AI编程神器
终极指南:如何永久免费使用Cursor Pro AI编程神器 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial r…...
基于MCP协议构建安全可控的AI智能体数据接入层
1. 项目概述:一个为智能体打造的“安全印章”与“情报中枢”最近在折腾AI智能体(Agent)的开发与集成,发现一个挺有意思的现象:大家把模型能力、工具调用这些“上层建筑”都玩得很溜,但一涉及到让智能体安全…...
5分钟掌握暗黑2存档编辑:免费开源工具d2s-editor完全指南
5分钟掌握暗黑2存档编辑:免费开源工具d2s-editor完全指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2重复刷装备而烦恼?想快速体验不同职业Build却不想从头练级?今天我要…...
RedBox容器编排工具:在Docker与K8s间的轻量级生产实践
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫Jamailar/RedBox。乍一看这个名字,你可能会联想到一个红色的盒子,或者某种特定的工具。实际上,它确实是一个“盒子”,一个用于构建、管理和部署容器化应用的…...
PLINK实战:如何用--het和--hardy参数快速筛查异常样本与SNP位点
PLINK实战:基因组数据质控中的杂合度与哈迪-温伯格平衡分析技巧 拿到测序数据的第一天,实验室新来的博士生盯着满屏的PLINK报表面露难色——那些F值、P值究竟在说什么?为什么隔壁组的文章用0.2过滤杂合度,而合作方坚持要用0.1&…...
DDR内存信号测试难题:芯片中介层原理与实战部署指南
1. 项目概述:当PCB上的DDR内存引脚“无处下针”时作为一名在硬件测试和信号完整性领域摸爬滚打了十几年的工程师,我太熟悉那种场景了:测试工程师拿着示波器探头,对着电路板上密密麻麻的元器件,尤其是那些藏在其他芯片底…...
深度解析Claude源码泄露事件:从Transformer到AI开源生态的技术思考
1. 项目概述与背景解析最近在开发者社区里,关于“noya21th/claude-source-leaked”这个仓库的讨论热度不低。作为一个长期关注AI模型开源生态的从业者,我第一眼看到这个标题时,内心是既好奇又警惕的。简单来说,这是一个在GitHub上…...
