全链路压测的“谜”

2023-11-16

前言: 对于性能测试来说,全链路压测肯定跑不了的。在昨天上午的【GIAC全球互联网架构大会】上,网易云就进行了全链路压测的议题。对于有性能测试的公司来说,面试往往会被问到什么是全链路压测、如何有效的开展全链路压测等等。我今天也只是高屋建瓴,站在巨人的肩膀上主要讲讲全链路实践的理论问题。对于这个领域我个人也不熟,因为进行全链路压测对于整个公司技术要求还是很高的,没有一定技术沉淀的公司最好不要贸然尝试全链路压测,因为如果没做好可能会把生产环境搞宕机,当然,实在有需求进行全链路压测的,那必须要有生产故障演练。

一、为什么需要全链路压测

先说说为什么需要全链路。随着业务的发展,技术架构从原来的单体架构发展到现在的微服务架构, 应用越来越多,给研发人员定位问题带来的困难也越来越大。在单体架构时期,只要查看一个应用的日志,就能大体知道问题出在哪里。但是在微服务架构下,基于前端返回的错误信息,你如何从那么长的应用链路中找到出错的应用?找不到具体的应用,你如何查看错误日志?也许你熟悉业务,可以大概猜测出问题在哪里,但这毕竟存在不确定性。在这种场景下,我们就需要一个服务治理平台,来帮助我们展示业务的全链路调用关系,并能通过某个ID,查询出某个请求在业务平台中流转过程。这里提到的服务治理平台,至少要包含功能有:服务的注册与发现,服务状态的可观测以及流量管理。目前主流的服务治框架有:spring-cloud框架,dubbo框架以及service mesh框架。基于服务治理,我们就可以具体的观察到请求在不同应用之前的流转,再结合统一日志平台,我们就可以快速定位到是哪个微服务出了问题,就能针对性的去做排查,这就是全链路跟踪,也是开展全链路压测的第一个基础。
1、单体架构下的问题定位,直接查看系统的报错日志,简洁明了
在这里插入图片描述
2、微服务下这么密集的长链路,你如何去定位呢?
在这里插入图片描述

在说清楚了为什么需要全链路后,我们再谈谈不同架构下,对于性能测试的要求有哪些不同。在不同的架构阶段,对性能测试的要求也不一样,简单来说,可以分成4个不同的阶段:

  1. 全凭经验
    最初互联网起步阶段,也没有什么性能的概念,全部都是由相关的研发人员决定,管它三七二十一,先上线再说,有性能问题直接加机器
  2. 工具压测
    这时候我们会在测试环境借助工具压测接口,例如单接口场景、混合接口场景,对于服务器关注的也是机器的性能
  3. 线上工具压测
    这时候我们会利用线上的空闲时间进行压测,时间往往是在用户活跃最低的时候,例如凌晨,但这种压测我们一般不压测“写”接口,都是“查”接口
  4. 全链路压测
    直接从线上引流,copy线上的数据,最为贴近生产数据

我们通常说的全链路压测,指的是第4个阶段,业务发展到这个阶段时,会面临以下几个棘手的问题:

  1. 单体业务的性能已经得到基本的保证了,但是在这么长链路上,哪个环节会出问 题,并不清楚
  2. 不同业务模块的流量并不完全相同,如何保障核心链路的资源配置,成为重点,但是这个在测试环境是无法有效模拟的
  3. 如何找出集群的性能短板,避免因某个服务的配置问题、性能问题引起集群的性能雪崩,成为重中之重

二、全链路压测解决了哪些问题

引入全链路压测试后,有助于我们解决以下几个问题:

  1. 保障重大活动的系统稳定性:引入全链路压测平台后,我们就可以有效的保障公司重大活动的系统稳定性,因为我们是以生产环境的配置为基础,真实的模拟用户行为。所以,在解决完全链路压测中发现的问题后,理论上,我们是有信心能够保障活动期间的系统稳定性
  2. 精准的容量评估:基于线上全链路的性能压测和监控,我们会清晰的看到流量洪峰来临时,每个业务的流量情况,就可以有针对性的做出容量评估,提高系统资源的利用率。
  3. 端到端的全链路巡检,第一时间发现故障并快速定位问题:基于全链路压测,我们可以做到完全的端到端检测,发现业务集群中的性能瓶颈,及时定位并解决问题,不产生遗留死角
  4. 建立公司的性能运营体系,将运动式的性能优化演化为自发的日常性能优化:当全链路压测体系建立起来后,就可以作为常规的测试手段来进行日常测试,使性能测试常态化,规范化。

三、哪些业务场景适合做

不知道大家注意到没,现在落地了全链路压测的公司,基本上都是电商公司,都存在高强度的交易和支付高并发场景。因为全链路平台的搭建是个高成本的活动,所以我们要思考哪些场景合适引入全链路测试,主要有以下几种场景:

  1. 有强并发的支付交易场景:包含各类大促场景,目前全链路压测的落地实际多出于此类头部公司,例如淘宝、有赞、滴滴、美团等
  2. 需求正常迭代完成,并测试通过,上线后又出现各种各样的系统故障的情况,可以适当引入全链路压测。这种情况一般是由于线上线下的硬件资源配置相差较大,在线下无法正确评估性能资源的使用情况引起的。

四、基础技术能力

既然全链路压测有这么多优点,我们是不是可以大力的推广落地呢?这也是很多面试官喜欢问这个问题的由来。但我们清楚,并不是任何一种技术就能解决所有问题。全链路压测对于整个公司技术有较高的要求,需要公司全体研发人员一起配合,才能有效的落地,否则就是空中楼阁。就像昨天的【GIAC全球互联网架构大会】,里面讲了很多高大上的东西,但是从目前情况来看,这些所讲的内容在我司完全不具备落地条件和能力,所以团队在落地全链路压测时,至少需要考虑以下几个问题:

  1. 如何得到业务部门的支持?
    全链路压测平台不单单是测试部门,或者说测试中台的事,它基本上会涉及到公司所有的核心业务(如果不是,那也没必要做),这需要业务部门的技术配合和改造,那么,在KPI已经很紧张的情况下,如何说服业务部门配合你做改造呢?从某些方面来说,这个并不会影响他们自己部门的KPI,改造的不好,反而还会影响业务,风险较大。
  2. 如何做好数据隔离?
    在生产环境上做压测,绝对不能对真实用户的数据造成影响,那么就需要做好数据隔离,业务侧的系统需要能够识别哪些是真实流量,哪些是压测流量。目前业内通用的做法有两种:流量标识或者影子数据库,这都需要对业务代码做改造。
  3. 流量如何分发
    想要实现全链路压测,那么压力的发起就不能照搬单体性能测试那样,通过自己写脚本来发起压测。需要通过研发并发能力更强,可控性更高的方式,来发起流量。目前业内主流的方式是基于Netty框架做改造,通过NIO的方式发起流量。流量的来源一般是录制上线的真实请求并对数据加以清洗。这需要通过改造中间件来实现。
  4. Mock服务能否支持
    在全链路的压测过程中,必然会接触到第三方的服务(短信、支付、第三方接口等等),如何有效的拦截这些服务并返回正确的数据。而且还不能让Mock服务成为压测中的性能瓶颈,对Mock服务自身的性能要求也会很高。
  5. 数据监控是否到位
    在全链路压测的过程中,是否能够建立起有效的、全方位的监控机制,能够第一时间发现问题?是否有分级、分层监控方案?当发现TPS上不去后,是否能够方便的定位到大致是哪里出了问题?否则全链路压测开展起来就没太大的意义。
  6. 应急团队是否配置到位
    毕竟是在生产上做压测,如果某个服务被压跨了,是否有足够的应对方案,如果发生不可逆的故障(中间件很容易压出问题,如数据库宕机、MQ数据堆积、Redis穿透等等),运维团队是否能够有效支撑到位,快速恢复业务呢?

通过以上问题,可以看出,落地全链路测试,涉及到研发的各个部门,并不是测试人员单方面的事。当我们想要落地全链路时,我们需要考虑清楚团队是否有足够的底层技术来支持。

五、全链路压测简洁流程图

在这里插入图片描述

六、结语

