什么是QPS
QPS=req/sec=请求数/秒原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间公式:(总PV数*80%)/(每天秒数*20%)=峰值时间每秒请求数>(QPS)机器:峰值时间每秒QPS/单台机器的QPS=需要的机器
上面是QPS精准的理解,当然我们也可以简单的理解为:QPS:每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
想对这些概念有进一步了解的可以参看这篇博客吞吐量、QPS、并发数、响应时间概念.
为什么要知道接口QPS
当我们在做B端产品时,可能并发不多,不会过多的考虑接口的性能问题,更注重的是系统的稳定性,而像面向C端的产品时,面对的流量无法预估,所以处于对系统进行保护,nginx需要设置限流策略,包括分布式系统中的接口也要有熔断降级策略,这样才能保证系统的安全性,不会在高并发的情况下崩溃。那么问题来了,有了熔断降级、限流策略,为什么还要知道接口的QPS?当上级要求接口的超时降级时间要求是200毫秒时,且你写的接口需要支持100QPS,你要知道该怎么处理,计算出单个机器下接口的QPS,才能知道上线后,需要几台机器部署,而计算QPS我们可以通过jmeter等压测工具来实现。
实操
下面是自己进行压测的接口代码内联代码片。
@GetMapping('jmeter')
public String jmeter() {
Long begin = System.currentTimeMillis();
ReentrantLock lock = new ReentrantLock();
Map map = new HashMap<>();
map.put('status', 1);
try {
lock.lock();
// 执行插入操作
MsgLogV2DO msgLogV2DO = new MsgLogV2DO();
msgLogV2DO.setExchange(Thread.currentThread().getName());
msgLogV2Service.save(msgLogV2DO);
// 休眠100毫秒
TimeUnit.MILLISECONDS.sleep(100);
// 查询操作
List list = msgLogV2Service.list(map);
log.error(JSON.toJSONString(list));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
Long end = System.currentTimeMillis();
if (end - begin > 200) {
throw new RuntimeException('接口超时抛出异常');
}
return msg;
}
接口比较简单,大家应该都能看懂,具体逻辑没有实际意义,目的就是保证接口有一定的耗时,这里我没有集成hystrix,通过代码来实现超过200毫秒就抛出异常。
接下来进行Jmeter压测
**关于如何使用Jemter进行压测,及设置,大家可以参考这篇文章,讲解还是挺清晰的:jmeter测试网站QPS.
通过调整jmeter压测的属性,一点点增大吞吐量,当出现异常%开始出现时,就说明此时接口已经处于不健康状态了
通过多次测试,可以知道这个接口的吞吐量应该在10/sec左右。这是本人第一篇文章,有不对的地方欢迎指正。下篇考虑写下String为什么要重写equals方法,这里面涉及的点还是很多的,有了解的朋友可以讨论下。
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点