分布式架构 高并发处理

article/2025/9/25 15:33:35

分布式架构 高并发处理


高并发介绍

  • 在同时或者极短时间内,有大量请求到达服务端,每个请求都需要服务端耗费资源进行处理,并做出相应反馈
  • 服务端比如同时开启进程数,能同时运行的线程数、网络连接数、CPU运算、I/O、内存都是有限,
    所以服务端能同时处理请求也是有限的。高并发本质就是资源的有限性
    如:1.系统在线人数10W,并不意味系统并发用户是10W,可能存在10w用户同时在首页查看静态文章,并未对服务器进行发送请求
    那么高并发数 是根据系统真实用户数并发送请求需要服务端耗费资源进行处理的请求
    2.服务端只能开启100个线程,恰好1个线程处理一个请求需要耗时1s,那么服务端1s只能处理100个请求,多余请求无法处理

经典案例

  • 商品、活动秒杀下订单

准备阶段

  • 系统独立部署
  • 做好系统容量规划(7-7.5折计算),系统优化、系统容灾限流等方案
  • 做好系统拆分,如:功能模块、实时/非实时、动态/静态等
  • 参加活动商品设置定时上架时间
  • 服务器时间同步(集群中每台机器时钟要保持一致)
  • 动态生成下单页面的URL

分布式架构图

实现阶段

客户端层面:

  • 前端页面采用h5静态化,ajax获取动态内容;如实时库存、活动状态、当前时间等
  • 做CDN部署加速
  • 静态页面和资源缓存 如:(图片)
  • JS针对请求过滤,减少请求发送到达服务端 如:(获取验证码、时间截止或已售空自动结束等)

Web端层面:

  • F5/LVS+Nginx接收高并发请求、并做负载均衡
  • Lua脚本+Redis做请求队列,针对有效请求用List排队,并实现一些基本操作(限流、账号参加次数检查、同一IP请求数检查)
    Redis单线程高性能,每秒处理100W请求,如果大于100W请求如何处理呢?
    1.可以结合Lua脚本控制请求数量并限流,有效减少redis压力;比如100W请求,过滤20W,还剩80W,无效请求直接返回客户端不到达服务端
    2.如果应用非常庞大,用户流量高额,Redis单节点做成集群模式,请求处理数量也随之增加
  • Varnish缓存静态页面和静态资源
  • Tomcat集群,预处理,通过业务场景判断用户是具备参加活动资格、账号是否正常、是否在黑名单等

逻辑层面:

  • 按照Redis请求队列进行先后处理
  • 纯内存操作+异步(通过Redis完成减库存,1.利用Redis的watch事物 2.利用Redis脚本Lua原子操作减库存)

高并发产生问题,分析思考

  • 服务端处理响应会逐渐变慢,甚至会丢失部分请求不处理,严重会导致服务器崩溃
  • 客户端(app\h5)、前端请求(nginx/varnish)、web服务器(webServer)、web应用(rmi/dubbo/远程调用)、缓存(redis/membercache)、消息队列(mq)、数据库(db)都会面临高并发等问题

高并发优化思路

客户端层面

  • 尽量减少请求数量,充分利用客户端、浏览器自身缓存,如微服务前后端交互、网络传输详细记载,本文不在详叙
  • 尽量减少对服务端资源不必要浪费,如重复请求连接后端打开/关闭操作连接池

Nginx层面

  • 动静分离,静态资源直接返回
  • 负载均衡,如F5/LVS分流多个Nginx
  • 根据系统业务,单独拆分访问(路径)

Varnish层面

  • 动态内容缓存、减少访问后端服务
  • 使用页面片段缓存技术,如ESI

Web服务器层面

  • 针对JVM配置进行合理优化
  • 服务器配置进行优化,如:调整内存数量、线程数量等
  • 相同服务部署多台机器,实现负载均衡
  • 增加资源,如增加网络带宽、高性能服务器、高性能数据库 (立杆见效,服务器普通硬盘换SSD,数据库换物理机等)
  • 请求分流
    1.使用集群:如之前1台处理100个请求,增加两台后,3台机器虚拟组成一个集群后,对外处理请求可以提升到300*80%=240
    2.采用微服务架构,后续微服务架构高可用会详细描述

