Jmeter+Springboot+Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)
涉及知识点:
java+springboot+mybatis开发
redis分布式锁+Redisson客户端
Jmeter各种骚操作:用户变量、随机取值、jdbc操作、if else操作、循环、控制器、beanshell断言等等
- 环境工具:
idea、jmeter
jdk1.8、maven、mysql、redis
三台服务器:两个4C16G服务节点+一个台nginx(淘宝的tengine-2.3.0)节点 - 思路概要:
(1) 主要提供四个接口:下单、取消、出库、添加库存,四种操作在操作库存表t_stock_demo行的时候都需要添加Redis的锁,使用:
Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);
(2) 另外取消和出库,因为是用Jmeter直接查询数据库获取可用的订单数量,为防止统一订单重复操作在RestSevice层使用订单号orderNo做了一层Redis分布式锁,订单已在操作直接返回结果。
(3) 使用jmeter的jdbc操作+函数、随机数获取已确认的订单结合if控制器判断结果,进行取消和出库操作
(4) 划重点:使用分布式锁和本地事物,一定要先提交事物再释放锁、先提交事物再放锁、先提交事物再放锁 - SQL、jmeter脚本、jar包启动脚本请到doc目录查看。
- 操作指南:
(1) git clone https://github.com/Xlinlin/SpringCloud-Demo
(2) cd SpringCloud-Demo/SpringBoot-Stock-Demo
(3) 配置数据mysql和redis配置,application.yml文件,(自行准备mysql、redis环境)
(4) mvn install
(5) 拷贝stock_demo.jar和doc/bootstrap.sh到 linux服务器(自行准备java环境)上
(6) 适当修改bootstrap.sh脚本目录,保持与springboot包在同一目录,直接执行脚本:./bootstrap start
(7) 查看进程、端口是否启动:jps 或 ps -ef|grep stock_demo 或 lsof -i:7878
(8) 配好nginx跳转
(9) 下载jmeter ,解压进入jmeter目录,双击:ApacheJMeter
(10) 文件->打开->找到doc下的.jmx文件,大概的画面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HF7yCU8S-1571799492489)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_demo_jmeter.jpg?raw=true)]
(11) 修改远程服务器地址信息为你的nginx服务
(12) 修改你的数据地址,此处需要将mysql的驱动jar包引入jmeter/lib目录下
(13) 线程、参数、请求调整好后,然后点击启动(Ctrl+R)
部分截图:
(14) 后台日志[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4S3U8W0-1571799492490)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/sever_console_log.jpg?raw=true)]
(15) 库存表[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XpEUFhgD-1571799492490)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/stock_query.jpg?raw=true)]
(16) 订单表[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Aw1Y1btL-1571799492491)(https://github.com/Xlinlin/SpringCloud-Demo/blob/master/SpringBoot-Stock-Demo/doc/order_query.jpg?raw=true)] - 遗留一个业务问题:
总库存(Total) = 可用库存(Ava) + 预占库存(Prev)
A:下单:T A- P+
B:取消:T A+ P-
C:出库:T- A P-
D:同步库存+:T+ A+ P
E:同步库存-:T- A- P
如果仅仅只是 A+B 或者 A+C 或A B C并发跑能保证 T=P+A
但是 A +B+C+D +E 并发跑,就一定会出现 打破这个 T=P+A的平衡,这个要业务逻辑要怎么处理?有大佬解答?