【二】做一个秒杀系统【tomcat的并发】

本文通过构建SpringBoot秒杀服务并使用JMeter进行压力测试,详细解析如何测量Tomcat服务器的真实并发能力,最终得出吞吐量峰值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

第一篇文章介绍了高并发减库存的方法,接下来,我们分析下,自己服务器的并发到底能达到多少。搜索相关资料发现,很多都是一个固定的数量。显然不准确,今天就撸起袖子大干一场。

构建一个服务

想要测试就先准备一个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的并发小于这个值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值