您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

高并发的前后端的一般处理

时间:2020-08-02 12:00:04  来源:  作者:

虽然在开发过程中,有些功能可能不需要考虑高并发情况,但是时刻考虑高并发场景处理,是程序员开发过程的一个很好的编程习惯,这种好的习惯也让开发出来的制品比较稳定靠谱。(本文更多探讨代码层面相关的,比较粗浅,服务架构方面的不涉及,>_<)

高并发的前后端的一般处理

 

高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

  • 响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
  • 吞吐量:单位时间内处理的请求数量。
  • QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。 并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。

以下讨论基于的编程语言和使用框架分别为:

php:Laravel框架

JAVA:SpringBoot框架

中间件:redis、Kafka

数据库:MySQL、MongoDB

服务器:linux

服务器集群:k8s

一般对于高并发的处理,按照优先级先后顺序为:

前端 --》 Nginx --》Web应用 --》 服务器 --》数据库

我们就以一个抢购页面为例,来说明一下高并发场景下的一些处理。

一、前端页面

由于活动页的大部分信息都是固定不变的,所以考虑到网络数据加载优化,一般活动页会生成一个静态页面。而页面中的抢购按钮会根据活动时间和服务端返回的时间,显示剩余多少抢购时间。(这里需要使用服务端返回的当前时间来计算剩余多少时间,因为客户端的时间,第一不一定标准,第二有可能客户会人为的调整)

为了防止用户重复点击按钮,也需要控制一下,在用户点击提交按钮之后,按钮禁用。

二、Nginx

这里主要用到nginx的重写规则,访问某个活动页,通过nginx重写规则,查找是否存在缓存页面,若存在则直接返回,若不存在则进入页面程序。这个时候需要应用程序里面添加生成缓存页面的机制,这样下次再访问页面时就可以走缓存页面而不用进入程序里面。(Nginx本身也可以配置限流,但是这里不作为主要考虑对象,它作为性能优越的代理服务器,发挥自身的优势就行了)

三、Web应用

1、缓存

使用缓存,主要还是为了减轻数据库方面的压力,这里有两个原则。

第一,缓存的信息基本上不会变动,不能将很容易变动的数据缓存起来,那么将失去缓存的意义

第二,缓存数据一致性,比如将活动信息缓存起来,后端将活动信息调整时,同样的也需要修改缓存

第三,缓存的时效性,需要指定缓存的失效时间,比如设置活动结束之后失效

2、CDN加速

3、消息队列(异步)

在抢购过程中,生成订单可能是需要耗费一点时间的,如果让用户等待,可能造成很不好的下单体验。所以此时会考虑将非必要的业务处理放在异步去处理,比如使用kafka,将处理业务推送一条消息,然后让异步程序去执行生成订单,此时就可以返回一个友好提示给用户,让用户在订单中心查看生成订单结果。

4、Redis

redis中有个原子性的方法也可以控制并发—setnx,对于业务不是非常复杂的数据请求来说,比如只需要防止客户重复提交,就可以利用setnx来控制。

//标志是否可以开启事务
boolean do_transaction = true;

//锁标志,一般以数据ID或者用户ID组合形成唯一标志
String redis_index = 'REDIS_'+data_id;

//设置锁,后面的值用于后续判断锁是否过期,防止死锁发生
Integer result = Redis.setnx(redis_index, time() + 50 );

//如果result为1表示设置redis的key成功,可以进行事务提交
if (result != 1) {

	Long previous_transaction_timeout = Redis.get( redis_index );

	//如果上次提交事务的超时时间大于当前时间,事务可能还在处理中;反之事务已经超时,造成死锁,需要重新提交事务
	if ( previous_transaction_timeout >= time()) {
		do_transaction = false;
	} else {

		Redis.delete( redis_index );

		result = Redis.setnx( redis_index , time() + 50 );
		if (result != 1) {
			do_transaction = false;
		}

	}
}

if ( !$do_transaction ) {
	return '您的请求太频繁啦~';
}

//进行事务处理

