前言
第一篇文章介绍了高并发减库存的方法,接下来,我们分析下,自己服务器的并发到底能达到多少。搜索相关资料发现,很多都是一个固定的数量。显然不准确,今天就撸起袖子大干一场。
构建一个服务
想要测试就先准备一个tomcat秒杀服务,话不多说,直接通过springboot来快速构建一个服务。
通过idea自动构建springboot的web工程,初始化完毕后,新建SecKillController如下图:
具体代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/seckill")
@RestController
public class SecKillController {
@RequestMapping("seckill")
public void secKill(){
System.out.println("seckill");
}
}
运行程序,访问http://localhost:8080/seckill/seckill。控制台成功输出:
能成功输出,代表以上步骤没什么问题 。开始将第一篇中,秒杀的高并发减库存代码移植过来。这块必须要移植正常业务代码,如果单独测上边的代码,逻辑太简单,耗时保证是不一样的。
这块就一第一篇文章中,思路一的方式来实现,直接将思路一线程任务中的代码放到seckill方法中即可。代码如下:
@RequestMapping("seckill")
public void secKill(){
System.out.println("seckill");
Object result = redisTemplate.execute(
(RedisConnection connection) -> connection.eval(
LUA_SCRIPT.getBytes(),
ReturnType.INTEGER,
1,
"20200217".getBytes(),//商品id
"1".getBytes()));//这块的需求数量可以修改为其他值
System.out.println(result);
if(result.toString().equals("-1")){
System.out.println("库存为空,秒杀结束!");
}else {
System.out.println("秒杀成功!生成订单");
//下边执行生成订单的逻辑,
//假如生成订单失败,库存可以回滚
}
}
启动redis服务做一个测试。在浏览器中输入http://localhost:8080/seckill/seckill
发现控制台成功输出秒杀成功,查看redis库存,确实减少了一条。证明代码没有问题。
发布服务
接着将程序发布到tomcat。同样在浏览器输入接口地址测试:http://localhost:8080/seckill-tomcat-test-0.0.1-SNAPSHOT/seckill/seckill
查看redis库存,扣减成功,没有问题。
测试吞吐量
接着,打开JMeter,添加如下测试:
启动测试程序,查看聚合报告
可以看到吞吐量在2694/s。
因为发布的程序和测试程序都在同一台电脑上,速度比较快,我的电脑配置是16内存,i7处理器。逻辑处理器8个。
优化tomcat
禁用ajp服务、设置nio2模式、设置线程池、jvm等,这里就不展开说了。
因为我使用的win10上部署tomcat,输出gc日志跟linux不同,需要在
tomcat的解压目录,进入bin文件夹,修改catalina.bat,在第一行加入如下代码
set "JAVA_OPTS=%JAVA_OPTS% -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:D:\MyDisk\gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\MyDisk\heapdump.dump"
文件夹不存在的话 先创建文件夹。
总结
通过吞吐量就可以大致看出tomcat的并发,这块要注意,结合错误率来综合判定。
同时要多测试得出平均值,这样才是准确的。
比如说文章得出的结论吞吐量是2600,那么尽量让每秒钟访问tomcat的并发小于这个值。