Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

3 篇文章 0 订阅
2 篇文章 0 订阅

Jmeter+Springboot+Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)

涉及知识点:

java+springboot+mybatis开发

redis分布式锁+Redisson客户端

Jmeter各种骚操作:用户变量、随机取值、jdbc操作、if else操作、循环、控制器、beanshell断言等等

  1. 环境工具:

    idea、jmeter

    jdk1.8、maven、mysql、redis

    三台服务器:两个4C16G服务节点+一个台nginx(淘宝的tengine-2.3.0)节点
  2. 思路概要:

    (1) 主要提供四个接口:下单、取消、出库、添加库存,四种操作在操作库存表t_stock_demo行的时候都需要添加Redis的锁,使用:Future<Boolean> res = fairLock.tryLockAsync(50, 10, TimeUnit.SECONDS);

    (2) 另外取消和出库,因为是用Jmeter直接查询数据库获取可用的订单数量,为防止统一订单重复操作在RestSevice层使用订单号orderNo做了一层Redis分布式锁,订单已在操作直接返回结果。

    (3) 使用jmeter的jdbc操作+函数、随机数获取已确认的订单结合if控制器判断结果,进行取消和出库操作

    (4) 划重点:使用分布式锁和本地事物,一定要先提交事物再释放锁、先提交事物再放锁、先提交事物再放锁

  3. SQL、jmeter脚本、jar包启动脚本请到doc目录查看。
  4. 操作指南:

    (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)]

  5. 遗留一个业务问题:

    总库存(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的平衡,这个要业务逻辑要怎么处理?有大佬解答?

GitHub源码

JMeter是一个用于性能测试和负载测试的开源工具。当需要模拟大量并发用户时,使用台机器可能无法满足要求,因为JMeter是一个JAVA应用,对于CPU和内存的消耗较大,可能会引发内存溢出错误。为了提供更大的负载能力,可以使用JMeter提供的分布式功能来启动多台电脑来进行分压测试。分布式测试是通过局域网和Internet,将分布在不同地点的独立测试机器连接起来,实现测试资源共享、分散操作、集中管理、协同工作、负载均衡和测试过程监控等目的的计算机网络测试。这样可以更好地模拟真实的并发场景,并提供更准确的性能指标和报告。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Jmeter性能测试之分布式压测](https://blog.csdn.net/m0_37449634/article/details/126721355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [jmeter性能测试-分布式](https://blog.csdn.net/m0_37673672/article/details/129275810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值