以前看了《大型网站技术架构·核心原理与案例分析》一书,其中介绍了一些关于网购秒杀系统架构设计相关的知识,碰巧在imooc上也看到了有关的课程。在参考了各方资料以后,我的感受对如何设计一个秒杀系统有了基本的了解,因而打算本身也试着实现一个简单的秒杀系统。本文的秒杀系统虽然是基于Spring MVC+Spring+Mybatis框架实现,可是其中的架构思想以及处理问题的方法是语言无关的。因此使用其余编程语言作开发的同窗也能够看一看。 本文主要是对秒杀系统架构设计、系统功能等进行介绍,另外提一下编码过程当中遇到的一些坑,具体的编码不过多赘述,代码中都写了详细的注释。建议直接把项目down下来本身边运行边探究。 项目github地址: https://github.com/eakonzhao/Spike-system ( 喜欢的话记得给个star哦 o(^▽^)o ) 怎么把项目运行起来?
1、秒杀活动技术挑战
2、秒杀系统的应对策略
下面是秒杀系统的一个基本流程图:
<ignore_js_op>
秒杀系统业务流程![]() 可是在本系统中,并无实现得那么完善,而是针对一部分方面进行了实践:
<ignore_js_op>
本系统实现的功能![]() 前端主要流程图
<ignore_js_op>
秒杀系统前端流程图![]() 后端简化流程图(由于还会涉及到访问Redis缓存等操做)
<ignore_js_op>
后端简化流程图![]() 在这里特别把其中的事务拿出来讲一下。咱们的事务由两个操做组成,分别是操做两张表,一个操做是更新某张表的数据,另外一个操做是往某张表里面插入数据。其实这里有一个优化的点,就是在业务代码中将插入操做放在更新操做以前。假如插入失败就直接回滚。可是若是把更新操做(即扣库存)放在前面,在并发的环境下可能会涉及高频率的行级锁竞争问题,致使系统性能急剧降低。(由数据库的三级封锁协议可知这样确实起到了必定的优化做用)
<ignore_js_op>
从用户角度针对库存业务进行分析![]()
<ignore_js_op>
事务详情![]()
<ignore_js_op>
两张主要的数据表(Github已经放了建表的sql语句)![]() 系统功能介绍 因为上面已经给出了系统的详细流程图,因此在这里就只展现几张系统的截图
<ignore_js_op>
秒杀商品列表页![]()
<ignore_js_op>
秒杀待开启![]()
<ignore_js_op>
进入秒杀页面,能够开始秒杀![]()
<ignore_js_op>
因为库存为零,点击以后显示秒杀结束![]()
<ignore_js_op>
重复秒杀![]() 实现 项目整体描述 本项目是基于 项目中应用到的技术与工具
<ignore_js_op>
项目骨架展现![]() 遇到的一些坑
<ignore_js_op>
控制台出现400错误![]()
<ignore_js_op>
400 Bad Request]D@`NG8JS2.png![]()
<ignore_js_op>
正确的@PathVariable语法 @PathVariable("parameter")![]()
<ignore_js_op>
在pom.xml引入slf4j和logback的依赖时应该注意版本问题![]() |