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

一个大型网站架构的演变历程

正序:

Rome was not built in a day(罗马不是一天建成的。)

一个成熟的大型网站从来都不是一蹴而就的,需要经过多次架构的调整和升级,我们熟知的大型网站比如京东、淘宝、亚马逊,它们每天都有巨大的用户访问量也拥有非常大的数据体量,通过对大量数据进行收集,网站又进一步做大数据治理、分析和应用,以此来提高网站的智能,增加用户的粘性。总结一下这些大型网站基本都有以下几种特征:

①:高并发、流量大。
②:高可用,7*24小时不间断的服务。
③:大数据,对海量数据进行分析、治理,再次服务于业务。
④:敏捷开发,迭代快,一般来说1~2周就要迭代一次。
⑤:用户体系庞大。
⑥:可持续升级,技术服务于业务,随着业务量的升级架构也跟着升级。
⑦:安全防范,会面对更多的Web漏洞、服务器漏洞等。
⑧:弹性拓展,可以进行动态扩缩容。
⑨:吞吐量高,响应速度快。

通过上述特性我们了解到了大型网站的厉害之处,但其实它的初始形态是简单的,就像人类演变一样,网站也是一步步从单体 -> 集群 -> 分布式 -> 微服务/容器化 演变而来,都是为了更好的适配当前的用户体量和业务发展。下来就进入到我们的正文环节。
在这里插入图片描述

1. 单向

用户->浏览器->服务器

混沌初开,一个网站最初始的设计形态就是一个“静态网页”,用户单向的在浏览器中进行
内容浏览,而浏览的内容就是服务器通过HTML对一些固定的、已经写好了的“文章”的显示。

2. 双向

用户<->浏览器<->服务器<->数据库

单向的浏览对于用户来说是乏味的,随着技术的发展,我们可以实现用户和服务器之间的
双向交互,而实现的关键就是架构引入了数据库,网站可以对用户的数据进行存储和反馈。

在这里插入图片描述

3. 单体架构

用户<->服务器【war<-> (文件服务器 / 数据库)】

做过早期Java-Web项目兄弟,肯定对Tomcat特别熟悉,这是一款Web服务器,每次做完新的
需求我们都需要将项目打成War包并在Tomcat上进行部署,War包中包含了我们通过的MVC架
构写的后端Java代码也包含了前端的HTMLJSCSS,比之前先进的是,我们还引入了文件
服务器,文件服务器可以存储我们用户的头像、文件等,数据库还是和之前一样,保存用户的
信息。

在这里插入图片描述

4. 服务器分离

用户<-> 服务器(war)<-> 文件服务器 : 数据库 ;
Web服务器、文件服务器 、 数据库分离。

一个服务器的资源是有限的,为了承载更多的业务处理请求,我们将文件服务器和数据库
“搬离”原有服务器,找到新的服务器为他俩“安家”。

在这里插入图片描述

5. 服务器分离+缓存

服务器分离+数据库中间添加缓存中间件

数据库访问是所有性能瓶颈中最常见的,其中主要原因有:
①:数据库的连接数。
②:表数据量大(空间存储问题)。
③:硬件资源限制,硬件资源直接影响QPS每秒查询数/TPS每秒事务数。
其中常见的数据性能优化方案:SQL优化、缓存、创建索引、读写分离、分库分表等,添加
缓存中间件就是缓存的方式,可有效减少对数据库的访问,较少了访问也就不存在上述的性
能瓶颈。

在这里插入图片描述

6. 负载均衡+集群

tomcat应用集群、文件服务器集群、缓存集群、单数据库

孙悟空有很多本领,包括火眼金睛、72变、法天象地等等,但是我最喜欢的还是他的“身外身”
技能,使用此仙术可以以一化十,以十化百,百千万亿之变化。

在这里插入图片描述
集群也很好理解,就是进行自我复制,集群中的每个节点所干的活都是一样的,就算其中一个节点挂掉,也不会影响整个网站的正常使用。

负载均衡就是通过nginx或者其他代理服务器,让每台web服务器所接受的负载(用户请求)能够平均一些,不要抓着一直羊疯狂薅羊毛。

