拷贝流量
Thrift服务打压的难点之一就是如何简单地拷贝线上真实流量用来构建打压请求。一些大型的Thrift服务数据结构非常复杂,写打压脚本的时候需要很多代码来解析日志,而且容易出错。 因此提供一个简单好用的拷贝流量方法是十分有必要的。
在这里压测工具提供了一个叫VCR(录像机)的工具来拷贝流量。VCR能够将线上的请求序列化后写到Redis里面。
考虑到用户需要查看具体请求和易用性等需求,最终选取了JSON格式作为序列化和反序列化的协议。同时需要部署在生产环境,为了降低对线上服务的影响,这里采取了单线程异步写的方式来拷贝流量。
聚合数据
应用打压完成后,需要一些指标来评估压测结果,常见的指标有:
· 最大响应时间
· 平均响应时间
· QPS
· TP90
· TP50
压测工具采用了 InfluxDB 来完成数据的聚合工作。
以TP90为例子,仅需要一行查询就能实现需求。
SELECT PERCENTILE(response_time, 90) FROM test_series GROUP BY time(10s)
架构
整体而言,整个打压过程如下:
实践
拷贝流量
美团内部的服务大多使用Java来构建,VCR以Maven Package的方式提供给用户。
对用户来说只需要2行代码可以拷贝流量。
为了不影响线上服务,通常选取单台机器进行流量拷贝工作。
public class TestAppRPC implements TestApp.Iface {
private Vcr _vcr = new Vcr("testapp"); // 指定拷贝流量的key
@Override
public TestResponse echo(TestRequest req) throws TException {
_vcr.copy(req); // 拷贝操作
long start = System.currentTimeMillis();
TestResponse response = new TestResponse();
return response;
}
}
一旦流量拷贝完成后,通过Web界面,用户能够查看日志的收集情况和单条日志的详情。