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

性能优化中的系统架构优化

系统架构优化是性能优化的一个重要方面,它涉及到对整个IT系统或交易链上各个环节的分析与改进。通过系统架构优化,可以提高系统的响应速度、吞吐量,并降低各层之间的耦合度,从而更好地应对市场的变化和需求。业务增长导致的性能问题推动架构的发展,系统架构的演变过程来分析系统性能与调优方式。

系统性能优化的核心思想主要包括节约和平衡两个方面。节约意味着尽可能地减少不必要的资源消耗;而平衡则是指在遇到瓶颈时,寻找一种方式将资源从紧张的部分转移到相对宽松的部分,以达到整体性能的最大化 。

一、单机架构

传统的架构模型中Web服务与APP服务在一台服务器上(Web服务做页面渲染,APP应用程序执行业务逻辑)。随着业务的增长,单节点的Web服务或者APP服务不堪重负,毕竟机器硬件提供的性能服务是有限的。在程序无法优化的情况下,最直接的办法是增强机器性能。或者把web服务和APP服务拆分。

图片

同样虽则和业务的快速增长会继续出现性能瓶颈,尤其是以DB的性能瓶颈最常见。例如DB承受的IO压力大,导致IO等待,从而影响客户体验。对于Web&App服务频繁读写文件也会导致IO瓶颈,例如日志(业务日志,访问日志等)写,实际上多数性能瓶颈最终都落到磁盘瓶颈上。

为了满足性能要求,通常我们会进行性能优化,当我们进行单系统性能调优后仍然无法满足性能要求时,我们只有分而治之的方法,于是就有了集群架构方案。

二、集群架构

集群架构中Web&App服务都可以用多台机器来进行负载分担,DB的瓶颈也可以采用分区,分库,分表的方式来缓解(分库,分区,分表的宗旨是减小遍历范围,提高响应速度)。

另外,还可以采用读写分离的方式来减轻单台服务器的IO负担,相当于增加了机器的处理能力。读写分离比较适合以读操作为主的应用,可以减轻写服务器的压力,但是读服务器会有一定的延迟。当一些热点数据过多时,我们还可以对这些热点数据进行缓存。

图片

对于负载均衡层,目前主要是在TCP/IP协议的四层与七层进行负载分发。四层负载流行的LVS(LVS集群采用IP负载均衡技术和基于内容请求分发技术,目前互联网公司大量使用此技术),F5(强大的商业交换机,好处是快,但就是贵)。七层流行的有Tengine,Nginx,Haproxy,Vanish、ATS,Squiddeng 。目前互联网企业多采用LVS+Tengine/Nginx的组合来实现负载均衡。

集群架构基本能解决多数企业的性能问题,但缺点也比较明显。多个Web服务器之间的用户请求状态需要同步(为保证高可用,如果其中一台宕机,另一台服务器能够正常处理用户请求,专业术语叫Session 黏滞),这会消耗不少的CPU资源。另外,数据库实现读写分离后,数据同步(数据一致性保证)成为一个性能问题,大量数据的同步IO会面临瓶颈。而且业务量大以后,数据的安全保障机制也会受到挑战,备份问题凸显,因此也催生了分布式架构发展。

Seesion  黏滞 

Session黏滞,也称为会话保持(Sticky Sessions)或粘滞会话(Sticky Sessions),是指在负载均衡环境中的一种机制,它确保来自同一个客户端的请求总是被路由到同一台后端服务器上处理。这种机制对于需要维护用户状态的应用程序特别重要,比如那些依赖于session信息进行用户身份验证、购物车内容保存等操作的Web应用程序。

实现Session黏滞有几种常见的方法:

基于客户端IP地址的会话保持:这是最简单的方法之一,即根据发出请求的客户端IP地址来决定将请求发送到哪一台后端服务器。例如,在Nginx中可以通过配置ip_hash来实现这一功能。

基于Cookie的会话保持:在这种模式下,负载均衡器会在客户端的第一个响应中插入一个特殊的cookie,这个cookie包含了指向特定后端服务器的信息。当客户端再次发起请求时,负载均衡器读取这个cookie并将请求定向到相应的服务器。

分布式Session管理:另一种方法是让所有参与负载均衡的服务器共享session数据,这样无论请求被发送到哪一台服务器,都可以访问到相同的session信息。这种方法可以通过使用数据库、文件系统或者内存缓存(如Memcached或Redis)来实现。

三、分布式架构

