当前位置: 首页 > news >正文

软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护

10.6 大型网站系统架构演化实例

        大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,主要解决这类问题。        

1. 单体架构

  • 特点: 所有资源(应用程序、数据库、文件)集中在一台服务器上。
  • 适用场景: 小型网站,用户和数据量较少。
  • 限制: 随用户增长,性能和存储空间成为瓶颈。

2. 垂直架构

  • 优化: 应用程序与数据分离,分为应用服务器、文件服务器、数据库服务器。
  • 优势:
    • 根据不同需求优化硬件配置(CPU、内存、硬盘)。
    • 数据存储和业务处理能力提升。
  • 挑战: 数据库压力依然会随着用户增长增加。

3. 引入缓存

  • 原因: 数据访问遵循“二八定律”,80%的访问集中在20%的数据。
  • 方法:
    • 本地缓存:快速但受服务器内存限制。
    • 远程分布式缓存:支持大规模缓存,性能更稳定。
  • 效果: 缓解数据库访问压力,但应用服务器连接数有限,成为瓶颈。

4. 应用服务器集群

  • 解决方案: 使用负载均衡器,将用户请求分配到多个应用服务器。
  • 优势:
    • 通过横向扩展增加服务器,提升系统可伸缩性。
    • 不依赖更强大的单台服务器。

5. 数据库读写分离

  • 问题: 写操作和部分读操作仍集中在主数据库,负载高。
  • 优化:
    • 主数据库负责写操作。
    • 从数据库通过主从复制承担读操作。
    • 数据访问模块实现透明的读写分离。
  • 效果: 数据库性能进一步提升。

6. 反向代理与 CDN

  • 目标: 缓解因区域网络差异导致的访问延迟问题。
  • 方法:
    • CDN: 部署在网络提供商机房,用户从最近位置获取内容。
    • 反向代理: 缓存服务器,用户请求优先访问代理缓存内容。
  • 效果: 提升响应速度,降低后端服务器负载。

7. 分布式文件与数据库

  • 问题: 单一数据库或文件服务器无法满足持续增长需求。
  • 解决方案:
    • 分布式文件系统: 将文件分布在多个服务器上。
    • 分布式数据库: 拆分业务数据库,减少单表数据规模。
  • 效果: 支持海量数据存储与高并发访问。

8. 引入 NoSQL 与搜索引擎

  • 原因: 数据结构复杂,传统关系型数据库难以满足需求。
  • 优化:
    • NoSQL: 提供分布式、弹性的数据存储。
    • 搜索引擎: 加速复杂数据检索。
  • 效果: 更灵活的数据存储与查询能力。

9. 业务拆分

  • 目标: 按产品线拆分网站(如首页、订单、用户等)。
  • 方法:
    • 每个产品线独立部署为单独应用。
    • 应用间通过消息队列或共享数据存储系统通信。
  • 效果: 降低单一应用复杂度,提高团队开发效率。

10. 分布式服务化

  • 挑战: 应用复杂度增高,维护成本增加。
  • 解决方案:
    • 提取共用业务逻辑为分布式服务(如用户管理、订单管理)。
    • 应用通过服务调用完成具体操作。
  • 效果: 简化应用间依赖关系,提升开发与运维效率。

10.7 软件架构维护

  1. 架构知识管理

    • 定义:包含架构设计和设计决策,用于解释架构方案的选择原因。
    • 目标:确保关键设计知识不会因人员流失或变更而丢失,支持架构的演化和长期可维护性。
    • 现状:架构知识文档化实践较少,主要由于动机不足、文档维护成本高等问题。
  2. 架构修改管理

    • 建立隔离区域以最小化修改影响,明确修改规则和类型。
    • 追踪修改的副作用和影响范围,提升修改过程的可靠性。
  3. 架构版本管理

    • 提供演化控制和度量基础,支持静态与动态演化分析。
    • 利用矩阵方法分析架构演化的波及效应,量化组件的贡献和影响。
  4. 架构可维护性度量

    • 圈复杂度(CCN):衡量架构复杂程度,用于早期风险评估,推荐值≤10。
    • 扇入扇出度(FFC):表示模块与其他模块的交互频率,高值表明模块关联密集。
    • 模块间耦合度(CBO):评估模块依赖关系的程度,高耦合模块维护风险高。
    • 模块响应度(RFC):衡量模块提供的功能数量及其复杂性。
    • 紧内聚度(TCC) 和松内聚度(LCC):表示模块内部组件的协作程度,评估模块内聚性。

评估方法与结果

  • 将系统组件图导出为数据文件(如XML),利用架构评估工具计算各项指标。
  • 示例系统的计算结果显示:
    • 高度关联的模块(如RSApplication)FFC和CBO较高,维护风险较大。
    • 独立模块(如UserDB)度量值较低,复杂性和耦合程度较小。
    • 组件内聚性仅适用于包含子模块的组件,如ClientApplication

建议与实践

  1. 文档化和知识管理

    • 推动团队建立有效的架构知识管理机制,使用工具化手段记录设计决策。
    • 定期复盘设计决策的长期影响,提升架构演化的可预测性。
  2. 自动化与工具支持

    • 应用架构评估工具(如MSAES)自动化度量指标计算,减少人工误差。
    • 在设计初期及演化关键点评估CCN、CBO等指标,指导后续优化。
  3. 培训与意识提升

    • 强化团队成员对架构知识记录和分享重要性的理解。
    • 鼓励在开发过程中注重长远可维护性而非短期利益。

相关文章:

软考高级架构 —— 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 (测试类&#xf…...

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 特性&#xff…...

C语言——高精度问题

1、高精度计算的本质&#xff1a;竖式计算&#xff1b; 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&#xff1a;AI 智能生成 PPT 的开源项目 在现代办公和学习中&#xff0c;PPT&#xff08;PowerPoint Presentation&#xff09;是一种非常重要的展示工具。然而&#xff0c;制作一份高质量的PPT往往需要花费大量的时间和精力。为了解决这一问题&#xff0c;aippt项目应运…...

【Qt之·类QSettings·参数保存】

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

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&#xff08;数据包过滤&#xff09;定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...

Edge SCDN深度解析,边缘安全加速的创新实践

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

solidworks常见问题已解决

solidworks常见问题已解决 问题1&#xff1a;step总是提示默认模板无效。问题2&#xff1a;异型孔向导”时出现了“找不到标准数据库。问题3&#xff1a;找不到CalloutForm.txt文件&#xff0c;标注将由几何体定义。问题5&#xff1a;工程图显示文件损坏不能保存。问题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.主机进入维护模式&#xff0c;再次加入…...

在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?

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

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写

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

前端使用 Cursor 的最佳助手 - PromptCoder

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

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...