软件架构之前后端分离架构服务器端高并发演进之路

软件架构之前后端分离架构&服务器端高并发演进之路

  • 前后端分离架构
      • 从业务角度
      • 从质量属性
      • 从性能角度
  • 服务器端关于不同并发量的演进之路
    • 1. 单体架构
    • 2. 第一次演进:应用服务器和数据库服务器分开部署
    • 3. 第二次演进:引入本地缓存和分部署缓存
    • 4. 第三次演进:引入反向代理和负载均衡
    • 5. 第四次演进:数据库读写分离
    • 6. 第五次演进:[分库] 数据库按业务分库
    • 7. 第六次演进:[分表] 把大表拆分成小表
    • 8. 第七次演进:使多个Nginx负载均衡
    • 9. 第八次演进:通过DNS轮询实现机房之间的负载均衡
    • 10. 第九次演进:引入NoSQL数据库和搜索引擎等技术
    • 11. 第十次演进:大应用拆分为小应用
    • 12. 第十一次演进:复用的功能抽离成微服务
    • 13. 第十二次演进:引入企业服务总线ESB屏蔽服务接口的访问差异
    • 14. 第十三次演进:引入容器化技术实现运行环境隔离与动态服务管理
    • 15. 第十四次演进:以云平台承载系统

首先,当一个项目刚起步的时候,不能预知后续的访问量和并发能达到多少,在初步开发的架构选型中,采用前后端分离的架构。关于前后端分离架构,其优势如下:

前后端分离架构

前后端分离是一种软件系统架构模式,它将应用程序的前端和后端分离开发和部署。在这种架构中,前端和后端是独立的系统,通过API(应用程序接口)进行通信。

从业务角度

前后端分离架构可退可进,目前是一个应用刚起步的最基本架构。将前后端分离开来,则前端只需要负责跟人机进行交互,关注业务流程。后端则只需要关注算法数据,运算逻辑等。

从质量属性

前端关注易用性,美观;后端注重扩展性、可用性和性能。

从性能角度

前端消耗内存和带宽;后端有效消耗CPU。前后端消耗计算机硬件分工不同。前端考虑怎么跟人进行有效交互,后端则把重心放在怎么跟计算机打交道更高效稳定。

这样的前后端分离架构,使得在消耗计算机硬件如高性能、高可用方面能够有效剥离出来,只用一心一意的考虑把后端代码达到性能更优 下面介绍服务器端的性能优化演进之路。

服务器端关于不同并发量的演进之路

1. 单体架构

当一个项目在初期起始阶段,应用数量与用户数量都比较少,此时的应用服务器(如Tomcat)和数据库服务器部署在同一台服务器上,以淘宝为例:浏览器往www.taobao.com发起请求时,首先经果DNS服务器(域名解析系统)把域名转换成实际IP地址10.102.4.1,浏览器转而访问该IP对应的
Tomcat。
在这里插入图片描述
但是随着用户数量的增加,Tomcat和数据库之间竞争资源,单机性能不足以支撑业务。

2. 第一次演进:应用服务器和数据库服务器分开部署

Tomcat和数据库分别独占服务器资源,通过增加服务器分担应用的方式,显著的提高了两者各自的性能。
在这里插入图片描述
但是随着用户数量的增长,并发读写数据库成为了性能的瓶颈。

3. 第二次演进:引入本地缓存和分部署缓存

在Tomcat同服务器或者同JVM、中增加本地缓存,并在外部增加分布式缓存,缓存热点数据的HTML页面等。通过缓存能把绝大多数请求在读写数据库前拦截掉,大大降低数据库的压力。
在这里插入图片描述
缓存虽然抗住了大部分的访问请求,但是随着用户数量的增长,并发的压力还是主要落在了单机的Tomcat上,响应逐渐变慢。

4. 第三次演进:引入反向代理和负载均衡

在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个Tomcat中。
在这里插入图片描述
虽然反向代理使用服务器可以支持的并发量大大增加,但是并发量的增加也意味着更多请求穿透到数据库,单机的数据库最终会成为性能瓶颈。

5. 第四次演进:数据库读写分离