系统分层,系统服务化(SOA架构,微服务化等),服务分布式,DB分布式,缓存分布式及良好的水平扩展能力是当前分布式架构的典型特征。哪一个服务性能不佳,直接增加机器即可,性能与机器数量呈线性增长关系,从而解决前面架构遇到的问题。

图片

为什么要进行服务化?

集群架构基本上能够解决多数企业的业务性能需求,但是如果换成大厂(百度,腾讯,阿里等),以他们的QPS来说,这样的架构支撑就比较勉强了。

首先,业务复杂度变高,导致程序实现难度增加,出错率也大大增加,不利于代码的维护和管理;大量业务融合在一个系统中导致耦合度太差,运营管理也比较麻烦,业务相互影响,其中一部分出问题很可能导致另一部也会出问题。也解决这样的问题,我们自然会想到进行业务隔离,把系统中若干主要功能拆分成多个子项目,降低开发难度,更加便于维护。使用不同的war包,不同的服务器进行发布,每个服务器完成特定的业务功能,这就是服务化。

其次,我们也会遇到一些较长的业务链路,往往性能问题是某一个功能性能低下导致的,这就造成在运维及分析时都极不方便。如果把长的业务链条拆分为多个子业务,在分析时就方便了。

业务拆分后将会面临着系统间的集成。如果业务链路上有一个服务比较耗时,而请求是阻塞式,那么我们要一直等待响应结果,这样的用户体验并不好,那么我们可以使用消息机制来解藕,上游系统请求发送到消息中间件,下游系统从消息中间件获取消息后处理,解放上游系统,节省上游系统在等待时浪费的资源,从而利用这些资源来搞业务处理能力。

为什么要用缓存,缓存哪些数据?

我们知道, 从磁盘中读取数据相比从内存中读取数据慢很多,所以在实际业务中大量使用缓存,一般缓存的数据以读居多。

以Linux为例,我们用vmstat命令可以看到buff ,cache 的监控信息。

buff对块设备的读写进行缓冲来缓解CPU与块设备的速度差,因此CPU非空闲等待时间会更少。

Cache给文件做缓冲,直接把内容放在内存,因此CPU访问时更快,减少CPU的IO等待。

例如,客户信息,产品信息等,我们在应用系统中可以缓存到内存,不用每次都从DB中查询。用过Hibernate的朋友应该知道其支持二级缓存。对于缓存产品,目前流行的,成熟的有Redis,memcache等。一些秒杀场景直接使用Redis作为数据持久化介质。

另外,缓存也用来保存用户请求状态,Web服务器之间再也不用同步用户Session状态。

阅读后若有收获,不吝关注,分享,在看等操作!!!


http://www.kler.cn/a/541211.html

相关文章:

  • vi 是 Unix 和 Linux 系统中常用的文本编辑器
  • 机器学习 - 理解偏差-方差分解
  • 【JVM详解二】常量池
  • Games202 Lecture11 LTC | Disney principled BRDF | NPR
  • 除了webpackPrefetch,还有什么其他预加载组件的方法?
  • win32汇编环境,结构体的使用示例一
  • (五)Spring Boot学习——spring security +jwt使用(前后端分离模式)
  • 【文本处理】如何在批量WORD和txt文本提取手机号码,固话号码,提取邮箱,删除中文,删除英文,提取车牌号等等一些文本提取固定格式的操作,基于WPF的解决方案
  • [2025年最新]2024.3版本idea无法安装插件问题解决
  • 思科模拟器配置VRRP-详细
  • 【MySQL — 数据库基础】深入解析MySQL的聚合查询
  • 【进程与线程】如何编写一个守护进程
  • Linux——信号的保存与处理
  • 火爆的DeepSeek大模型怎么和智能家居结合?
  • 在 Windows 系统中如何快速进入安全模式的两种方法
  • Android LifecycleOwner 闪退,java 继承、多态特性!
  • 从零开始:使用Jenkins实现高效自动化部署
  • 【Mybatis】动态 SQL:代码与数据的灵动共舞,奏响数据库查询的华丽乐章
  • 在CT107D单片机综合训练平台上实现外部中断控制LED闪烁
  • BUU34 [BSidesCF 2020]Had a bad day1 【php://filter】
  • 【机器学习】数据预处理之数据归一化
  • Vue 中的自定义指令是什么?如何使用?
  • WPS接入DeepSeek模型
  • 【Elasticsearch入门到落地】7、文档操作
  • 爬虫技巧汇总
  • 【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )