上文写到隆冬强在去S公司调研之前,向小黑咨询关于「容量规划」的问题,得出了一个结论:即使全链路压测有很多技术难点需要结合业务需求等实现,但确实是解决目前容量规划的效果最好、可行性最高的方案。
对于刚接手S公司项目的隆冬强来说,调研后依然有很多疑惑,隆冬强心想明天一定要找个机会问明白。第二天隆冬强正好在电梯里偶遇了小黑,于是就有了以下的对话:
“小黑,我昨晚回家后辗转难眠,有几个问题想不明白,你一定要给我解答解答……目前市面上提供全链路压测方案的公司有很多,这些方案也不尽相同,那我应该怎么选择合适的全链路压测产品呢?这些全链路压测产品之间有什么不同?或者有没有什么核心原则或者特性是必不可少的?”
小黑回答说:
“以我们公司为例,这几年在很多行业的实践落地沉淀经验,不同规模和业务需求的公司在选择全链路压测时的侧重点也有所不同,比如最明显的有架构、系统、中间件、数据库等区别。
但无论如何有三个核心原则是不变的,那就是一致性(Consistency)、隔离性(Isolation)、稳定性(Reliability)。
一致性是指压测环境与生产环境的高度一致性,而不是传统意义上的性能测试环境、预发环境等。从性能测试从业者角度看,这个操作是有高风险的。
传统的性能环境,相当于是一个简化环境的培养器皿,在这个环境测试出来的数据,与真实的生产环境数据不存在直接的关联。
在当前分布式架构下,影响性能表现的因素非常多,比如网络结构、网络带宽、系统参数、软件配置、链路拓扑、数据维度等等。所以压测环境与生产环境必须高度一致这个条件是全链路压测最重要的特征。
就拿疫苗的研发上市来说, 不管前期在多少种动物身上进行实验,最后都要经过大量的人体临床实验才能上市,就是因为动物和人体环境不一样,只有保证了实验过程中的人体环境与疫苗上市后作用的人体环境的一致性,再经过大量临床经验反复验证其安全性和有效性,最后才能真正的投入市场。
在全链路压测过程中也是如此,只有保证压测环境与生产环境的一致性,当压测数据在真实的线上环境中测试无故障之后,才能保证上线之后的系统也是无故障的。
全链路压测的隔离性,主要是指压测数据的隔离,这部分是全链路压测的技术挑战难点之一。
压测数据隔离:表现为在整个链路上任何一个节点都可以轻松的识别出当前处理的是压测流量还是正式流量。并且对压测过程中产生的压测数据(包括数据库、缓存、搜索、消息、日志等)都能与正式流量的数据完全隔离。
如果不具备数据隔离的特性,影响的不止是压测后续的清理善后工作量巨大的问题,更会严重影响其他部分工作:比如BI的数据分析异常导致管理层无法有效决策,压测和生产数据融合导致无法清理出脏数据。
举个通俗易懂的例子来说明:左图是没有进行数据隔离的泳道,右图是隔离了之后的泳道,白色水管放出来的为真实数据,绿色水管放出来的是压测数据。
当两者共同涌向一个水池时,未隔离的水池会融合这两者变成了脏绿的颜色;隔离的水池即使同时在一个水池里也不会相互交融。
全链路压测的稳定性,主要指压测实施过程中的要保障业务的可用性,不能因为接入压测导致生产的事故。这个阶段会遇到很多复杂的问题,比如说:
- 本来应该隔离的数据被当成正式数据来处理,导致线上环境污染
- 全链路压测中产生的消息未及时消费,导致通道堵塞,影响正常业务
- 全链路压测过程中服务调用超时,部分框架的重试逻辑会导致压测标签丢失
- 系统中用到异步线程的处理(如线程池、异步日志打印等),不会自动传递压测标签,导致压测标签丢失
- ......
众所周知线上环境稳定性对于整个系统来说是至关重要的。大多数公司都能熟练使用中间件,但有能力修改中间件核心逻辑却凤毛麟角,由于全链路压测需要修改大量的中间件核心逻辑,这就要求开发团队必须精通每款中间件,但不是所有团队都具有这样的硬核实力,如果缺少这样的技术支持,在持续上线的过程中,可能会出现很多稳定性问题从而影响正常业务。
业界能提供全链路压测产品和方案的服务商有很多,但他们侧重点有所不同(有些侧重流量发起端,有些侧重流量追踪,也有纯提供解决方案的),以上归纳的三大特性给我们提供了一个新的评估方向,除了功能列表,还可以从更高维度来评估产品和方案的先进性。”
隆冬强听完小黑的全链路压测的CIR原则后,对于全链路压测的三大核心特性有了一个全新的认识,同时对于实施的难度也有了一个更深刻的理解。