在这里插入图片描述

7. 负载均衡+集群+数据库读写分离、主从复制

读写分离,主从复制:

如果加了缓存集群,数据库的压力还是很大的话,我们就会考虑对数据库进行读写分析,
即增删改的操作在主-数据库,查询的操作在从-数据库。主库定时同步数据至从数据库。

这里主从复制可以推荐一片文章:数据库(mysql)主从复制与读写分离
在这里插入图片描述

8. 负载均衡+集群+分库分表

主数据库集群、从数据库集群、数据库集群间的同步

没啥可说的,单体的下一步永远都是集群,数据库也免不了俗,对数据库进行分库分表就会形
成我们的主-数据库集群(从-数据库集群是对应节点的复制),分库分表后我们数据库的主键
就不能采用自增的方式了,而应该是全局唯一主键。

全局唯一主键生成方式推荐文章:分布式系统全局唯一ID的几种实现方式
在这里插入图片描述

9. 负载均衡+集群+搜索引擎技术

如果我们的业务需求中有模糊查询的需求,我们需要引入搜索引擎技术,而不是直接将模糊
搜索的请求发到数据库,常用的搜索引擎技术就是Elasticsearch,如果需要进行全文搜索
,那么ES就是最好的解决方案。

在这里插入图片描述

10.微服务

 淘宝为例,大型网站项目都会拆成微服务的一个个集群,数据库也需要进行拆分,作为单独的商品、订单的数据库。此时需要考虑分布式事务。   

推荐分布式事务的文章:分布式事务六种解决方案
在这里插入图片描述

11.调优

最后就是对JVMTomcat、数据库、Linux、架构调优... 

在这里插入图片描述

结束语:

天下合久必分、分久必合,网站架构的演变是没有尽头的,也没有绝对的完美架构适配所有
公司,我们能做的就是不断的观察、思考、改变、总结,周而复始...

相关文章:

一个大型网站架构的演变历程

正序&#xff1a; Rome was not built in a day&#xff08;罗马不是一天建成的。&#xff09;一个成熟的大型网站从来都不是一蹴而就的&#xff0c;需要经过多次架构的调整和升级&#xff0c;我们熟知的大型网站比如京东、淘宝、亚马逊&#xff0c;它们每天都有巨大的用户访问…...

前端前沿web 3d可视化技术 ThreeJS学习全记录

前端前沿web 3d可视化技术 随着浏览器性能和网络带宽的提升 使得3D技术不再是桌面的专利 打破传统平面展示模式 前端方向主要流向的3D图形库包括Three.js和WebGL WebGL灵活高性能&#xff0c;但代码量大&#xff0c;难度大&#xff0c;需要掌握很多底层知识和数学知识 Threej…...

链表经典笔试题(LeetCode刷题)

本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳&#xff0c;希望对你有所帮助。 目录 一、移除链表元素 1.1 问题描述 1.2 思路一 1.2.1 分析 1.2.2 代码 1.3 思路二 1.3.1 分析 1.2.3 思路三 1.3 代码实现 1.3.1 思路1的代码 1.3.2 思路2的…...

SpringCloud五大组件

微服务SpringCloud整合技术组件基本流程&#xff1a; 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心&#xff0c;分为Eure…...

Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】

Echart&#xff1f; ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 遵循 Apache-2.0 开源协议&#xff0c;免费商用。 ECharts 兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xf…...

聊聊腾讯T13技术专家被开除

这两天腾讯的技术大佬stonehuang被曝离开腾讯&#xff0c;据他老婆在小红书上发的帖子称是遭遇了裁员&#xff0c;说实话刚看到这个消息我挺震惊的&#xff0c;stonehuang在中国大前端领域是排得上号的专家&#xff0c;同时他2005年就加入了腾讯&#xff0c;在qq空间的发展历程…...

c++ 常见宏、模板用法【1】

目录1、宏定义实现简单的断言2、可变参数模板3、变量模板4、宏定义实现范围内的for循环5、模板实现函数对象6、宏定义实现作用域限定7、类型萃取模板1、宏定义实现简单的断言 #define ASSERT(expr) \if(!(expr)) { \std::cout << "assertion failed: " <&l…...