把数据库划分为读库和写库,读库可以有多个,通过同步机制把写库的数据同步到读库,对于需要查询最新写入数据的场景,可以在缓存中多写一份,通过缓存获得最新数据。
在这里插入图片描述
但是随着业务逐渐变多,不同业务之间的访问量差距较大,不同业务直接竞争数据库资源,相互影响性能。

6. 第五次演进:[分库] 数据库按业务分库

把不同业务的数据保存到不同的数据库中,使业务之间的资源竞争降低。对于访问量大的业务,可以部署更多的服务器来支撑。
在这里插入图片描述
但是随着用户数量的增长,单机的写库会逐渐达到性能瓶颈。

7. 第六次演进:[分表] 把大表拆分成小表

比如针对评论数据,可以按照商品的ID进行Hash,路由到对应的表中存储;针对支付记录,可以按照支付的小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。只要实时操作的表数据量足够小,请求能够足够均匀地分发到多台服务器上的小表,那数据库就能通过水平扩展的方式来提升性能。
在这里插入图片描述
虽然数据库和Tomcat、都能够水平扩展,可以支撑的并发量大幅提升,但是随着用户量的增长,最终单机的Nginx会成为性能上的瓶颈。

8. 第七次演进:使多个Nginx负载均衡

由于性能瓶颈在Nginx,因此无法通过两层的Nginx来实现多个Nginx的负载均衡。LVS和F5是工作在网络第四层的负载均衡解决方案,其中LVS是软件,运行在操作系统内核态,可对TCP请求或更高层级的网络协议进行转发,因此支持的协议更丰富,并且性能也远高于Nginx,可假设单机的LVS可支持几十万个并发的请求转发;F5是一种负载均衡硬件,与LVS提供的能力类似,性能比LVS更高,但价格昂贵。由于LVS是单机版的软件,若LVS所在服务器宕机则会导致整个后端系统都无法访问,因此需要有备用节点。可使用keepalived软件模拟出虚拟IP,然后把虚拟IP绑定到多台LVS服务器上,浏览器访问虚拟IP时,会被路由器重定向到真实的LVS服务器,当主LVS服务器宕机时,keepalived软件会自动更新路由器中的路由表,把虚拟IP重定向到另外一台正常的LVS服务器,从而达到LVS服
务器高可用的效果。
在这里插入图片描述
由于LVS也是单机的,随着并发数量增长到几十万时,LVS服务器最终会达到性能瓶颈,此时用户数量达到千万甚至上亿级别,用户分布在不同的地区,与服务器机房距离不同,导致了访问的延迟会明显不同。

9. 第八次演进:通过DNS轮询实现机房之间的负载均衡

在DNS服务器中可配置一个域名对应多个IP地址,每个IP地址对应到不同的机房里的虚拟IP。当用户访问www.taobao.com时,DNS服务器会使用轮询策略或其他策略,来选择某个IP供用户访问。此方式能实现机房间的负载均衡,至此,系统可做到机房级别的水平扩展,千万级到亿级的并发量都可通过增加机房来解决,系统入口处的请求并发量不再是问题。
在这里插入图片描述
但是随着数据的丰富程度和业务的发展,检索、分析等需求越来越丰富,单单依靠数据库无法解决如此丰富的需求。

10. 第九次演进:引入NoSQL数据库和搜索引擎等技术

当数据库中的数据多到一定规模的时候,数据库就不适用于复杂查询了,往往只能满足普通查询的场景。对于统计报表的场景,在数据量大时不一定能跑出结果,而且在跑复杂查询时会导致其他查询变慢。
在这里插入图片描述
引入更多组件解决了丰富的需求,业务维度能够极大扩充,但随之而来的是一个应用包含了太多的业务代码,业务的升级迭代变得困难。

11. 第十次演进:大应用拆分为小应用

按照业务板块来划分应用代码,使单个应用的职责更清晰,相互之间可以做到独立升级迭代。
在这里插入图片描述
但是不同的应用之间可能存在共用的模块,由应用单独管理会导致相同的代码存在多份,导致公共功能在升级时全部应用代码要跟着升级。

12. 第十一次演进:复用的功能抽离成微服务

如用户管理、订单、支付、鉴权等功能在多个应用中都存在,那么可以把这些功能的代码单独抽取出来形成一个单独的服务来管理,这样的服务就是所谓的微服务,应用和服务之间通过HTTP、TCP或RPC请求等多种方式来访问公共服务,每个单独的服务都可以由单独的团队来管理。
在这里插入图片描述
但是由于不同服务的接口访问方式不同,应用代码需要适配多种访问方式才能使用服务。此外,应用访问服务,服务之间也可能互相访问,调用链将会变得非常复杂,逻辑变得混乱。

13. 第十二次演进:引入企业服务总线ESB屏蔽服务接口的访问差异

通过ESB统一进行访问协议转换,应用统一通过ESB来访问后端服务,服务与服务之间也通过ESB来互相调用,以此降低系统的耦合程度。这种单个应用拆分为多个应用,公共服务单独抽出来管理,并使用企业总线来解除服务之间耦合问题的架构,就是所谓的SOA(面向服务)架构。
在这里插入图片描述
但是随着业务不断发展,应用和服务都会不断变多,应用和服务的部署变得复杂,同一台服务器上部署多个服务还要解决运行环境冲突的问题。此外,对于如大促这类需要动态扩缩容的场景,需要水平扩展服务的场景,就需要在新增的服务器上准备运行环境,部署服务等,运维将变得十分困难。

14. 第十三次演进:引入容器化技术实现运行环境隔离与动态服务管理

目前最流行的容器化技术是Docker,最流行的容器管理服务是Kubernetes(K8S),应用/服务可以打包为Docker镜像,通过K8S来动态分发和部署镜像。Docker镜像可理解为一个能运行你的应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动Docker镜像就可以把服务起起来,使服务的部署和运维变得简单。
在这里插入图片描述

15. 第十四次演进:以云平台承载系统

TODO

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

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

相关文章

录屏没有声音?录制声音,3招教你搞定

在录制屏幕内容时,声音是不可或缺的要素之一,可以有效地增强录制视频的表现力和传达效果。然而,有时候可能会遇到录屏没有声音的情况,这可能会让录制的视频失去一部分重要信息。本文将为您介绍录屏录声音的3种方法,帮助…

nios里面打开eclipse遇到Unresolved inclusion: “system.h“等问题

问题:在Nios中打开软核部分代码时,遇到一堆Unresolved inclusion: "system.h"等问题报错 原因:bsp文件和软核没关联,导致找不到头文件地址,关联一下就好 解决步骤: 右键bsp文件,点击…

肖sir__设计测试用例方法之等价类02_(黑盒测试)

设计测试用例方法之等价类02_(黑盒测试) 一、掌握常用的设计方法: 黑盒测试方法:等价类、边界值,状态迁移法、场景法、判定表、因果图、正交表,(7种) 经验测试方法:错误推测法、异常…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):857 标注数量(xml文件个数):857 标注类别数:2 标注类别名称:["luotu","n…

数学建模:相关性分析

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 数学建模:相关性分析 文章目录 数学建模:相关性分析相关性分析两变量的相关分析PearsonSpearmanKendall tua-b 双变量关系强度测量的指标相关系数的性质代码实现example偏相关分析 相…

尚硅谷SpringMVC (9-13)

九、HttpMessageConverter HttpMessageConverter ,报文信息转换器,将请求报文转换为 Java 对象,或将 Java 对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型: RequestBody , ResponseBody &#xff…

使用Docker安装和部署RabbitMQ

🚀 1 拉取RabbitMQ Docker镜像 首先,使用Docker命令从Docker Hub拉取RabbitMQ官方镜像。打开终端并运行以下命令: docker pull rabbitmq🚀 2 创建RabbitMQ容器 一旦镜像下载完成,使用以下命令创建RabbitMQ容器&…

linux复习笔记01(小滴课堂)

1.安装CentOs7系统 点击下一步在自定义硬件中: 我们可以删除我们不使用的,后续如果需要再加上即可。 然后我们就可以开启这台虚拟机了。 我们可以进行下载cetos7. 这里选择简体中文就可以。 时间的设置。 可以开启下网络。 在这里选择设置root密码&#…

高忆管理:证券账户国债逆回购怎么操作?

国债逆回购的本质就是一种短期贷款,个人经过国债回购商场把自己的资金借出去,取得固定的利息收益,那么,证券账户国债逆回购怎样操作?怎样在股票账户上买国债逆回购?下面高忆管理为我们准备了相关内容&#…

嵌入式面试笔试刷题(day14)

文章目录 前言一、进程控制块1.PCB控制块的作用2.PCB的存储位置 二、进程的三级映射三、return , exit, pthread_exit四、pthread_join作用五、互斥锁和信号量的区别六、怎么判断链表是否有环总结 前言 本篇文章继续我们的刷题之路。 一、进程控制块 这里只讲解进程的PCB控制…

内网隧道代理技术(二十)之 CS使用HTTP代理上线不出网机器

CS使用HTTP代理上线不出网机器 CS工具自带上线不出网机器 如图A区域存在一台中转机器,这台机器可以出网,这种是最常见的情况。我们在渗透测试的过程中经常是拿下一台边缘机器,其有多块网卡,边缘机器可以访问内网机器,内网机器都不出网。这种情况下拿这个边缘机器做中转,…

Laravel 表单验证器的常用的2种使用方法

1、使用控制器的 validate 方法进行参数验证 场景一:前后端未分离 /*** 保存一篇新的博客文章。** param Request $request* return Response*/ public function store(Request $request) {$this->validate($request, [title > required|unique:posts|max:2…

基于神经网络结合紫外差分光谱的二氧化硫浓度定量预测

基于神经网络结合紫外差分光谱的二氧化硫浓度定量预测 前言一、代码运行1. 解压数据2. 导包3. 读取数据4. 构建网络5. 设置优化器6. 模型训练7. 可视化loss8. 模型验证 二、结果展示三、总结作者简介 前言 二氧化硫(SO2)是一种常见的环境污染物&#xff…

电梯五方对讲接口说明 Sip五方对讲使用说明

1.2/4线接线模块输出接口;接4方对讲设备:12V,2/4线接线模块供电输入 -:GND,接地 R二/四线R Li二四线L 2.RS-485接口:预留援口,可接读卡器、楼层控制器、探头,需要软件额外开发实现。 3.短路输出接口2:对应短路输入接口&#x…

【C++】DICOM医学影像工作站PACS源码

PACS即影像存档与传输系统,是医学影像、数字化图像技术、计算机技术和网络通讯技术相结合的产物,是处理各种医学影像信息的采集、存储、报告、输出、管理、查询的计算机应用程序。 PACS是基于DICOM标准的医学影像管理系统,其模块覆盖了从影像…

【USRP】产品型号、参数、架构全解析系列 6:N320 / N321

一、USRP 简介 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发,被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过以太网线连接到主机&am…

ZooKeeper基础命令和Java客户端操作

1、zkCli的常用命令操作 (1)Help (2)ls 使用 ls 命令来查看当前znode中所包含的内容 (3)ls2查看当前节点数据并能看到更新次数等数据 (4)stat查看节点状态 (5&#xf…

区块链实验室(20) - FISCO控制台连接到指定的节点

在FISCO技术文档中,控制台默认采用config.toml作为配置文件,并指定了连接的节点地址和商品,如下所示。 [network] peers["127.0.0.1:20200", "127.0.0.1:20201"] # The peer list to connect在该案例中,控…

数据结构:栈的实现

1. 栈(Stack) 1.1 栈的概念 栈(Stack)是只允许在一端进行插入或删除操作的线性表.首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作.进行数据插入和删除操作的一端叫栈顶,另一端称为栈底.栈中的元素遵循后进先出LIFO(Last In First Out)的原则 压栈:栈的插…

【算法系列篇】分治-归并

文章目录 前言什么是归并算法1. 排序数组1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 数组中逆序对2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 计算右侧小于当前元素的个数3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 翻转对4.1 题目要求4.2 做题思路4.3 Java代码实现 总…