面对全链路线上压测,希望你理性分析它的实施成本和上层的支持力度。切忌在没有必要的航线上不断试错。如果你的企业确实需要做全链路压测,那就要把改造的细节列清楚,并计算出成本。不盲从,不夸大,不缩小,做真正有价值的事情。毕竟全链路压测本身就是一项综合技术要求很高的实践场景,需要整体IT团队在积累了各种前期的技术储备后,共同协作完成,并不是某个部门或者团队的事,需要有人整体的协调和统筹才能真正落地。作为测试人员,我们要了解全链路压测是在做什么,并且能大体知道是怎么做的,需要用到哪些技术能力,再结合团队的具体技术能力,分步骤、有选择的去推动和落地。而不是一味的追求直接就上全链路压测,同时,这是一项更依赖集体的活动,哪怕你技能再强,也不可能一个人完成这项工程,需要分清个人能力和公司平台哪个更重要。对于面试过程中的问题,我们可以针对的讲讲实现全链路的前因后果,理清楚技术栈和实现思路即可。

六、引用

目前,全链路压测所涉及到技术能力,经过大厂这几年的探索,基本上都形成了较为稳定和成熟的方案,有需要的同学可以参考,具体的落地细节我想这还得自己实践,虽然阿里、京东、字节、美团、饿了么、滴滴、陌陌等大厂的技术文章里,都频繁提到全链路压测在企业内部的落地,但是一旦涉及到具体的落地细节,他们却都跟约好了一样三缄其口。
1、哈罗全链路压测介绍:
https://segmentfault.com/a/1190000041751358
2、滴滴全链路路压测介绍:
https://blog.csdn.net/g6u8w7p06dco99fq3/article/details/79119269
3、字节全链路压测介绍:
https://mp.weixin.qq.com/s/k_nwjNEvMk-IteaKIzrlxA
4、饿了么全链路压测介绍:
https://zhuanlan.zhihu.com/p/30511486
5、有赞全链路压测介绍:
https://mp.weixin.qq.com/s/0a-Sd_fCkE2mDFzNpKxf7A
6、全链路压测经验谈 :
https://www.sohu.com/a/298660565_472869?sec=wd
7、全链路压测的大概思路:
https://www.wangt.cc//2021/11/全链路压测思路/
https://www.cnblogs.com/zgq123456/p/10797494.html
8、极客时间-高楼:
https://zhuanlan.zhihu.com/p/423423660

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全链路压测的“谜” 的相关文章

  • SpringBoot微信小程序授权登录

    SpringBoot微信小程序授权登录 一 appId 1 1 自己是管理者 微信公众平台 申请或登录自己的微信小程序 在开发者管理中即可看到 2 2 自己是开发者 让管理员将自己加入到小程序开发者管理中 用管理者提供的appId和secr

