当前位置: 首页 > news >正文

JMeter模拟并发请求

        PostMan不是严格意义上的并发请求工具,实际是串行的,如果需要测试后台接口并发时程序的准确性,建议采用JMeter工具。

案例:JMeter设置20个并发卖票请求,查看后台是否存在超卖的情况

 方式一:一共10张票,票余额作为成员属性放在控制器中,没做任何的锁控制

package com.gingko.controller;
import com.gingko.common.GenericWebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;@RestController
@RequestMapping("ticket")
@Slf4j
public class TicketController {private static int TICKET_AMOUNT = 10;//一共10张票@PostMapping("/sell")public GenericWebResult sell() {GenericWebResult result = null;if(TICKET_AMOUNT > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}TICKET_AMOUNT--;System.out.println("售票成功:余票" + TICKET_AMOUNT);result = GenericWebResult.ok("售票成功:余票",TICKET_AMOUNT);}else {result = GenericWebResult.error("售票失败:余票",TICKET_AMOUNT);System.out.println("售票失败:余票" + TICKET_AMOUNT);}return result;}
}

运行结果及分析: 

从运行结果可以看出,在高并发的时候,出现了超卖和数据不一致的问题

 方式二:一共10张票,票余额作为成员属性放在控制器中,卖票的请求方法上加锁synchronized

package com.gingko.controller;
import com.gingko.common.GenericWebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;@RestController
@RequestMapping("ticket")
@Slf4j
public class TicketController {private static int TICKET_AMOUNT = 10;//一共10张票@PostMapping("/sell")public synchronized GenericWebResult sell() {GenericWebResult result = null;if(TICKET_AMOUNT > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}TICKET_AMOUNT--;System.out.println("售票成功:余票" + TICKET_AMOUNT);result = GenericWebResult.ok("售票成功:余票",TICKET_AMOUNT);}else {result = GenericWebResult.error("售票失败:余票",TICKET_AMOUNT);System.out.println("售票失败:余票" + TICKET_AMOUNT);}return result;}
}

运行结果及分析: 

 从运行结果可以看出,在高并发的时候,没有出现超卖或数据不一致问题,数据结果符合预期。

方式三:TicketController对象多例,并且TICKET_AMOUNT属性不是static,每个对象各自持有

package com.gingko.controller;
import com.gingko.common.GenericWebResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Random;@RestController
@RequestMapping("ticket")
@Slf4j
@Scope("prototype") //多例
public class TicketController {private int TICKET_AMOUNT = 10;@PostMapping("/sell")public GenericWebResult sell() {GenericWebResult result = null;if(TICKET_AMOUNT > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}TICKET_AMOUNT--;System.out.println("售票成功:余票" + TICKET_AMOUNT);result = GenericWebResult.ok("售票成功:余票",TICKET_AMOUNT);}else {result = GenericWebResult.error("售票失败:余票",TICKET_AMOUNT);System.out.println("售票失败:余票" + TICKET_AMOUNT);}return result;}
}

运行结果及分析:  

从程序可以看出,20个并发请求,后台生成了20个TicketController实例,每个实例内部都持有属性TICKET_AMOUNT = 10,sell方法执行后,TICKET_AMOUNT = 9

方式一、方式二与方式三示意图区别如下:

方式一、二,堆内存中只有一个TicketController实例,并且TICKET_AMOUNT不属于实例对象,属于共享的数据区,对这种共享数据并发操作时,需要锁机制控制,防止出现数据不一致。

方式三,并发请求多少,堆内存中生成多少个TicketController实例,并且每个TicketController实例各自持有TICKET_AMOUNT,访问各自的成员属性也就不会发生数据不一致问题。

http://www.lryc.cn/news/466682.html

相关文章:

  • 【小趴菜前端实习日记5】
  • 如何通过谷歌外推占据搜索引擎首页?
  • jmeter学习(6)逻辑控制器
  • Android14 和android12 在锁屏界面Keyguard输错5次密码后倒计时30秒时重启手机不显示倒计时
  • 智能时代摩托车一键启动无钥匙进入感受科技前线
  • 需要补充的技能
  • 15分钟学 Go 第 15 天:映射(Map)
  • element-plus 官方表格排序问题
  • AI语音模型在家宽业务中的应用
  • 零七生活API-文字转语音API使用示例
  • rpc的客户端为什么称为stub
  • RHCE--nginx实现多IP访问多网站
  • TikTok运营对IP有什么要求?
  • 大白话讲解:多模态大模型综述,通俗易懂!
  • 大数据-184 Elasticsearch - 原理剖析 - DocValues 机制原理 压缩与禁用
  • Java设计模式:工厂模式详解
  • 《Python游戏编程入门》注-第3章1
  • Java爬虫:获取数据的入门详解
  • GAMES104:17 游戏引擎的玩法系统:高级AI-学习笔记
  • 【Unity】Unity中获取网络时间进行每日和每月刷新
  • 微信小程序上传组件封装uploadHelper2.0使用整理
  • 力扣每日打卡挑战 3184. 构成整天的下标对数目 I
  • The First:Starknet如何让以太坊更快更安全?
  • 【计算机网络 - 基础问题】每日 3 题(五十三)
  • 便携式移动消防炮:灵活灭火新选择
  • 18.VScode写Java项目的教程
  • 本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程
  • Java项目实战II基于微信小程序的原创音乐平台{UNIAPP+SSM+MySQL+Vue}(开发文档+数据库+源码)
  • 【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步
  • 代码随想录算法训练营第46期Day37,38,39,41