短信平台压测方案构思与实施

短信平台压测方案构思与实施

压测时间:正式上线两个月
测试环境:正式环境
测试条件:测试时间选在平台使用时间段较少的时候,通过观察数据库一段时间内数据的增长情况确定在周六的晚上。
数据量:目前数据库有51个部门、62个管理员、短信发送总量约4.5W条,单个用户最大发送量已达2W条数据。

前提:用户体验反馈查询部门和自己在某个时间段的发送记录的时候速度较慢,考虑到短信平台二期需要扩展用户,于是决定做一个压测找出平台现在能承载的最大并发量,并对现有的查询慢的接口做具体的优化,由于短信服务模块是最直接和用户交互的模块,本次测试只关注这部分的性能。

1. 短信服务接口响应时间测试

具体步骤:

  1. 获取接口执行时长:利用Spring aop切入对外服务接口,在环绕方法中统计方法执行时长。
  2. 发送模拟请求:通过postman发送模拟请求,请求数据尽量贴合真实环境。
  3. 性能分析:找出需要提升响应速度的接口,分析具体原因并作出改变。
  4. 重新压测:首先在测试环境中进行压测,如效果有明显提升再次在正式环境压测并重启服务器。

1. 获取接口执行时长

为了监控方法的运行时长,我选择使用Spring aop这种面向切面的方式。SpringBoot开启aop的方式与普通的Spring configure的方式还是有所区别,需要添加spring-boot-starter-aop依赖,不再加入@EnableAspectJAutoProxy标签。同时需要再application.properties中添加一个属性spring.aop.auto=true,但是这个属性默认为true所以也不需要我们再添加。

添加pom依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
创建切面类
@Component
@Aspect
public class TimeStaticalIntercepter {

    public Logger logger = LoggerFactory.getLogger(TimeStaticalIntercepter.class);

    @Pointcut(value = "within(cn.bookcycle.db.controller.*)")
    public void pointCut(){

    }

    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint pjp){
        //定义返回对象Object
        Object result = null;
        Object[] args = pjp.getArgs();
        long start = System.currentTimeMillis();
        try {
            result = pjp.proceed(args);
        } catch (Throwable throwable) {
            logger.error("统计某方法执行耗时环绕通知出错", throwable);
        }
        long end = System.currentTimeMillis();
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        String functionName = methodSignature.getName();
        this.printCostTime(functionName, start, end);
        return result;
    }

    private void printCostTime(String functionName, long start, long end) {
        long diff = end - start;
        logger.warn("-----" + functionName + "方法执行耗时:" + diff + "ms");
    }
}
请求Controller接口的响应结果

管理员一段时间短信发送记录查询耗时

这个接口耗时达到了90S,显示是无法接受的,这是因为我用了一个发送了很多短信的账号(2W条),导致总耗时达到了2W。这个接口便是我们要优化的目标接口之一。

2. 发送模拟请求

工具:postman
数据:写生成器接口模拟生成一批用户数据
原则:贴合真实数据
注意点:对线上的数据造成的影响要小,事后产生的测试数据都删除掉。

0. 用模拟生成器模拟一批用户数据

数据前提: 用户Id随机、发送手机号固定以便删除、内容随机

1. 使用jmeter模拟多用户压测短信发送接口

https://codervincent.github.io/2019/05/23/%E4%BD%BF%E7%94%A8Jmeter-nmon%E5%AF%B9%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%80%A7%E8%83%BD%E5%81%9A%E5%8E%8B%E6%B5%8B%E4%B8%8E%E5%88%86%E6%9E%90/#more
由于在前面的文章中已经写到过这部分,而且本节重点在于测试短信接口响应时长,所以不在此处分析。

2. 在网速畅通的条件下测试短信发送接口响应时长

我首先给某个测试账号逐批添加数据,每次添加5000条,经过测试响应结果如下: