长春火车站属于哪个区,阿里云网站备案时间,微信公众号人工咨询电话,h5″wordpress软件架构之前后端分离架构服务器端高并发演进之路 前后端分离架构从业务角度从质量属性从性能角度 服务器端关于不同并发量的演进之路1. 单体架构2. 第一次演进#xff1a;应用服务器和数据库服务器分开部署3. 第二次演进#xff1a;引入本地缓存和分部署缓存4. 第三次演… 软件架构之前后端分离架构服务器端高并发演进之路 前后端分离架构从业务角度从质量属性从性能角度 服务器端关于不同并发量的演进之路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