秒杀活动
亮点:在高并发情况下的秒杀优化,当并发数达到一定量的时候,会对数据库服务器带来很大的压力,那么如何缓解这些压力以及提高并发的QPS就是整个项目的重点。(不断的提高QPS)。
考虑问题的出发点
1.利用缓存减少数据库的压力,以及读取缓存的速度远远快于数据库(网络时延+IO)
2.页面静态化技术加快用户访问速度,提高QPS,异步下单增强用户体验,以及内存标记减少Redis的访问。
3.安全性优化:双重md5密码校验,秒杀接口地址的隐藏,接口限流防刷,数学公式验证码。 整个的提升了系统的安全性能。
解决思路
1:页面静态化以及前后端分离(仅前端支持)
页面静态化的主要目的是为了加快页面的加载速度。
做法:将活动的详情页面做成静态HTML,放在CDN(减少了服务端的压力)上做为静态数据发送给用户端,而数据信息通过前端ajax 异步发送请求来获取。只获取动态数据信息部分,加载速度可以达到全部渲染的2倍。
2:通用缓存key封装
利用一个抽象类,定义BaseKey(前缀),定义了缓存的String prefix(前缀) 以及缓存的过期时间。让不同模块继承它。
这样每次存入一个模块的缓存的时候,加上这个缓存特定的前缀,以及可以统一制定不同的过期时间。
3:缓存技术
利用了缓存技术,包括用户信息缓存(分布式session),商品信息的缓存,商品库存缓存,订单的缓存,减少了对数据库服务器的访问。
4:数学公式验证码(前后端结合)
在商品详情页面加入验证码图片标签,指定Id,再加入验证码输入框input组件,并初始化它们的属性为不可见的,因为一开始验证码和输入框是不可见的(只有秒杀开始才会可见),图片可以点击刷新图片,所以定义refreshVCode方法来刷新图片。
在倒计时方法里面正在进行秒杀分支判断中加入显示验证码以及验证码输入框的代码逻辑,开始秒杀的时候,设置其可见并且指定attr()方法动态指定src,发送请求到后端,动态生成图片。注意:秒杀结束之后,又需要将其设置为不可见的。
请求中传参为goodsId,然后可以根据用户id和goodsId生成数学公式验证码,然后将这个验证码图片response的输出流输出至前端。
前端得到这个验证码图片,显示该验证码,然后用户需要输入验证码将这个验证码作为参数,与获取秒杀地址请求一起传输给后端(校验的操作在获取秒杀地址之前),后端接收到参数,进行验证码比对,缓存中取出该验证码进行校验。如果不通过,不生成秒杀接口地址,直接返回验证码错误信息。
额外信息
QPS:即Queries Per Second的缩写,每秒能处理查询数目。是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS:即Transactions Per Second的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。
RPS: 即Requests Per Second的缩写,每秒能处理的请求数目。等效于QPS
吞吐量: 每秒的响应请求数,也即是最大吞吐能力
计算关系: QPS = 并发量 / 平均响应时间 并发量 = QPS * 平均响应时间