设置成功,返回 1 。 设置失败,返回 0 。即使多个并发同时执行setnx,也只是存在一个能够正确设置并返回1。为了防止死锁发生,我们可以将redis_val设置成一个过期时间戳,若第一步sentnx没有成功,那么判断redis_val是否已经过期,若过期,则删除当前redis_key,重新调用sentnx。

四、服务器

这里主要用到负载均衡和限流,系统对于访问的数据列承载和处理能力是有限的,所以需要通过限流和负载均衡,将请求分一分,达到最大的优化程序。比如某个节点一次性只能处理500个并发,但是实际场景里面可能会有上万的并发请求,如果不进行处理,系统直接就崩溃了。

对于微服务架构来说,会将服务转移到不同的微服务上,比如订单微服务、会员微服务、促销微服务、商品库存微服务等等。微服务架构需要考虑微服务治理。

五、数据库

请求已经落到数据库这里的时候,说明前面各个节点该优化的都已经优化完了,只能用数据库硬钢了。数据库的一般优化和处理为:

1、水平分割,比如存储日志表,可以按照日期后缀去区分保存,例如log_20200101

2、根据实际用到的查询条件,查看数据库索引是否建立,然后已经建立的索引是否合理

3、数据冗余,有些时候必须得连表才能获取到额外的信息,我们可以考虑适当的增加一些冗余字段

补充:数据库数据方面,需要考虑是否有些数据可以进行清理或者转移备份



Tags:高并发   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,...【详细内容】
2021-12-08  Tags: 高并发  点击:(23)  评论:(0)  加入收藏
一、幂等性概念在数学里,幂等有两种主要的定义。1、在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下唯一两个幂等实数为0和...【详细内容】
2021-10-09  Tags: 高并发  点击:(43)  评论:(0)  加入收藏
原文链接: https://mp.weixin.qq.com/s/MTw7z6n_wk4y4CTmGkoRoA一切要从CPU说起你可能会有疑问,讲多线程为什么要从CPU说起呢?原因很简单,在这里没有那些时髦的概念,你可以更加清...【详细内容】
2021-08-13  Tags: 高并发  点击:(96)  评论:(0)  加入收藏
题目:高并发情况下,数据库该如何设计?Java高级面试题:为什么要分库分表( 设计高并发系统的时候 , 数据库层面该如何设计 ) ? 用过哪些分库分表中间件 ? 不同的分库分表中间件都有什么...【详细内容】
2021-06-18  Tags: 高并发  点击:(119)  评论:(0)  加入收藏
1. 目的撰写本文的目的是解决微服务架构,对静态数据资源没有规整,所有微服务都是从数据库直接读取,导致性能较差,用户体验不好。通常在高可用的分布式架构中,一般都会采用将这部...【详细内容】
2021-03-17  Tags: 高并发  点击:(157)  评论:(0)  加入收藏
元旦期间 订单业务线 告知 推送系统 无法正常收发消息,作为推送系统维护者的我正外面潇洒,无法第一时间回去,直接让 ops 帮忙重启服务,一切好了起来,重启果然是个大杀器。由于推...【详细内容】
2021-01-07  Tags: 高并发  点击:(146)  评论:(0)  加入收藏
本文主要介绍的微服务是spring cloud,它一个服务治理框架和一系列框架的由序集合,其利用springboot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册、负载...【详细内容】
2020-10-20  Tags: 高并发  点击:(105)  评论:(0)  加入收藏
一、什么是分布式?分布式更多的是一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段,该领域需要解决的问题极多,在不同的技术层面上,又包括:分布式文件系统...【详细内容】
2020-10-14  Tags: 高并发  点击:(91)  评论:(0)  加入收藏
作为热点频出的电商系统,经常遇到高并发,热点秒杀的场景。我们在开发设计高并发海量业务请求的系统时,通常利用三板斧:缓存、降级和限流来保障系统稳定性。...【详细内容】
2020-09-27  Tags: 高并发  点击:(68)  评论:(0)  加入收藏
前言一台服务器并发TCP连接数可以有多少?如何支持从硬件和操作系统上支持单台服务器支持上万并发,支持百万千万,甚至上亿的并发著名的C10K并发连接问题是什么?C10M并发问题又是...【详细内容】
2020-09-01  Tags: 高并发  点击:(102)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条