秒杀思路,高并发解决思路,限流、削峰

秒杀思路,高并发解决思路,限流、削峰

前台安全设计

1
首先确认当然抢购用户是否正常登录,才能进行下一步操作

2
2.1:页面可采用CDN(内容分发网络)进行页面加速,秒杀页面尽量减少资源加载(css,js……)
2.2:将不常用数据进行静态化绑定,可采Thymeleaf,FreeMarker进行渲染,不与后台进行交互。
2.3:加上Nginx实现方向代理秒杀页面,也可使用Nginx配置秒杀页面每秒的最大访问限制(超过可实现配置upstream实现负载均衡,具体需要测试调节),配置多个不同域名可同时秒杀统一商品提高用户体验性

3
3.1:可隐藏秒杀接口,防止用户防刷限流
3.2:使用数字验证码(用户体验性不好),防止用户防刷限流
3.3:抢购按键,前台加强验证预防重复点击

缓存优化

1
1.1:使用Redis永久缓存对象减少对数据库的压力,预减库存数量防止卖超
1.2:使用自定义序列化器,将对象进行缓存
1.3:秒杀采用Redis自带的计数器,限制一个(Phone/User)一个Session在规定时间内请求次数(如有大量相同请求均视为同一操作,或者放弃90%操作)
1.4:秒杀商品可采用List队列依次存入,依次取出(取到秒杀成功[将用户存入Set类型防止重复秒杀购买],否则秒杀失败)
1.5:开始抢购与结束抢购之间的约束,因为访问需要消耗时间,延迟开始,提前结束

开始秒杀

1
1.1:采用MQ(同步改为异步,增高体验性),将已抢商品生成订单,再将订单信息交给MQ,可解决削峰处理
1.2:MQ消费者监听(实现高可用可开辟线程池,达到高处理),将订单信息一一入库(成功减库存,失败回滚)。
1.3:抢购成功立马提升用户,商品抢购中,正常生成订单。当MQ正常入库之后用户就可查询订单进行支付了
1.4:开启定时任务,定时扫描订单状态是否秒杀成功(成功正常消减库存商品,失败将商品再次加入缓存队列)
附加:当MQ正常入库,可发送成功抢购消息,给用户体验性提高。

数据库优化

1
1.1:秒杀表在SQL添加库存数量防止负数,防止卖超
1.2:订单表给用户ID添加唯一索引,防止重复购买
1.3:采用锁机制(乐观锁,悲观锁,行级锁[commit之后释放])
1.4:定义存储过程确保数据一致性,提高性能。
附加:将insert放在update之前,因为insert会有影响行数,我们只对update进行加行级锁,将insert放在update之前减少一点锁的消耗时间

总结

网络性能是永远不稳定,简单理解平常性能要求100%,实际给你80%。

像秒杀高并发可能需要200%,我们程序员提高性能达到要求。网络不稳定会影响效率,事务一致性也会消耗性能。

这都是不可避免的,所以采用CDN,Nginx提高性能,解决限流等。采用Redis缓存提升前后台数据交互,并不是与数据库交互。

使用MQ实现异步处理,提升用户体验性。总体来说主体还是本地事务或者分布式事务操作(XA,TCC),当我这里是
TCC:
	T(Try)为redis,nginx,cdn做准备工作,
	C(Confirm)抢购商品预减库存,生成订单,入出库等,
	C(Cancel)确认是否操作正常统一进行事务处理释放资源。
XA与TCC少了C(Cancel)的概念

Two Phase commit协议(二阶段)
优点是可以管理多机事务,拥有无线扩展性 确定是易用性难,承担延时风险
JTA,atomiks等

这里推荐一份特别有些得博客,很多不好消化。但是对你肯定是有帮助得
https://blog.csdn.net/znoone/article/details/79047778?utm_source=app

你可能感兴趣的:(高并发)