首先,要明确一点,高并发场景下系统的瓶颈出现在哪里,其实主要就是数据库,那么就要想办法为数据库做层层防护,减轻数据库的压力。
我用一个比较简单直观的图来表达大概的处理思路
实践证明,cdn加速的效果十分明显,对于一些响应不是很快的网站而言,静态资源做了cdn加速后会变得很快,前后响应速度截然不同,是生产中必不可少的一种方式。
主要是为了防止重复点击提交
类似于斗鱼等直播平台抢礼物的场景,你几乎每次在最后一秒点击的时候都会弹出比较复杂的图形验证码,感官上好像是耽误了你一两秒的时间,实际上这种简单的方式不仅分散了流量,而且防止有恶意刷秒杀接口的行为,十分好用。
这是秒杀场景下必不可少的一件事,判断是否秒杀到就是在前端通过一个定时器不断轮询服务端接口,查询秒杀结果最终返回是成功或失败。
有两种方式,一种是使用nginx对页面进行缓存配置,一种是直接利用浏览器端缓存,两种差不多,相比之下后一种其实更科学。
网关一般在微服务中用来做认证鉴权以及限流操作,这里在秒杀场景中就是使用限流算法,对用户秒杀请求实现限流和服务保护。
限流算法有很多,比如redis限流、nginx、hystrix等等,实际工作中使用最多的还是令牌桶算法,可以基于这个算法自己写一个注解,也可以使用google工具类已经实现的ratelimter,两三行就能实现效果。
服务端主要就是对秒杀接口的优化
进行服务器集群即可,比如nginx+lvs,分担服务器承载请求的压力,同时也是分散流量最传统的一种方式。
主要两种方式:
1)、一种是使用数据库自带的行锁机制,这种方式我在工作中用过,完全可以解决超卖问题,对于流量不大的秒杀场景实际上完全够用,性能消耗也不明显;
2)、另一种是现在比较流行的version版本号实现的乐观锁机制,就是在数据库中加一个version字段来表示版本号,修改库存时先获取当前版本号,然后修改时就传入该版本号并且对当前版本号+1,这种相较于第一种就更科学,在性能上更优越,而且对于流量较大的秒杀场景而言容错率更高,这个后面会讲。
可以使用apache的jmeter压测工具,操作简单,在测试秒杀接口时可根据测试结果不断优化,还能生成测试结果的报表。
以上是对java秒杀整体思路的概括,之后会分别对每一个阶段的实现进行讲解。
如对本文有疑问, 点击进行留言回复!!
跟我学Springboot开发后端管理系统6:缓存框架Caffeine
《Oracle Java EE编程自学与面试指南》01-02、Web应用类型
Error: Avoided redundant navigation to current location: “/XXX“.的问题
Avoided redundant navigation to current location:
荐 四十一、Vue项目上手 | 用户管理系统 实现用户修改和删除功能(完成篇)
网友评论