Web应用层面(优化应用程序)

  • 提高单个请求的处理速度,如上如果处理一个请求消耗从1s降低到0.5秒,并发就是200
  • 耗时业务同步根据业务情况 使用mq异步处理
  • 比如导入、导出耗时耗力 合理使用多线程批量处理、指向单台应用独立处理
  • 高效使用缓存,减少锁的使用范围
  • 优化访问数据库SQL
  • 尽量避免远程调用、大量I/O等耗时操作
  • 合理规划事物等比较耗资源操作
  • 部分业务考虑采用预计算处理,减少实时计算耗资源操作 如:报表
  • 不要盲目使用RPC、netty、http远程网络调用,如需特定调用注意加上超时时间

数据库层面

  • 合理使用数据库引擎 如 mysql的InnoDB和MyISAM引擎
  • 数据库系统参数配置优化
  • 特殊复杂计算耗时操作可以考虑使用存储过程来处理
  • 数据库集群,进行读写分离
  • 合理设计数据库表结构、索引 如(组合索引)
  • 分库、分区、分表降到单库单表并发量
  • 合理使用Nosql,如传统、分布式数据库共存,根据数据特性合理存放(hbase、hive、mongoDB)

总结:

高并发并不只是单一渠道等问题,本文主要讲述高并发涉及场景等具体详细优化思路。
优化原则 分析定位哪个环节链路是高并发瓶颈,进行优化分而治之,最终提高请求处理速度。
笔者建议优化顺序如下
1.web应用层面 核心优化web应用层面,80%高并发等问题都和低效应用程序有关系。
2.web服务器层面
3.客户端层面
4.nginx层面
5.varnish层面
6.数据库层面

作者简介:张程 技术研究

更多文章请关注微信公众号:zachary分解狮 (frankly0423)

在这里插入图片描述


http://chatgpt.dhexx.cn/article/sZMTmDFq.shtml

相关文章

iis高并发处理三

使用.NET开发的Web应用程序部署到IIS上后,当有大量用户并发访问,用户在访问的时候可能会出现页面打开慢或无法打开的情况,那么从服务器上的IIS上我们可以做以下调整,让应用支持10万级以内的并发访问。 1、调整IIS 应用程序池队列…

前端优化之高并发处理

大部分的高并发处理基本都是在后端处理,但是在部分特殊情况下,后端无法阻止用户行为,需要前端做配合。例如在抢购、秒杀等场景。 高并发是什么? 对此,我们首先需要简单的去了解一下,高并发是什么&#xff1…

机器学习中的核函数与核方法(是什么?为什么?怎么做?)

我们在学习机器学习的时候,总是会看到一个概念——核,然后看到一堆公式。但是为什么要核呢?核到底是啥玩意?云里雾里。接下来,我们将要把“核”这个东西的神秘面纱一点点揭开。 一、什么是“核函数” 我们都知道&…

【Kernel Method】Kernel Method核方法介绍

引言 核方法是20世纪90年代模式识别与机器学习领域兴起的一场技术性革命。其优势在于允许研究者在原始数据对应的高维空间使用线性方法来分析和解决问题,且能有效地规避“ 维数灾难”。在模式识别的特征抽取领域,核方法最具特色之处在于其虽等价于先将原…

通俗理解核方法(kernel function)

最近对核方法比较有兴趣,想了解一下,在网上查阅了很多资料,感觉说的很晦涩,没有理解,于是查看了李政轩老师的课程,对其有了一定程度上的理解,本博客目的为了记录,也为了加深理解。 …

电机选型及校核方法总结

序:原先最初是没打算写电机选型总结的,而是准备写一些关于数字信号处理相关的东西,但是我的一个朋友提醒了我。他说,现在网上关于数字信号处理的东西写的太多了,特别是基础的知识都写烂了,你再写也没人看&a…

核方法与核技巧

本文对核方法(kernel method)进行简要的介绍。 核方法的主要思想是基于这样一个假设:“在低维空间中不能线性分割的点集,通过转化为高维空间中的点集时,很有可能变为线性可分的” ,例如下图 左图的两类数据…

机器学习中的核方法(Kernel Method)

