当前位置: 首页 > 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…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

2021-03-15 iview一些问题

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

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...