gitbook/全链路压测实战30讲/docs/427711.md
2022-09-03 22:05:03 +08:00

169 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 01 | 全链路压测:为什么很多测试人员迷信它?
你好,我是高楼。
时光如梭,梭梭催人进步。在技术行业中,更是如此。
在性能行业中,全链路压测的概念产生和落地实践已经有很多年了。很多企业也是不遗余力地投入资源来做全链路压测,但其中苦楚只有经历过的人才懂。尽管如此,还是有更多的企业紧跟其上,趋之若鹜。为什么全链路压测会有这么高的热度?
要理解这一点,你必须得先看看全链路压测的这些目标:
1. 全链路压测被称为系统整体容量保障的核武器。
2. 全链路压测可以实现生产环境的压测服务,模拟真实的生产峰值场景,以发现真实的线上瓶颈并实现监控分析。
3. 全链路压测可以实现精准的容量规划,确保线上系统的正常运行。
4. 全链路压测可以实现海量的并发请求,以模拟真实的用户峰值场景。
5. 全链路压测可以实现压测流量和生产流量的隔离,避免对生产流量产生影响。
6. 全链路压测可以自动化压测,减少人工成本,并提高压测频率,快速发现问题。
看完这些目标,你是不是有一种热血上涌的感觉?内心不由得感慨:“这真是一把神器,得全链路压测即可高枕无忧!”
这还没完,你可能还在网上看到过很多有关全链路压测的文章,文章里常常会涉及阿里、有赞、饿了么、美团、滴滴、京东、字节、陌陌、达达等一些企业。这些文章经常会给人一种感觉:为了增加系统运行安全性,全链路压测是企业必须要做的一件事情。
那我们是不是要紧跟大厂的步伐,在自己的企业中来做全链路压测呢?
盲目跟随当然不行!每个企业的阶段和项目状态都不相同,必须根据实际情况来判断。怎么判断?这还要从全链路压测的概念说起。
## 拆解全链路压测
我们先来拆解一下全链路压测啥是“链路”简单点说就是几个点连成的线。这个词在IT行业中非常常用但是在性能行业中却是近几年才被广泛使用的“新词”。要讲链路就得说到微服务分布式架构的发展。
一开始在微服务分布式架构还没有流行起来的时候人们大多使用SOA架构它大概的技术架构是这样的
![](https://static001.geekbang.org/resource/image/b1/7b/b1941366b44cf2000ee57e873464367b.jpg?wh=1920x1516)
当然系统之间也有调用但都会通过ESB调用链路也比较短。
进入到微服务分布式架构之后,由于微服务被拆得越来越细,大概的技术架构就变成了下图所示的样子:
![](https://static001.geekbang.org/resource/image/45/b8/45209d910f126f37908e995a9a8fyyb8.jpg?wh=1920x649)
当然,也有其他的表现形式,我们这里只是举个例子方便你理解。从上图看,调用链路明显变长了,这是大流量带来的系统拆分导致的。在这种情况下,识别问题也就更加困难了。
之前一个系统的功能点多,而现在一个系统的功能点少;之前测试一个系统就有一堆的业务逻辑,现在测试一个系统只有很简单的业务逻辑;之前一个系统就可以完成的业务操作,现在得跳好几个系统才能实现。
在互联网的初期,压测主要关注单系统接口,而这完全不能说明系统处理业务的容量能力。随着业务的大规模发展,性能也必须做到覆盖“全部”系统,“全链路”这个概念就显得格外重要了,它指的是系统的全链路。
说到这里,“全链路”的内涵就解释得差不多了,那说到压测,就得有工具、有平台。
由于系统架构的改变是容量改变引起的因而容量出现大爆发的时候要想实现压测工具就必须支持这么大的容量。而之前常用的压力工具像LoadRunner、JMeter等它们本身在分布执行能力、参数化拆分管理能力等方面都有着天生的弊端所以我们必须另外打造具有大容量并发能力的工具。
这也是现在各企业想尽办法来实现自己的大并发压测平台的原因。
理清了概念,我们再来通过对比加深一下理解。因为全链路压测是为了满足线上环境的容量需求,所以这里我们主要将全链路线上压测和传统线下压测进行对比:
![](https://static001.geekbang.org/resource/image/f3/b5/f333c161f50604e39b467bcc1df85fb5.jpg?wh=1920x1044)
从表格中,你可以很清晰地看到二者的区别,但是这些对比点是不是固定的呢?不是的。比如说,在传统线下压测环境中,我们也能使用生产的脱敏数据。所以这个表格只是给你一个粗略的感觉。
我们抽象一下全链路线上压测和传统线下压测的区别,其实就一个关键点:在线上测还是在线下测。其他的区别也可以不算是区别,因为那些区别点都是可以平衡掉的,比如说压力场景、铺底数据、监控手段等,关键在于投入多少。投入的内容包括了:系统的改造投入、人员的投入、环境的投入、时间的投入。
有人说,既然投资这么大,不搞全链路不行吗?
## 你需要全链路压测吗?
当然可以。在我看来,现在很多企业都把全链路压测给整偏了。不管企业是大是小、系统是大是小,也不管成本高低,很多人都只是想实现全链路压测,摸到技术的风向标,这在我看来大可不必。
实际上,要不要使用全链路压测需要充分考虑企业的实际条件,你可以先来考虑这么几个问题。
第一,你的企业有没有那么大的流量需求?
按我前面所列的量级,如果不到几十万、上百万、上千万/每秒的交易量,其实完全不用考虑全链路压测平台的实现逻辑。如果你只是觉得这逻辑听起来更高大上而去实现它,那投入的成本等于说是打了水漂。
第二,你的系统要不要做全链路线上压测?
如果你不是在线上做全链路压测,那很多业务流量的改造工作就可以完全忽略。甚至,你都不用考虑改造什么压力工具,这纯属是在给自己找麻烦。
第三,你的系统能不能做全链路线上压测?
大家可以看到,网上有关全链路压测的文章几乎都来源于互联网企业,而其他行业则是在后面跟风。为什么偏偏是那些互联网大厂特别需要全链路压测呢?首先是因为请求量大。其实,互联网大厂需要的环境太大,致使再弄一套测试环境的成本过高。再者,做全链路线上压测的系统,即使出了问题,也不会对企业利润产生太大的影响,这一点至关重要。但是,对于一个刚起步的小互联网企业来说,如果连正常的业务功能都不能保证按时按质地实现,还要加这个改造的工作量,我觉得也是不理智的。
我看到有些银行、证券企业也在做全链路线上压测,在我的经验里,银行、证券这些和钱有关的大企业,做全链路线上压测都是经过了多轮的验证和压测范围的缩减的。你看,这些大企业尚且如此,普通小企业就更应该根据实际情况量力而行了。
有人说,我们系统很多,一个系统一个系统地在线上做全链路压测行不行?如果你这么说,就意味着已经不是“全链路”了呀。
第四,你的组织支持不支持你做真正的全链路线上压测?
这是一个很严肃的话题。很多大领导是看行业新闻来判断方向的,技术层的领导是看行业风向来判断具体动作的,而苦逼的底层干活的人只能执行任务。
在全链路线上压测这件事情上,必然不是底层干活的人(部门经理及以下)可以决定的。全链路线上压测是需要企业上下层协调一致才可以做得到的。如果领导只是给你安排了一个做全链路线上压测的任务,但没有给你具体的权限支撑,是不可能做得下去的。而恰好有很多上层领导就是这种光安排任务,不给具体支持的风格。
这时,你得跟领导详细沟通一下,把成本利弊都分析清楚。如果从企业角度思考后,你们一致认为全链路压测是必须要做的,那就需要领导更具体的支持才行,不然可能很难推进。
基于以上四点,你可以在企业中考量一下还需不需要做全链路压测,我估计,问完自己这四个问题,很多人都会发现自己的公司不太适合做全链路压测。不过对于另一些企业来说,全链路压测却不可或缺。因为它能解决以下三个问题:
1. 直接使用生产环境,避免了环境的差异性。
2. 实现高并发广域网压测平台,模拟了真实的用户场景。
3. 不用进行线下线上容量的推算。
传统的线下压测显然做不到这三点。如果以上三个问题对企业的影响较大,那么全链路压测就很有必要了。问题来了,如果想做到这几点,要做哪些具体的改造呢?
## 如果企业要做全链路压测,系统要做哪些改造?
### **压力工具改造**
这涉及到流量问题。如果你的压力场景只需要万级每秒以下的请求量级,其实不需要做工具改造,传统工具就能做得到。但是如果需要更大流量,就得对压力工具进行改造了。压力工具改造的内容有哪些呢?
1. 压力发起部分:主要是多节点分布式的改造。
2. 参数化部分主要是数据量大引起的改造需求。在传统的压测工具中基本上都是使用Master-Slave的方式master负责拆分参数化数据但当数据量过大的时候显然这是个问题点。
改造的部分只有这两点,在其他的功能点上传统的压力工具是可以覆盖大流量的压测需求的。
### **业务流量的改造和隔离**
在业务流量的改造和隔离上通常有两种做法。第一,实现全链路的压测流量识别,从而实现隔离。第二,只在入口做压测流量的识别,直接旁路到另一套独立的链路中去(这里的硬件可以共用,但是会增加部署的复杂度)。
下面我们来说说,如果用第一种方法进行业务改造,有哪些技术点需要考虑。
业务标记改造的目的是实现业务流量的隔离,业务流量隔离的目的是不让压测流量影响真实的线上用户。**贯穿业务改造的关键是整个业务流的识别跟踪,最后还可以方便地进行数据的清理。**具体业务改造需要包含哪些方面呢?
* 脚本改造
也就是加上流量标记,以实现后续的流量隔离。这一点任何一个压力工具都只需要加个参数即可,没有复杂度。
* 应用服务改造
这将是改造工作量最大的部分。改造要实现的是对流量标记的识别,再把请求旁路到相应的存储组件中去。
有人说,这里能不能直接在网关上做改造,后续所有的技术组件都单独搭建一套呢?显然这也是可以的,只是单独搭建还是涉及到成本。如果愿意投入,直接搭建一套生产环境更为霸气。
应用的改造主要是对现有的业务代码进行入侵式的改造,增加业务开发的工作量。 实现的手段就是跨线程透传将压测流量写入ThreadLocal对象中。
* 中间件的改造
对于一些跨服务调用使用的中间件,由于需要对压测流量进行标记,所以也是需要改造的。
* 存储逻辑的改造
不管是缓存还是数据库、队列,都要对压测流量进行识别,以便隔离。目的就是不影响生产数据。
对缓存比如Redis)我们可以实现不同的key值对于数据库我们可以实现影子表或影子库。
* 日志改造
压测流量的日志最好不要和生产日志在一起。有人说,既然有了标记,那按标记删日志就可以了嘛。但是,有过性能经验的人都知道,日志做得不好,对性能的影响还是非常大的。所以既然已经做了应用服务的改造,那把压测流量的日志也单独写才是更理智的。
第二种业务流量改造方法比较简单,只要在网关做压测流量的识别即可,后面就全都是部署的活了。
### **全链路压测对监控系统的影响**
对于监控系统,不应该用改造这个词了。由于线上生产系统是必须有监控的,因而全链路压测不涉及太多对监控系统的改造,它更多的是工作量的增加,例如增加影子库这样的监控点。
对于一些改造后并没有增加节点的技术组件和模块来说,在监控上则没有影响。
## 总结
好,到这里,关于做全链路压测的必要性和改造点我就讲完了,我们来对这节课做个小结。
首先,我们梳理了全链路压测的概念,它强调了线上覆盖全业务链的最大容量场景。
然后,我们探讨了什么样的公司适合全链路压测。我请你思考了四个问题:
* 你的企业有没有那么大的流量需求?
* 你的系统要不要做全链路线上压测?
* 你的系统能不能做全链路线上压测?
* 你的组织支持不支持你做真正的全链路线上压测?
考虑好这几个问题,才能确定是否适合做全链路压测。
最后,我带你梳理了进行全链路压测前具体的改造路径,它包括压力工具改造和业务流量的改造与隔离。另外,全链路压测还会对监控系统产生一定影响。
面对全链路线上压测,希望你理性分析它的实施成本和上层的支持力度。切忌在没有必要的航线上不断试错。如果你的企业确实需要做全链路压测,那就要把改造的细节列清楚,并计算出成本。不盲从,不夸大,不缩小,做真正有价值的事情。
## 思考题
在结束今天的学习之前,我还想请你思考这两个问题:
1. 什么样的系统才需要全链路线上压测?
2. 如何计算全链路线上压测的成本?
欢迎你在留言区与我交流讨论。当然了,你也可以把这节课分享给你身边的朋友,他们的一些想法或许会让你有更大的收获。我们下节课见!