随机推荐

  • 【Flink系列】配置管理rockmq-flink产生的rocketmq-client日志

    Flink任务集成了rockmq flink用于订阅消费rocketmq的消息 在任务运行过程中发现会在系统的 username logs rocketmqlogs目录下产生rocketmq client log日志 并且这个日志累积和滚动
  • OException parsing XML document from class path resource [beans.xml]

    项目场景 在学习spring的时候配置xml遇到了一个问题 问题描述 IOException parsing XML document from class path resource beans xml nested exception
  • 通过PAGE生成python GUI界面(用PAGE拖出需要的GUI界面)

    注 当前我的使用环境为windows10 64bit python v3 6 PAGE v4 14 Tcl v8 6 7 0 当前我定义一个目标 最终需要生成一个登录界面的GUI代码 如下 安装好各软件后 就可以运行PAGE来像VB一样所见
  • 【统一解决OpenCV+contrib编译过程中ippicv、face_landmark_model以及boostdesc/vgg_generated文件下载缓慢问题】

    统一解决OpenCV contrib编译过程中ippicv face landmark model以及boostdesc vgg generated文件下载缓慢问题 在编译过程中 ippicv face landmark model以及bo
  • python爬虫之爬取百度翻译

    使用python中requests模块就可以爬取 import requests post url https fanyi baidu com sug headers User Agent Mozilla 5 0 Windows NT 10
  • 【华为机试真题 Python】统计每个月兔子的总数

    目录 题目描述 输入 输出 示例 参考代码 题目描述 有一种兔子 从出生后第3个月起每个月都生一只兔子 小兔子长到第三个月后每个月又生一只兔子 例子 假设一只兔子第3个月出生 那么它第5个月开始会每个月生一只兔子 一月的时候有一只兔子 假如
  • 音视频简易播放器代码范例

    下面是一个简单的音视频播放器代码范例 使用Python语言和PyQt5框架 python import sys from PyQt5 QtCore import Qt QUrl from PyQt5 QtMultimedia import
  • fgets函数的理解

    fget函数的原型如下 char fgets char buf int n FILE fp 功能 从文件流读取一行 送到缓冲区 使用时注意以下几点 1 当遇到换行符或者缓冲区已满 fgets就会停止 返回读到的数据 值得注意的是不能用fge
  • javaweb (一) ——web与servlet

    文章目录 web 1 客户端和服务器 服务器软件 网络协议 虚拟主机 静态和动态内容 安全性 2 URL 3 HTML 4 CSS 5 JavaScript 6 HTTP 请求方法 请求头 请求体 响应状态码 响应头 响应体 7 Web 应
  • 【Spring Boot】Spring Boot框架

    文章目录 Spring Boot 1 概念 特点及其好多 2 springBoot的初体验 2 1 步骤 2 1 1创建项目 2 1 2 加入依赖 2 1 3 启动类 2 1 4 controller类 2 1 5 测试 3 配置文件 3
  • 高标准农田信息化管理平台概要设计

    1 综合信息一张图系统 通过一张图的形式 可视化直观展示地区土地分布 耕地质量 高标准农田建设情况 灌溉情况 设备分布情况及环境监测数据 农业管理者可在一张图上查看农田相关信息 及时了解农田情况 为农田管理者的精准管理和科学决策提供辅助支撑
  • Asp.Net&.Net Core 使用 SonarQube 踩坑记 (使用 MSBuild扫描器篇)

    使用dotnet 需要 搭建 ner core的运行环境 1 首先安装配置java运行环境 且javaJDK 必须是11以上 jdk版本必须大于11 等于11不行 2 java和java JDK后 记得配置java 和jdk建立连接和配置
  • formdata上传文件_关于multipart/formdata上传文件

    最近在做一个文件上传的开放接口 用到Content Type multipart form data这种请求类型 特地做了一些研究和记录 在最初的 http协议中 并没有上传文件方面的功能 RFC1867为 http协议添加了这个能力 常见
  • 深度学习笔试、面试题 二

    1 梯度爆炸问题是指在训练深度神经网络的时候 梯度变得过大而损失函数变为无穷 在RNN中 下面哪种方法可以较好地处理梯度爆炸问题 A 用改良的网络结构比如LSTM和GRUs B 梯度裁剪 C Dropout D 所有方法都不行 正确答案是
  • Linux-写USB键盘驱动(详解)

    1 首先我们通过上节的代码中修改 来打印下键盘驱动的数据到底是怎样的 先来回忆下 我们之前写的鼠标驱动的id table是这样 所以我们要修改id table 使这个驱动为键盘的驱动 如下图所示 然后修改中断函数 通过printk 打印数据
  • 算法与数据结构(七):优先队列

    博主会对算法与数据结构会不断进行更新 敬请期待 如有什么建议 欢迎联系 我们知道队列具有先进先出的特性 栈具有先进后出的特性 那么有没有一种数据结构可以根据自己的需求 以一定的规则从队列中弹出呢 优先队列就是实现这种目标的数据结构 一般情况
  • shell随机读取文件的一行

    bin bash a cat files txt wc l for i 0 i lt 5 i do b RANDOM a b b 1 sed n b p files txt done
  • 微信公众号内嵌H5网页授权步骤

    主要注意点就是回调地址 我是用vue框架开发的 所以单独做了个页面去授权回调 redirectToAuthPage const callbackURL encodeURIComponent https ad jfpays com wcpn
  • Ubuntu 22.04安装Visual Studio Code(VS Code)

    Ubuntu 22 04安装Visual Studio Code 一 下载 打开浏览器 访问VS Code的官方网址 https code visualstudio com 在首页的左侧有两个蓝色的按钮 点击左边的按钮 下载 deb格式的安
  • 全链路压测的“谜”

    前言 对于性能测试来说 全链路压测肯定跑不了的 在昨天上午的 GIAC全球互联网架构大会 上 网易云就进行了全链路压测的议题 对于有性能测试的公司来说 面试往往会被问到什么是全链路压测 如何有效的开展全链路压测等等 我今天也只是高屋建瓴 站