软考高级架构 —— 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. 培训与意识提升

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488903.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angular图表echarts设置

angular框架ngx-echarts图表的配置 图表高度设置 默认高度是400px 可以自己动态设置容器高度 <div echarts nz-row nzJustify"start" [options]"option" [style.height]"option.echartHeight"></div>option.echartHeight‘600px’…

FastAPI vs Flask 选择最适合您的 Python Web 框架

文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域&#xff0c;FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能&#xff0c;但是在某些方面有所不同。本文将比较 FastAPI…

[SAP ABAP] DEBUG ABAP程序中的循环语句

在ABAP程序开发中可能会遇到要DEBUG循环语句的情况&#xff0c;这个循环语句可能会执行上万次&#xff0c;但我们希望程序执行循环到100次就停下来&#xff0c;也就是希望DEBUG断点设置在循环语句的第100次停下来观察执行的结果&#xff0c;这时我们可以在DEBUG程序时通过设置一…

服务器部署,用 nginx 部署后页面刷新 404 问题,宝塔面板修改(修改 nginx.conf 配置文件)

如果你的项目使用了 vue&#xff0c;并使用了路由且路由配置为 history 模式&#xff0c;就会出现这种情况。 当你使用 nginx 部署前端项目时&#xff0c;发现页面刷新或不用根目录访问页面时&#xff0c;出现404页面 宝塔面板 解决方法&#xff1a;修改 nginx 配置&#xff…

学习思考:一日三问(思考篇)之路由表

学习思考&#xff1a;一日三问&#xff08;思考篇&#xff09;之路由表 学了什么&#xff08;是什么&#xff09;Destination/Mask&#xff08;最终目标&#xff0c;寻路必须&#xff09;Proto&#xff08;择优可选&#xff09;Pre&#xff08;择优可选&#xff09;Cost&#x…

【Rive】Android与Rive交互

1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationViewandroid:id"id/rive_view"android:layout_width"match_parent"android:layout_height"match_parent"android:adjustViewBounds"…

nginx反向代理(负载均衡)

nginx的代理 代理 四层代理 七层代理 正向代理和缓存的配置方式 &#x1f42d;&#x1f42e;&#x1f42f;&#x1f430;&#x1f409;&#x1f40d;&#x1f434;&#x1f411;&#x1f412;&#x1f414;&#x1f436;&#x1f437; 反向代理》负载均衡 负载均衡&#xff…

常见的网络攻击手段

IP 欺骗 IP 是什么? 在网络中&#xff0c;所有的设备都会分配一个地址。这个地址就仿佛小蓝的家地址「多少号多少室」&#xff0c;这个号就是分配给整个子网的&#xff0c;「室」对应的号码即分配给子网中计算机的&#xff0c;这就是网络中的地址。「号」对应的号码为网络号…

使用IP自签名SSL证书

最近需要创建WebSocket服务器并使用SSL证书&#xff0c;由于是内网测试&#xff0c;所以需要使用指定IP的自签SSL证书。 其实笔者前面博文 使用nexus3作为Docker镜像仓库 解决nexus3登录x509: certificate has expired or is not yet valid 中有创建过相应的证书&#xff0c;这…

神经网络权重矩阵初始化:策略与影响

文章目录 一、权重矩阵初始化&#xff1a;神经网络训练的关键起点&#xff08;一&#xff09;初始化的重要性及随机特性&#xff08;二&#xff09;不同初始化方法的探索历程零初始化&#xff1a;简单却致命的选择&#xff08;仅适用于单层网络&#xff09;标准初始化&#xff…

react-dnd 拖拽事件与输入框的文本选中冲突

问题描述 当我们使用拖拽库的时候&#xff0c;往往会遇到拖拽的一个元素他的子孙元素有输入框类型的dom节点&#xff0c;当拖拽的事件绑定在该元素身上时候&#xff0c;发现子孙的输入框不能进行文本选中了&#xff0c;会按住鼠标去选中文本的时候会触发拖拽 实际的效果&…

【构建工具】现代开发的重要角色

你可能有所听闻构建工具&#xff0c;但是不知道是干什么的&#xff0c;或者是开发中用到了&#xff0c;大概会使用&#xff0c;但是想理解一下具体的工作原理等&#xff0c;那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时&#xff0c;可以把它…

【环境搭建】Jeecg-Boot v3.5.0 Docker搭建

前言 最近需要复现JeecgBoot的SQL注入漏洞&#xff0c;必须要搭建JeecgBoot v3.5.0这个版本才行&#xff0c;DockerHub没人push这个版本的&#xff0c;相关博客也比较少&#xff0c;所以自己来搭建&#xff0c;记录一下过程。 前置环境 Ubuntu 20.04Docker version 27.3.1do…

如何通过编译器标志增强移动应用的安全性

作为一名 Android 或 iOS 开发者&#xff0c;您可能已经熟悉一些常见的安全开发最佳实践&#xff0c;比如验证外部输入、合理管理内存以及避免使用弱加密算法。然而&#xff0c;即便是最精心编写的代码&#xff0c;也可能包含一些 bug&#xff0c;其中一些可能会导致可被利用的…

华为eNSP:VRRP

一、VRRP背景概述 在现代网络环境中&#xff0c;主机通常通过默认网关进行网络通信。当默认网关出现故障时&#xff0c;网络通信会中断&#xff0c;影响业务连续性和稳定性。为了提高网络的可靠性和冗余性&#xff0c;采用虚拟路由冗余协议&#xff08;VRRP&#xff09;是一种…

前端请求后端接口报错(blockedmixed-content),以及解决办法

报错原因&#xff1a;被浏览器拦截了&#xff0c;因为接口地址不是https的。 什么是混合内容&#xff08;Mixed Content&#xff09; 混合内容是指在同一页面中同时包含安全&#xff08;HTTPS&#xff09;和非安全&#xff08;HTTP&#xff09;资源的情况。当浏览器试图加载非…

【随心记】---- vue表格n-form中自定义增加必填星号

【如上图所示】&#xff1a;自定义增加星号样式 【思路】&#xff1a; 通过插槽实现 【代码】&#xff1a;通过vue的插槽实现自定义样式 <n-form-item-gi label"提示函正文" path"fileList" :span"12"><template #label><div>…

元宇宙时代的社交平台:Facebook的愿景与实践

随着科技的不断进步&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念逐渐走进了人们的视野。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在这场元宇宙革命中扮演着重要角色。Meta不仅在不断扩展其社交平台的边界&#xff0c;还…

HtmlRAG开源,RAG系统联网搜索能力起飞~

网络是RAG系统中使用的主要外部知识来源&#xff0c;许多商业系统&#xff0c;如ChatGPT和Perplexity&#xff0c;都使用网络搜索引擎作为他们的主要检索系统。传统的RAG系统将网页的HTML内容转换为纯文本后输入LLM&#xff0c;这会导致结构和语义信息的丢失。 HTML转换为纯文…

人工智能大语言模型起源篇(一),从哪里开始

序言&#xff1a;许多人最初接触人工智能都是在ChatGPT火热之际&#xff0c;并且大多停留在应用层面。对于希望了解其技术根源的人来说&#xff0c;往往难以找到方向。因此&#xff0c;我们编写了《人工智能大语言模型起源篇》&#xff0c;旨在帮助读者找到正确的学习路径&…