【25】Verilog进阶 - 序列检测

VL25 输入序列连续的序列检测 本题并不难【中等】难度给高了 【做题关键】 (1)需要使用移位寄存器的思路。其实reg型是寄存器,也可以当做是移位寄存器,重要的是对其的处理,使用的是移位寄存器的思路 (2)注意新移入数据存放在低位 1 题目 + 代码 + TestBench 很简单,没…...

如何绕开运营商的 QoS 限制

运营商针对 UDP 进行限制&#xff0c;这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一&#xff0c;上了线很多问题&#xff0c;丢包&#xff0c;慢等的问题严重增加运维&#xff0c;运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则&#xff0c;只要换一个端口就可…...

C#基础教程22 异常处理

文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...

java八股文--java基础

java基础1.什么是面向对象&#xff0c;谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第四套解析(详细)

2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (4) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...

【Spark】spark使用jdbc连接带有kerberos认证的hive jdbc

背景 这个需求就是spark不通过spark-hive的方式访问hive数据&#xff0c;而是通过spark读取hive jdbc的方式访问hive数据&#xff0c;因为这个hive有kerberos认证&#xff0c;在网上也不是很容易搜索到这样的操作案例。不多bb&#xff0c;直接上教程。 准备工作 准备一个hiv…...

【Maven】项目中pom.xml坐标定义以及pom基本配置

目录 一、pom.xml坐标定义 二、pom 基本配置 一、pom.xml坐标定义 在 pom.xml 中定义坐标&#xff0c;内容包括&#xff1a;groupId、artifactId、version&#xff0c;详细内容如下&#xff1a; <!--项目名称&#xff0c;定义为组织名项目名&#xff0c;类似包名-->&l…...

Linux GCC 编译详解

文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介 首先&#xff0c;什么是编译器呢&#xff1f; 我们可以使用编辑器&#xff08;如 linux 下的 vi、windows 下…...

谁说程序员不懂了浪费,女神节安排

Python的PyQt框架的使用一、前言二、女神节文案三、浪漫的代码四、官宣文案一、前言 个人主页: ζ小菜鸡大家好&#xff0c;我是ζ小菜鸡&#xff0c;特在这个特殊的日子献上此文&#xff0c;希望小伙伴们能讨自己的女神欢心。 二、女神节文案 1.生活一半是柴米油盐&#xff0c…...

上市公司管理层短视指标(2007-2020)

1、数据说明&#xff1a;将研发⽀出的减少量&#xff08;∆R&D&#xff09;作为管理层短视⾏为的度量指标&#xff0c;即∆R&D为公司t年的研发⽀出减去t-1年的研发⽀出并除以t-1年末的总资产再乘以100。2、数据来源&#xff1a;自主整理3、时间跨度&#xff1a;2007-20…...

IDDPM 和 DDIM 对比

IDDPM 和 DDPM 对比IDDPMDDIMIDDPM IDDPM&#xff1a;Improved Denoising diffusion probabilistic models learning Σθ\Sigma_{\theta}Σθ​&#xff0c; 即Σθ(xt,t)exp⁡(vlog⁡βt(1−v)log⁡β~t)\Sigma_{\theta}\left(x_{t}, t\right)\exp \left(v \log \beta_{t}(1…...

链表OJ题(上)

✅每日一练&#xff1a;876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 定义快慢指针&#xff0c;让快指针走2步&#xff0c;慢指针走1步&#xff0c;当fast或者fast.next为空时&#xff0c;走完链表&#xff0c;此时slow就是中间位置 pub…...

【题解】百度2021校招Web前端工程师笔试卷(第一批):单选题、多选题

题目来源&#xff1a;牛客网公司真题_免费模拟题库_企业面试|笔试真题 (nowcoder.com) 若有错误请指正&#xff01; 单选题 1 某主机的 IP 地址为 212.212.77.55&#xff0c;子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组&#xff0c;则目的地址可以是&…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...