大型网站架构演化总结
本文图解大型网站架构演化。
目录
1、单一应用服务阶段
2、应用与数据服务分离阶段
3、利用缓存提高性能阶段
4、应用服务集群阶段
5、数据库读写分离阶段
6、反向代理与CDN加速阶段
7、分布式数据库阶段
8、 NoSQL与搜索引擎阶段
9、业务拆分阶段
10、分布式服务阶段
总结
1、单一应用服务阶段
所有的大型网站都是由最小型的网站架构演变而来的。回想一下你最开始写服务端代码,是不是数据库MySQL在本地,服务器也是本地,那最初阶段也是这样的,网站的流量也不大,通常就将应用服务、数据服务、文件资源等所有资源都放在一台服务器上,比如我们学java web的时候,都是利用Tom等Web容器开始运行应用服务程序,比如JSP,然后需要数据库的时候用JDBC去连接本地Mysql Server。

2、应用与数据服务分离阶段
经过业务发展迭代增加,用户量、日活的上升,简单的一台服务器就搞不定了。比如可能由于用户产生的数据量过多导致存储空间不够,而一台服务器同时得处理数据服务和用户的应用web响应,CPU资源有限的情况下,是无法满足用户想要快速响应需求的,网站的访问数据变得越来越慢,而数据服务和应用服务所对计算机资源的需求是不一样的,比如应用服务器需要更多的CPU资源,给这台服务器配上多几核的CPU,数据服务可能需要与磁盘打交道,配备更多的闪存。
这时候就将应用服务和数据服务进行分离。将应用服务器单独出来,专注于响应web请求,提高用户的访问速度,将数据库单独放在一台服务器,专注于处理与应用服务器打过来的数据请求,将文件资源放在一台服务器上,与应用服务器打交道,为其提供文件服务。

3、利用缓存提高性能阶段
随着用户的再增加,业务的再次升级。网站有面临了一个数据库服务的压力太大而导致整体的访问效率下降,再次影响用户的访问体验。
你可以想象,我们日常的微博、抖音那些热点数据,是几个每个打开这些应用的人会请求到的。所以二八定律永远存在,80%的请求在20%的数据上。所以这个时候将这20%的数据进行高校的缓存起来,这样网站整体的性能又可以提升了。
缓存可以分为两种:一种的直接缓存在应用服务器上,另外是一种开一台缓存服务器进行缓存。后者可以进行很好的弹性伸缩,而前者会受到本地容量的限制。我们称后者服务器为:分布式缓存服务器。

4、应用服务集群阶段
当使用缓存后,数据库的访问压力得到有效缓解。再次随着业务的增加,单一应用服务器能够并发处理的请求连接有限,在流量的高峰期,应用服务器开始成为整个系统的性能瓶颈。
因此这个时候就开始组件应用服务器集群,不仅应用服务器有集群,缓存服务器等也可以组成集群。那么既然有了服务器集群,那对于这些请求,到底应该有哪台服务器响应呢。所以负载均衡调度服务器就出现了。
通过负载均衡调度服务器,可将来自浏览器的访问请求分发到应用的集群中的任何一台服务器上。使用服务器集群也有个好处,Web 应用程序更新可以做到用户无感知,当有一个节点的服务器宕机之后,也不影响整体的请求。

5、数据库读写分离阶段
虽然增加了数据缓存这一层。比如利用redis缓存,但是随着用户量的不断增加。总有一些是无法通过缓存提高的,比如还可能出现缓存过期、缓存没有命中等情况。那么这些请求全部会打到数据库服务器上,这个时候数据库服务成为了整个系统的瓶颈。所以数据读写分离就出现了。
目前大部分的数据库都提供了一个主从热备的功能。通过配置主从两台服务器,当应用服务器往主服务器写入诗句时,利用主从复制机制将数据更新同步到从数据库上。读写分离之后,数据库的性能瓶颈就解决了。

6、反向代理与CDN加速阶段
当网站业务再次升级,用户规模再次扩大,为了满足不同地区的用户访问速度,提高响应速度,CDN和反向代理就出现了,两者基本原因都是缓存。
CDN就是内容分发网络,你的请求响应服务器会从距离你最近的一个服务器集群上响应回来,比如你在云南,可能就从云南的机房响应。
而反向代理则部署在中心机房,当请求来到中心机房后,首先访问的时候反向代理服务器,看看是否名字缓存,如果命中则直接返回。

7、分布式数据库阶段
分布式数据库是系统数据库拆分的最后手段,这只有在单表数据规模非常大的时候才会用,一般的数据库拆分都是对业务拆分后将不同的业务数据部署在不同的服务器上。

8、 NoSQL与搜索引擎阶段
当成为大型系统的时候,搜索成为了日常需求,这时会采用NoSQL和搜索引擎来提高搜索效率,缓存的时候redis也是NoSQL类型的。

9、业务拆分阶段
当业务日渐的增多,可能团队人员也不利于管理,这个时候大型的系统都会进行业务拆分,比如抖音就拆了很多很多业务线。每条业务线服务不同的服务,每个服务都单独进行部署,可以通过消息队列进行数据分发。

10、分布式服务阶段
随着业务拆分越来越小,存储系统越来越庞大,应用系统的整体复杂度呈指数级增加,部署维护越来越困难。
既然每一个应用系统都需要执行许多相同的业务操作,比如用户管理、商品管理等,那么可以将这些共用的业务提取出来,独立部署。由这些可复用的业务连接数据库,提供共用业务服务,而应用系统只需要管理用户界面,通过分布式服务调用共用业务服务完成具体业务操作。

总结
目前很少有人能经历上面的系统演进,大部分大型的系统已经成型,而小系统可能又很可能撑不到成为大系统,所以很少有人能经历这些,不过了解这些,我们对于整个系统架构的理解非常有帮助。
相关文章:
大型网站架构演化总结
本文图解大型网站架构演化。 目录 1、单一应用服务阶段 2、应用与数据服务分离阶段 3、利用缓存提高性能阶段 4、应用服务集群阶段 5、数据库读写分离阶段 6、反向代理与CDN加速阶段 7、分布式数据库阶段 8、 NoSQL与搜索引擎阶段 9、业务拆分阶段 10、分布式服务阶…...
5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型
5G智能制造纺织工厂数字孪生可视化平台,推进纺织行业数字化转型。纺织工业作为传统制造业的重要组成部分,面临着转型升级的紧迫需求。随着5G技术的快速发展,智能制造成为纺织工业转型升级的重要方向。数字孪生可视化平台作为智能制造的核心技…...
仿牛客网项目---Elasticsearch分布式搜索引擎
1.什么是ElasticSearch分布式搜索引擎? Elasticsearch是一个开源的分布式搜索引擎,提供实时的、高可用性的搜索和分析解决方案。它支持快速索引和搜索大规模数据,具有分布式架构、RESTful API、基于JSON的查询语言等功能,适用于各…...
macbook pro 2018 安装 arch linux 双系统
文章目录 友情提醒关于我的 mac在 mac 上需要提前做的事情复制 wifi 驱动 在 linux 上的操作还原 wifi 驱动连接 wifi 网络磁盘分区制作文件系统挂载分区 使用 archinstall 来安装 arch linux遗留问题 友情提醒 安装 archl linux 的时候,mac 的键盘是没法用的&#…...
虚拟机安装CentOS教学,超详细一步安装到底!
首先将Centos的镜像文件进行下载,随后再进行安装配置: https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso 1.打开VMware,新建虚拟机,选择典型安装,点击下一步 2.选择稍…...
“2024杭州智慧城市及安防展会”将于4月在杭州博览中心盛大召开
2024杭州国际智慧城市及安防展览会,将于4月24日在杭州国际博览中心盛大开幕。这场备受瞩目的盛会,不仅汇集了全球智慧城市与安防领域的顶尖企业,更是展示最新技术、交流创新理念的重要平台。近日,从组委会传来消息,展会…...
【C++庖丁解牛】模拟实现STL的string容器(最后附源码)
📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.vs和g下string结构…...
不要在代码中随便使用try...catch了
前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…...
网络编程(3/6)
使用C语言完成数据库的增删改 #include<myhead.h> int do_add(sqlite3 *ppDb) {int numb;char name[50];int salary;printf("请输入员工信息:工号、姓名、薪水\n");scanf("%d %s %d",&numb,name,&salary);char sql[128];char *e…...
(day 2)JavaScript学习笔记(基础之变量、常量和注释)
概述 这是我的学习笔记,记录了JavaScript的学习过程,我是有一些Python基础的,因此在学习的过程中不自觉的把JavaScript的代码跟Python代码做对比,以便加深印象。我本人学习软件开发纯属个人兴趣,大学所学的专业也非软件…...
Spring Boot中全局异常处理器
文章目录 1.Spring Boot中两种异常处理方式2.为什么需要全局异常处理呢?3. 全局异常处理器测试4.ControllerAdvice 详解5.ExceptionHandler 详解 1.Spring Boot中两种异常处理方式 要想解决测试中存在的问题,我们需要对程序中可能出现的异常进行捕获&am…...
【JAVA重要知识 | 第七篇】Java异常知识总结(声明、抛出、捕获异常)
7.Java异常知识总结(声明、抛出、捕获异常) 7.1异常定义 在程序运行过程中,如果JVM检测出一个不可能执行的操作时,就会出现运行时错误(runtime error)。在Java中,运行时错误会作为异常抛出。异…...
SSM整合项目(Vue3环境搭建)
SSM整合项目(Vue3环境搭建) 1.下载node.js 1.卸载原来的node.js 2.检测是否卸载成功 3.下载node.js(10.16.3) 一路next就可以 4.检测是否安装成功 2.全局安装Vue插件cli 命令行输入 npm install -g vue/cli 3.新建Vue项目 1.…...
Golang 方法的接收器 receiver 指针和值的区别
一、如果receiver是指针类型 package mainimport "fmt"type Count struct {count int }func main() {c : Count{count: 0}c.incr()fmt.Println(c.count)c2 : &cc2.incr()fmt.Println(c2.count) }func (c *Count) incr() {c.count }//打印结果 1 2 incr 方法的 …...
【蓝桥杯】节省时间
一、对于string类型变量的连接,可以直接用“”或者“”来进行字符串的直接连接 string a"1"; string b"2"; string c; cab"12"; string操作符两边既可以都是string类型,也可是string与char类型 注意: (1)“”…...
矩阵乘法--Strassen算法
一、矩阵乘法 从中可以看出,计算两个矩阵的乘积,需要三个 for 循环,可以简单写出代码: for(int i1;i<m;i)for(int j1;j<p;j)for(int k1;k<n;k)c[i][j]a[i][k]*b[k][j]; 时间复杂度的分析:很明显,…...
Unity笔记:C#基础(1)
杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中,string是不可变的,这意味着对string对象的操作通常会返回一个新的string对象,而不会修改原始的string对象。因此,几乎所有涉及更改string内…...
计算机科技与心理学的紧密交织:一场跨学科的深度对话
随着信息技术的飞速发展,计算机科学与心理学这两门看似迥异的学科日益呈现出密不可分的关系。本文将深入探讨计算机科学与心理学之间的相互影响和融合,揭示二者在研究方法、应用实践以及对未来社会发展的影响等方面的高度关联性。 计算机科学为心理学研究…...
【JAVA类】利用接口的多继承实现———图书管理系统【附源码】
引言 在我们学习了一些java的基础语法之后,需要把这些知识点可以串起来,这里使用一个简单的小项目可以很好的帮助我们牢记这些知识点,今天就带大家学习一个有关java的小项目,很多学校也经常把这个项目作为他们的课程设计——经典的…...
Linux进程概念僵尸进程孤儿进程
文章目录 一、什么是进程二、进程的状态三、Linux是如何做的?3.1 R状态3.2 S状态3.3 D状态3.4 T状态3.5 t状态3.6 X状态3.7 Z状态 四、僵尸进程4.1 僵尸进程危害 五、孤儿进程 一、什么是进程 对于进程理解来说,在Windows上是也可以观察到的,…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