说到机器学习中的核方法(Kernel Method),大部分人应该是在学习SVM的时候认识到它或者听说它。它的基本思想是说,普通的SVM分类超平面只能应对线性可分的情况,而对于线性不可分的情况我们则需要引入一个Kernel,这个Kernel可以把数据集从低维映射到高维,使得原来线性不可分…

支持向量机原理小结(3)——核方法和非线性支持向量机

前面两篇博客对线性支持向量机进行了详细的讲解,但线性SVM对于非线性的数据是无可奈何的。这篇博客将讲一下非线性支持向量机。 1. 核方法 对SVM有过一定耳闻的人,一定听说过“核技巧”、“核方法”这些名词,其实核方法并不是只能应用于SVM&…

核方法以及核函数讲解

核方法的主要思想是基于这样一个假设:“在低维空间中不能线性分割的点集,通过转化为高维空间中的点集时,很有可能变为线性可分的” ,例如下图 左图的两类数据要想在一维空间上线性分开是不可能的,然而通过F(x)(x-a)(x-…

MLAPP————第十四章 核方法

第十四章 核方法 14.1 简介 到目前为止,我们书上提到的各种方法,包括分类,聚类或者是其它的一些处理手段,我们的特征都是固定大小的一个向量,一般具有如下的形式,。然而,对于某些类型的对象&a…

核方法的理解

核方法在非线性分类问题上有很好的解决思路,应用于学习器SVM以及降维KPCA上,当然二者路径也不同,SVM就是从低维不可分映射到高维可分,而KPCA是从低维不可分映射到高维后再降维到低维可分,但都脱离不来这个核方法。 核…

核方法原理

核方法原理 1.无力的线性分类器 一般情况下,我们考虑构造一个线性分类器来解决问题。但是实际中,线性分类器的效果达不到要求,因为大部分数据都不是线性可分的,如下面这幅图。一种改进的方法是把多个弱的线性分类器组合得到一个强…

核方法(kernel method)的主要思想

kernel method是针对低维线性不可分而提出的一种解决方法,在PRML中有一章节的介绍,对其理解,也是迭代更进的过程。 简单来说,kernel method是一种低维和高维特征空间映射的方法,利用低维内积的函数来表征高维内积&…

python svm核函数_Python.SVM(三)核方法

Python.SVM(三)核方法 1 什么是核方法 往简单里说,核方法是将一个低维的线性不可分的数据映射到一个高维的空间、并期望映射后的数据在高维空间里是线性可分的。 我们以异或数据集为例:在二维空间中、异或数据集是线性不可分的;但是通过将其映…

核方法回归

参考论文-DENSITY ESTIMATION FOR STATISTICS AND DATA ANALYSIS 给定数据集,来估计概率密度函数 Histograms The naive estimator 也是分成段的平行x轴直线连接起来 The kernel estimator 其中kernel可以是高斯核,结果图: 可以见到,高斯核…

【机器学习】SVM核方法

https://blog.csdn.net/qq_32742009/article/details/81430534 Kernel Trick 在 SVM 中引入核方法便可使得 SVM 变为非线性分类器,给定非线性可分数据集 ,如下图所示,此时找不到一个分类平面来将数据分开,核方法可以将数据投影到…

核函数与核方法整理

一些之前提到过的知识, 对核函数相关进行详细梳理和串联. 根据胡老师建议的重点, 学习了一下: 核函数公式,作用,选择, 调参, 如何简化运算 目录 SVM回顾 严格线性可分问题 近似线性可分 核函数 什么是核函数 如何使用核函数 为什么要用核函数 …

核方法也称为核技巧(Kernel method)

简介 核函数是干嘛的? 核方法的好处#套用ice110956的说法 1. 在线性与非线性间架起一座桥梁,低维空间里面数据特征是非线性的,没法儿用线性方法解决,当数据特征映射到高维的时候,可以用线性方法解决。 2. 通…

Kernel Method核方法—应用与理解

前一篇主要梳理了几个基本概念以及相关关系,这一篇主要针对核方法的应用进行讨论,并理解核方法的思想,了解为什么要引入核方法。 核方法在机器学习中是一种灵活的技术,主要归结为两个方面: 非线性问题转换为高维线性…