线上压测优化之“灰度压测”策略

达芬奇密码2018-07-23 09:58

跨境电商项目在各次大促之前,均会进行若干次全链路线上压测,评估线上集群的极限容量。但是由于业务需求多,版本更新迭代快,常常出现业务开发和线上压测准备同时并行的情况。

线上压测由于其特殊性,会对线上服务造成一定的影响,因此一般都设置在凌晨在线人数较少的时间进行。但是由于新上的功能性能隐患较多,容易对线上性能造成影响,可能一轮压测就发现block级别的性能问题,又不能及时发版进行优化,从而阻滞线上压测进度。回看在2017年以来618、双11等典型大促,线上压测进行时都出现过因为明显的block级问题导致浪费宝贵的压测时间的情况。

性能测试组在发现此类问题后,设计了一种“灰度压测”的策略,很大程度上缓解了这个问题。这里就简单的介绍一下设计思路以及具体的实现方式。

在跨境电商的项目中,调用链一般为:client→nginx走域名,nginx→web走nginx的upstream,web→service走dubbo,后端service之间走dubbo。

如图所示,灰度压测主要在域名层、web层和被测服务层做出对应的改动:

  1. 域名层:配置一个测试用的nginx域名,并配置upstream指向独立的被测web节点
  2. web层:在被测web节点的机器上发布特定的版本,使用特殊的dubbo consumer版本号,使其调用对应的dubbo provider。
  3. service层:在被测service节点机器上发布特定的版本,修改dubbo provider版本号,使之只被被测web调用。
  4. 其他上游服务共用。

在进行大规模线上压测之前,可以在白天的时候进行灰度压测,以便及时发现被测service层的性能,从而提升线上压测的效率,节约宝贵的线上压测时间。

综上,使用灰度压测有如下优点:

  1. 可以使用线上数据,不用在测试环境or压测环境进行,节约大量搭环境造数据的时间。
  2. 由于web层和被测service层节点个数上,压测过程中对上游服务的影响相对较小,可以在白天正常时间段进行压测。
  3. 针对压测的所需进行的代码改动量少,落地快。

但是灰度压测也有一定的局限性,在设计压测方案的过程中有不少的注意事项:

  1. 被测服务及前端服务必须要是分布式服务,皆能被独立调用。
  2. 隔离流量信息,要做到线上用户无感知(不显示在热点、推荐等处)。
  3. 评估对线上集群的影响,不能影响到线上服务。

本文来自网易实践者社区,经作者崔慎杰授权发布。