# secKill-service
## 环境
```$xslt
系统:Windows 10 10.0_x64
内存:16G
CPU:I7-7700K
开发工具:IntelliJ IDEA 2019.1
maven:Apache Maven 3.6.0
java:jdk_1.8.0_201
springboot:2.0.7
mysql:5.7.21
mybatis:3.5.1
redis:Redis 3.2.100
rabbitmq:3.7.9
压测工具:Apache JMeter 5.1.1
模板引擎:thymeleaf-3.0.11
```
## 电商秒杀业务说明
电商类的活动秒杀抢购,对我们来说,永远都是一个无法规避的问题。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。
## 前置知识补充之高并发接口实现思路和高并发常见术语
在开发高并发系统时有三把利器用来保护系统:缓存、降级、限流
* 缓存:缓存的目的是提升系统访问速度和增大系统处理容量
在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高并发访问量,也是保护数据库、保护系统的有效方式。大型网站一般主要是“读”,缓存的使用很容易被想到。在大型“写”系统中,缓存也常常扮演者非常重要的角色。比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及HBase写数据的机制等等也都是通过缓存提升系统的吞吐量或者实现系统的保护措施。甚至消息中间件,你也可以认为是一种分布式的数据缓存。
* 降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开
服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。根据服务方式:可以拒接服务,可以延迟服务,也有时候可以随机服务。根据服务范围:可以砍掉某个功能,也可以砍掉某些模块。总之服务降级需要根据不同的业务需求采用不同的降级策略。主要的目的就是服务虽然有损但是总比没有好。
* 限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理
限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。
### 常见限流技术说明(计数器、漏斗和令牌桶算法)
**令牌桶算法**
令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:
1.假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌;
2.桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝;
3.所有的请求在处理之前都需要拿到一个可用的令牌才会被处理,处理完业务逻辑之后,将令牌直接删除;
4.令牌桶有最低限额n,当桶中的令牌达到最低限额n时候,请求将不会被处理,以此保证足够的限流;
**漏桶算法**
漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求。
* 漏斗有一个进水口 和 一个出水口,出水口以一定速率出水,并且有一个最大出水速率:
* 如果进水速率小于等于最大出水速率,那么,出水速率等于进水速率,此时,不会积水,如果进水速率大于最大出水速率,那么,漏斗以最大速率出水,此时,多余的水会积在漏斗中
**Fixed-Window算法**
这个算法的思路是比较简单的, 考虑一个固定长度的时间窗口,比如10s、1min、1h等, 在这个时间窗口内统计请求次数, 但请求次数超过阈值就触发限流。这个算法有两点第一时间窗口的长度是固定的并对应一个计数器, 第二每个时间窗口开始时计数器清零。
****
## 项目业务说明
此项目模拟的是某次电商活动中一个商品列表的商品的秒杀场景。商品列表中有N种商品,每个商品都有自己的库存数目,每个商品的秒杀开始时间也不相同。每个用户只可以秒杀成功一次某种商品,不同的商品可以分别秒杀。
**项目应对并发的业务详解**
* 项目前端采用模板引擎将页面缓存在用户端通过接口动态的更新数据;
* 后端动态生成商品秒杀的路径,等到商品秒杀的时间获取秒杀路径的接口才会返回秒杀路径;
* 为了使接口在一瞬间接收很多的请求采用了验证码来控制一瞬间的请求过大的情况,秒杀接口会判断秒杀路径;
* 使用内存缓存来过滤不正确的商品id的请求和已经秒杀完毕的商品请求;
* 使用redis缓存来保存商品的库存避免商品出现超卖的情况;
* 用户秒杀成功的请求会进入消息队列排队,对应的业务会慢慢处理用户秒杀成功的请求;
* 在秒杀业务中会进行减库存的操作,还会判断用户是否有重复秒杀的请求和商品库存是否正确;
* 秒杀成功的请求产生的订单会保存一份到redis中以供秒杀成功后查询订单;
## 预热:接口响应测试(使用JMeter测试)
> 这里先在不同的情况下测试Tomcat的承受并发的能力
### 没有处理任何业务的情况
> 100个线程,1秒钟,循环一次请求的结果如下
|Label|样本|平均值|中位数|90% 百分位|95% 百分位|99% 百分位|最小值|最大值|异常 %|吞吐量|接收 KB/sec|发送 KB/sec|
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
|HTTP请求|100|1|1|2|2|2|0|3|0.000%|100.70493|7.18|13.57|
|TOTAL|100|1|1|2|2|2|0|3|0.000%|100.70493|7.18|13.57|
> 1000个线程,1秒钟,循环一次请求的结果如下
|Label|样本|平均值|中位数|90% 百分位|95% 百分位|99% 百分位|最小值|最大值|异常 %|吞吐量|接收 KB/sec|发送 KB/sec|
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
|HTTP请求|1000|0|1|1|1|2|0|11|0.000%|970.87379|69.21|130.84|
|TOTAL|1000|0|1|1|1|2|0|11|0.000%|970.87379|69.21|130.84|
> 10000个线程,1秒钟,循环一次请求的结果如下
|Label|样本|平均值|中位数|90% 百分位|95% 百分位|99% 百分位|最小值|最大值|异常 %|吞吐量|接收 KB/sec|发送 KB/sec|
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
|HTTP请求|10000|379|102|1263|1546|2009|0|2035|0.000%|2449.17952|174.60|330.07|
|TOTAL|10000|379|102|1263|1546|2009|0|2035|0.000%|2449.17952|174.60|330.07|
**结论:由于这个接口没有处理任务业务,请求完成后就返回,由此可见一个Tomcat的并发数还是很可观的!**
### 只查询 redis 数据的情况
> 100个线程,1秒钟,循环一次请求的结果如下
|Label|样本|平均值|中位数|90% 百分位|95% 百分位|99% 百分位|最小值|最大值|异常 %|吞吐量|接收 KB/sec|发送 KB/sec|
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
|HTTP请求|100|2|2|3|4|20|1|30|0.000%|100.80645|14.37|13.59|
|TOTAL|100|2|2|3|4|20|1|30|0.000%|100.80645|14.37|13.59|
> 1000个线程,1秒钟,循环一次请求的结果如下
|Label|样本|平均值|中位数|90% 百分位|95% 百分位|99% 百分位|最小�
没有合适的资源?快使用搜索试试~ 我知道了~
基于 Spring Boot rabbitmq redis mysql 的电商秒杀系统.zip
共101个文件
java:47个
js:11个
png:6个
需积分: 5 0 下载量 104 浏览量
2024-08-18
09:05:11
上传
评论
收藏 4.66MB ZIP 举报
温馨提示
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助 【资源内容】:项目具体内容可查看/点击本页面下方的*资源详情*,包含完整源码+工程文件+说明(若有)等。【若无积分,此资源可私信获取】 【本人专注IT领域】:有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为您提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 积分资源不提供技术指导/答疑 2. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 3. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于收集和整理资料耗费时间的酬劳
资源推荐
资源详情
资源评论
收起资源包目录
基于 Spring Boot rabbitmq redis mysql 的电商秒杀系统.zip (101个子文件)
mvnw.cmd 5KB
bootstrap.css 143KB
bootstrap.min.css 118KB
bootstrap-theme.css 26KB
bootstrap-theme.min.css 23KB
layer.css 14KB
layer.css 5KB
glyphicons-halflings-regular.eot 20KB
loading-0.gif 6KB
loading-2.gif 2KB
loading-1.gif 701B
.gitignore 257B
goods_detail.htm 8KB
order_detail.htm 3KB
goods_detail.html 3KB
login.html 3KB
order_detail.html 2KB
goods_list.html 2KB
index.html 778B
failed.html 238B
HttpUtil.java 9KB
ImgCodeUtil.java 5KB
SecKillController.java 4KB
GlobalExceptionHandler.java 4KB
AccessInterceptor.java 3KB
ExceptionMessage.java 3KB
OrderService.java 3KB
Goods.java 3KB
SecKillService.java 2KB
UserService.java 2KB
RedisConfig.java 2KB
User.java 2KB
UserMapperTest.java 2KB
RabbitMqReceiver.java 2KB
GoodsController.java 2KB
OrderVO.java 2KB
OrderItem.java 2KB
Result.java 2KB
UserVO.java 2KB
ConcurrentController.java 1KB
UserSecKillTest.java 1KB
Order.java 1KB
UserController.java 1KB
GoodsService.java 1KB
OrderItemService.java 1KB
OrderItemMapper.java 1KB
UserMapper.java 1KB
OrderMapper.java 1KB
OrderController.java 1KB
RabbitMqSender.java 973B
GoodsMapper.java 969B
RabbitMqConfig.java 905B
SecKillException.java 782B
SecKillMessage.java 765B
OrderAddVO.java 731B
GoodsVO.java 711B
CorsConfiguration.java 693B
ExceptionResult.java 625B
SecKillVO.java 601B
OrderItemVO.java 580B
GoodsListVO.java 564B
AccessLimit.java 453B
SecKillApplication.java 379B
AppConfig.java 350B
RedisPrefix.java 308B
VersionFlag.java 274B
LoginVO.java 234B
bg.jpg 3.62MB
bg2.jpg 80KB
jquery.min.js 82KB
bootstrap.js 68KB
bootstrap.min.js 36KB
layer.js 21KB
jquery.validate.min.js 21KB
additional-methods.min.js 17KB
md5.min.js 10KB
layer.js 3KB
common.js 1KB
messages_zh.min.js 1KB
npm.js 484B
bootstrap.min.css.map 529KB
bootstrap.css.map 380KB
bootstrap-theme.css.map 47KB
bootstrap-theme.min.css.map 25KB
README.md 12KB
mvnw 6KB
iphone8.png 340KB
mi6.png 74KB
meta10.png 41KB
iphonex.png 23KB
icon.png 11KB
icon-ext.png 6KB
log4j.properties 88B
seckill.sql 6KB
glyphicons-halflings-regular.svg 106KB
glyphicons-halflings-regular.ttf 44KB
LICENSE.txt 11KB
glyphicons-halflings-regular.woff 23KB
glyphicons-halflings-regular.woff2 18KB
pom.xml 5KB
共 101 条
- 1
- 2
资源评论
热爱技术。
- 粉丝: 2588
- 资源: 7860
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功