压测体系是测试时发现问题的重要手段。压测除了能帮助发现功能异常外,还能发现一些平时不容易发现的问题,如当系统压力大时系统的表现情况、线上系统的容量配比是否合理、系统的容灾保护是否到位等。压测一般分为单系统压测和全链路压测,我们所说的压测是线上真实生产环境的压力测试。
种是引流的方式,就是将线上集群中的流量集中到少部分的机器上,当这些机器流量变大时就会达到瓶颈,就能得出单机的极限性能,根据单机的性能就能推算出整个集群的性能。由于是线上的真实用户的访问请求,这种引流的方式不会产生额外的测试数据,所以对读、写系统都合适。
流量的制造除了要能够控制流量大小外,还要注意流量发起所在的物理网络位置最好能保证流量是从不同的地理位置发起的,流量发起端可以部署在各地的CDN节点中,并把不同的网络运营商也考虑进来,这样能更好地模拟真实的用户请求。流量的标记
标记流量有多种方式:一种是设计不同的数据,例如商品数据的商品ID都以999开头、把订单ID设置在某个特殊的区段内;第二种是给每个请求贴上一个tace标签,每个系统调用的地方都能识别出这个标签,一方面可以做一些特殊处理,如取消 token验证,另外一方面也可以把它路由到特殊的数据表中。
tace的传递是一个难题,最好的方式是通过中间件来完成:从最外面的HTP协议将tace添加在 Header中,到应用的RPC调用中也可以加到协议头中,再到数据层中也一样,最重要的是要保证race标签不能被丢掉否则将出现脏数据。
对测试数据的处理是最关键的环节,因为是线上真实生产环境的压测,所以对产生的数据的处理不能影响线上的真实数据。对此,我们提出影子表的概念,它和线上的真实表完全一样,甚至和真实表一样用在同一个数据库实例中,通过传递下来的tace标记把这个请求需要写的数据路由到影子表中,这样测试流量的读写都在影子表中完成,不会影响线上的真实数据。将测试数据通过影子表来隔离是非常关键的,如果放在一起会引起很多麻烦,也不好清理,即使能够清理也会影响正式表的主键生成规则,影响下游BI对数据的分析和一些监控指标的展示等。