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

系统架构优化是性能优化的一个重要方面,它涉及到对整个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.rhkb.cn/news/15781.html

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

相关文章

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…

机器学习 - 理解偏差-方差分解

为了避免过拟合,我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高,容易导致过拟合。相反,如果限制模型的复杂度,降低其拟合能力,又可能会导致欠拟合。因此,如何在模型…

【STM32】ADC

本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信号…

DeepSeek 助力 Vue 开发:打造丝滑的步骤条

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

基于Python的人工智能驱动基因组变异算法:设计与应用(下)

3.3.2 数据清洗与预处理 在基因组变异分析中,原始数据往往包含各种噪声和不完整信息,数据清洗与预处理是确保分析结果准确性和可靠性的关键步骤。通过 Python 的相关库和工具,可以有效地去除噪声、填补缺失值、标准化数据等,为后续的分析提供高质量的数据基础。 在基因组…

elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)

最近在学习使用elasticsearch,但是在安装插件ik的时候遇到许多问题。 所以在这里开始对elasticsearch做一个深度的研究。 首先提供如下链接: https://github.com/infinilabs/analysis-ik/releases 我们下载elasticsearch-7-17-2的Linux x86_64版本 …

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

力扣 单词拆分

动态规划,字符串截取,可重复用,集合类。 题目 单词可以重复使用,一个单词可用多次,应该是比较灵活的组合形式了,可以想到用dp,遍历完单词后的状态的返回值。而这里的wordDict给出的是list&…

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种: class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示: 每个 class 的字节码文件中都有一个常量池,里面是编译后即知的该 class 会用到的字面量与符号引…

企业数据集成案例:吉客云销售渠道到MySQL

测试-查询销售渠道信息-dange:吉客云数据集成到MySQL的技术案例分享 在企业的数据管理过程中,如何高效、可靠地实现不同系统之间的数据对接是一个关键问题。本次我们将分享一个具体的技术案例——通过轻易云数据集成平台,将吉客云中的销售渠…

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞,全称是Remote Code Execution漏洞,翻译成中文…

深度学习之神经网络框架搭建及模型优化

神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…

STM32自学记录(十)

STM32自学记录 文章目录 STM32自学记录前言一、USART杂记二、实验1.学习视频2.复现代码 总结 前言 USART 一、USART杂记 通信接口:通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 通信协议:制定通信的规则&#x…

Linux --- 如何安装Docker命令并且使用docker安装Mysql【一篇内容直接解决】

目录 安装Docker命令 1.卸载原有的Docker: 2.安装docker: 3.启动docker: 4.配置镜像加速: 使用Docker安装Mysql 1.上传文件: 2.创建目录: 3.运行docker命令: 4.测试: 安装…

Linux磁盘空间使用率100%(解决删除文件后还是显示100%)

本文适用于,删除过了对应的数据文件,查看还是显示使用率100%的情况 首先使用df -h命令查看各个扇区所占用的情况 一、先对系统盘下所有文件大小进行统计,是否真的是数据存储以达到了磁盘空间 在对应的扇区路径下使用du -sh * | sort -hr 命…

Python——批量图片转PDF(GUI版本)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…

HTML 属性

HTML 属性 HTML(超文本标记语言)是构建网页的基础,而HTML属性则是赋予HTML元素额外功能和样式的关键。本文将详细介绍HTML属性的概念、常用属性及其应用,帮助您更好地理解和使用HTML。 一、HTML属性概述 HTML属性是HTML元素的组成部分,用于描述元素的状态或行为。属性总…

【C++八股】 前置 ++i vs. 后置 i++ 的区别

在 C 中&#xff0c; 运算符有前置 i 和后置 i 两种方式&#xff0c;它们都能让变量自增 1&#xff0c;但在执行顺序、性能、应用场景上有所不同。 1. i vs. i 对比表 2. 代码示例 #include <iostream> int main() {int a 5, b 5;std::cout << "a "…

Deepseek-v3 / Dify api接入飞书机器人go程序

准备工作 开通了接收消息权限的飞书机器人&#xff0c;例如我希望用户跟飞书机器人私聊&#xff0c;就需要开通这个权限&#xff1a;读取用户发给机器人的单聊消息 im:message.p2p_msg:readonly准备好飞书机器人的API key 和Secretdeepseek-v3的api keysecret&#xff1a;http…