稳定性全系列(二)——如何做线上全链路压测

article/2025/11/5 20:47:43

目录

一、背景介绍

二、准备工作

三、拆分详解

3.1 确定需要哪些团队参与

3.2 确定全压技术方案

3.3 确定全压目标和计划

四、总结


一、背景介绍

如今,在微服务架构盛行的互联网时代,微服务架构下模块(本文指可独立部署的服务)之间的关系错综复杂(哪怕是避免模块之间的直接循环依赖都很变得困难),评估一整套业务系统(集群)的容量已经不像评估单机系统那样容易,而系统的容量评估,是稳定性建设的核心内容之一,是我们绕不开的主题。

有了系统容量评估,配合今年的业务目标,我们才知道应该申请多少预算、什么时候需要扩容、系统瓶颈在哪、哪些服务(模块)需要扩容。评估系统容量或者准确的说评估线上系统的容量现阶段最优效也是最准确的方式就是进行线上全链路压测。

二、准备工作

你要问实现线上全链路压测难不难?当然难(现阶段稳定性工作哪一项不难?),但依然有迹可循。而且和当前技术体系的系统化建设程度以及各团队之间协作有关系。想实现线上全链路压测,我们需要做如下三个方面的准备工作(为了描述简单,本文的全压指的是线上全链路压测):

  1. 确定需要哪些团队参与
  2. 确定全压技术方案
  3. 设定全压目标和计划

三、拆分详解

3.1 确定需要哪些团队参与

全压绝对是一项耗时耗力的工程,特别是刚开始的时候。首当其冲的当然是得到老大的支持,一般需要参与进来的至少有研发测试运维三个团队。研发团队主要负责技术方案的设定和实施(当然如果有架构组或中间件团队,技术方案的设定可以交给他们),测试团队负责验证全压方案和数据的正确性以及真正的施压,而运维团队需要关注压测对线上集群的影响以及一些辅助工作(例如提前调整网关的限流阈值)。

3.2 确定全压技术方案

这一步应该是难度最大的,不同技术体系具体实施方案当然不一样,但可以相互参考,就拿我的业务部门举例,我们服务端是Java栈,整个业务流量符合如下链路:

上图最左边的App指的是用户手机中装的App,从后面的链路我们可以看出,业务网关后面就是我们的服务端系统,各模块之间使用Dubbo来进行交互,当然异步用的是DDMQ,而当模块需要使用集团的中台服务时,我们使用的是HTTP。模块内部还使用了线程池,也使用了MySQL、Redis等外部服务。

第一步,确定“全链路”应该包含链路(或顶级接口),所谓的全链路,它其实是一个相对的概念,在刚开始做全压时,我们主要是把线上的核心链路找出来,找到这些链路的顶级接口,这其实就是发压的主要入口。

第二步,确保压测标识在这些链路中传递以及处理,第二步是最难的也是最复杂的,我们要分析第一步中这些链路中如何有效安全的传递压测标识,压测标识是系统中用来区分压测流量还是线上正常流量的标识,我们要保证压测标识正确的传递和清除,否则可能导致严重的线上事故。这里将给出我们的做法,供大家参考,主要分四大部分:

1.尽可能的对模块无侵入或低侵入

微服务架构下可独立你部署的模块数可能会非常惊人,任何能成功实时的技术方案都应该要求是对业务模块是无侵入或者是低侵入的,否则将影响方案的推广以及实施成本,我们为了做到这一点,打算直接在我们的基础组件(内部使用的公共库和中间件)动刀子,尽可能的对用户透明。

2.压测标识安全的传递和处理

这个要分模块内模块间模块外三个部分来考虑:

模块内:假如模块内部已经知道该流量是压测流量,我们如何保证该压测流量能在模块内部复杂的逻辑处理中不丢失?模块内主要考虑的是线程中和跨线程执行的时候,压测标识容易丢失,线程中,我们使用的是对ThreadLocal的包装类(我们没使用阿里开源的TransmittableThreadLocal)。而为了能够跨线程传递,我们修改了taxi-thread公共库,将其中的TaxiThreadPoolExecutor等类进行了修改,加入了压测标识的传递(这里补充下背景,我们为了traceId能跨线程传递,在taxi-thread公共库中包装了JDK线程池相关的类,并在开发规范中要求研发同学不能直接使用JDK原生的线程池)。还有一块,就是日志打印,为了能准确区分压测流量和正常流量,也为了压测流量不污染线上数据(比如线上很多模块有埋点日志),我们修改了taxi-log(我们这边没有直接使用SLF4J,而是使用包装过的日志公共库taxi-log),将压测流量所有的日志打在原日志目录下的shadow影子目录下,这一切对用户也是透明的。

模块间:我们这边模块间的通讯方式主要是Dubbo和DDMQ,Dubbo这块的话我们直接通过Filter来实现压测标识传递,而DDMQ本身就自带压测标识传递方式,可以直接使用。

模块外:这一部分主要是存储、缓存以及一些外部服务(比如上图的中台服务)。

  1. 存储例如MySQL、MongoDB等,我们必须要隔离压测和线上数据,所以我们会事先建好所谓的影子表,影子表其实和线上表的区别就是表名,影子表会在真实表名前加一个shadow_前缀,而我们的taxi-mybatis、taxi-mongo等公共库在识别到压测标识时,会给表或者文档名称前也带上shadow_前缀。之所以只是做表隔离而没有做库级别隔离,考虑到的还是降低侵入性和成本。关于存储,还有一个关键点,假如模块只提供查询服务(比如某些配置中心),如果按照前面说的,存储接入压测标识这块做成无侵入的话,全压流量查询也会走影子表,这也许是我们不希望看到的,所以在MySQL这块我们特意做成有侵入的(需要加一个插件配置),否则默认不识别压测标识
  2. 对于分布式缓存,我们使用的是Redis,这一块的处理方式和存储类似,我们修改了我们自己Redis包装的公共库,如果是识别到压测标识,默认在操作的key上加一个shadow_前缀,保证压测流量不污染线上缓存数据。
  3. 对于外部服务,我们使用的是HTTP来调用,所以修改了我们taxi-util中的HTTP组件,做了压测标识的传递,保证下游外部服务能知道这是压测流量。那肯定有人问,如果下游服务不支持压测流量识别该咋办?所以这里我们借助了SDS服务降级系统https://github.com/didi/sds),可以只对压测流量进行拦截,使其不调用下游外部服务。

最后的效果如下:

第三步,确保全压流量能被监控到,这涉及到我们在实际全压中能否直观的感受到压测流量,这一块需要和内部的监控系统来打通,由于能方便的取到压测标识,这一块的实现我们不再阐述。

第四步,准备全压数据,确定接口调用比例最理想的方式是能对线上流量进行克隆、放大和处理,作为压测输入数据来重放,但这块难度较大,需要有好的平台来支撑,我们目前只能使用更简单的方式来造数据。由于无法使用仿真数据,我们提前在影子表中造了一批用户、设备信息、位置等和业务相关的数据,然后去线上统计了链路上各顶级接口的流量和交易量的比例,来作为压测时流量放大的依据。当然,必不可少的还有一个发压工具或平台,例如滴滴的奥创发压平台。

3.3 确定全压目标和计划

全压前我们需要定下全压的目标,比如当前我们交易系统能支撑100W订单(现有日单量峰值),而业务今年的目标是冲击300W日订单,那按照峰值流量2倍来算,我们的交易系统需要支撑600W的单量,那么第一次全压的目标可以保守些,定为日订单200W。因为哪怕线下验证已经充分,全压时也会遇到各种出乎意料的问题,当然发现问题其实也意味着我们发现了系统容量瓶颈,这也是全压的主要目的之一。全压计划也同样重要,因为我们系统一定是在不断的迭代中,上一次的全压结论可能会很快“过期”,所以我们需要定下明确的全压计划和节奏,不断降低全压的人力成本,使这一稳定性建设工作持续有效的进行下去。

四、总结

截止到目前,我们已经进行过很多轮的全压,也在不断往全压中补充新的链路,加入新的模块,目前全压的人力成本还是较高,我们也在探索全自动化全压方案,到时候有成果将和大伙继续分享。

 

其他稳定性全系列文章:

稳定性全系列(一)——如何做好系统稳定性建设 https://blog.csdn.net/manzhizhen/article/details/103642565


http://chatgpt.dhexx.cn/article/9QPh9MuE.shtml

相关文章

全链路压测应该怎么做?答案都在这里了!

“双11前最后一次全链路压测,所有技术、系统、安全策略与应急预案被一一演练。流量峰值,一秒内有几千万次请求,这意味着一秒会产生数百万次交易。"这是2018年阿里双十一前夕战况。随着互联网的发展与各种新业务的出现,全链路…

全链路压测,你想要的全在这里

步骤一:确定压测目标 压测目标主要包括压测范围、策略、目的,往往与业务、技术目标息息相关。例如: 压测范围:用户注册加登录,为大规模拉新做准备。压测策略:高仿真生产环境压测,提前经历真实…

全链路压测那点事(一)

个人介绍:大家好,我是大猫,2015年加入百度质量部,负责百度前端展现架构测试工具开发。曾负责并开发基于spark的阿拉丁模板召回查询系统与搜索前端阿拉丁模板页面diff工具,均取得良好效果。2018年加入贝壳质量部&#x…

介绍一下全链路压测平台的相关内容

随着互联网技术的不断发展,越来越多的企业开始依赖互联网来实现业务的发展和增长。而对于这些企业而言,如何保证他们的业务在高并发、高负载的情况下依然能够正常运行,是非常重要的一个问题。为了解决这个问题,企业可以使用全链路…

你“被”全链路了么?全链路压测实践之理论

要说当下研发领域最热门的几个词,全链路压测 肯定跑不了。最近的几次大会上,也有不少关于全链路的议题。之前有朋友在面试过程中也有被问到了什么是全链路压测,如何有效的开展全链路压测。今天我们就来聊聊全链路压测,但本文不会涉…

全链路压力测试

压力测试的目标: 探索线上系统流量承载极限,保障线上系统具备抗压能力 复制代码 如何做全链路压力测试: 全链路压力测试:整体步骤 容量洪峰 -》 容量评估 -》 问题发现 -》 容量规划 全链路压力测试:细化过程 整体目…

全链路压测的“谜”

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

软件测试——全链路压测原理

摘要 全链路压测平台主要有两个核心的也是最顶级的要求:全业务,全链路。这导致了,必须线上搞压测,必须用线上的真实数据搞压测。那么线上搞就容易搞出事情,所以技术含量还是要有的,还是很高的。 一、压测…

性能测试之全链路压测实战理论详解

前言 要说当下研发领域最热门的几个词,全链路压测 肯定跑不了。最近的几次大会上,也有不少关于全链路的议题。之前有朋友在面试过程中也有被问到了什么是全链路压测,如何有效的开展全链路压测。今天我们就来聊聊全链路压测,但本文…

全链路压测方案

双十一的技术准备在做两件事情&#xff1a;第一是系统的准备尽可能的接近真实&#xff0c;包括容量确定性和资源的确定性&#xff1b;第二是整个过程中的效率&#xff0c;包括人和单位资源效率。 < 演讲视频 > class"video_iframe" allowfullscreen"&quo…

全链路压测原理篇(方案 概念 架构 实现)

大促之前全链路压测原理篇 大促之前全链路压测原理篇全链路压测的意义链路压测方案刨析线下压测预生产环境压测引流压测全链路压测四种压测方案对比 全链路压测概述什么是全链路压测解决什么问题精确的容量规划进行全链路的性能监控 如何展开全链路压测 业务模块介绍全链路整体…

全链路压测原理剖析(Coding)

引言 … 什么是全链路压测&#xff1f; 相对于传统的单接口压测&#xff0c;全链路压测旨在能完全模拟真实的用户的施压场景在生产环境或类生产环境执行的压测。在服务器、中间件、数据库等所有软硬件配置上&#xff0c;和线上保持一致&#xff1b;在压测场景上&#xff0c;通…

全链路压测实践

一 背景 随着业务的不断增长&#xff0c;系统的稳定性保障尤为重要&#xff0c;传统压测存在诸多不足&#xff0c;以往的压测中各个业务线对单个接口压测&#xff0c;需要单独准备测试机&#xff0c;测试成本高&#xff0c;而且无法直接压测线上接口&#xff0c;也没有历史压测…

测试学习——全链路压测

参考资料&#xff1a;全链路压测平台&#xff08;Quake&#xff09;在美团中的实践 全链路压测简介 - 性能测试 PTS - 阿里云 聊聊全链路压测 - 老_张 - 博客园 基于实际的生产业务场景和系统环境&#xff0c;模拟海量的用户请求和数据&#xff0c;对整个业务链路进行各种场…

全链路压测及阿里全链路压测详解

一、前言 很多公司有线下性能测试&#xff0c;那为什么还要做全链路压测呢&#xff0c;全链路能解决一般性能测试的什么问题呢&#xff1f;我认为在每个环境做性能测试是相互补充的过程。在线下的性能测试&#xff0c;由于机器监控&#xff0c;部署迅速以及相应的权限充足&…

全链路压测

核心流程 全链路压测实施的核心流程如下&#xff1a; 骤一&#xff1a;确定压测目标 压测目标主要包括压测范围、策略、目的&#xff0c;往往与业务、技术目标息息相关。例如&#xff1a; 压测范围&#xff1a;用户注册加登录&#xff0c;为大规模拉新做准备。压测策略&#…

说一说IT管理的证书:PMP、高项、IPMP

说一说IT管理的证书&#xff1a;PMP、高项、IPMP 一、PMP二、 高项三、IPMP四、PMP、IPMP、高项对比 作为新一代的农民工&#xff0c;提升也成为内卷大环境下必不可少的一个环节。这里来说一说IT项目管理类的证书认证。 一、PMP pmp是由美国PMI推出的&#xff0c;将项目管理划…

IT资质认证证书如何查询?这篇文章教你查询方式

目前IT行业企业常见的体系和资质认证已经超过了30种&#xff0c;如此众多的体系或资质认证品类&#xff0c;查询渠道也不尽相同&#xff0c;今天小编简要介绍下几种常见证书查询方式&#xff0c;方便大家需要时使用。 ITSS运维维护标准 证书示例 ITSS信息技术服务标准是我国自…

Rancher证书更新

一、环境 主机名IP地址操作系统rancher版本K8s-Master192.168.10.236Centos 72.5.9 二、更新证书 1、查看当前证书到期时间 2、进行证书轮换 [rootK8s-Master ~]# docker ps |grep rancher/rancher d581da2b7c4e rancher/rancher:v2.5.9 &q…

计算机类证书之微软厂商认证分享

MCP、MCT、MVP 最近想考一些计算机证书&#xff0c;网上简单看了下。大致分为国家代表队的计算机技术与软件专业资格考试证书、国内大厂代表队的华为认证、外企代表队的微软认证。在这里给大家分享下&#xff0c;留给有需要的同学。 计算机技术与软件专业资格考试证书 是由国…