bilibili全链路压测改造之全链自动化测试实践

news2024/11/15 18:24:00

 

01 、背景与意义

B站直播营收送礼业务有着高写、在跨晚和S赛等大型活动下流量陡增、数据实时性要求高等特性,传统压测对于写场景为了避免影响线上数据做了各种屏蔽和黑名单处理,有着无法逼近线上真实情况的问题,因此业务对全链路压测有着较大的诉求,需要通过全链路压测来系统性地评估服务容量,发现瓶颈和隐患。

对于该诉求,直播技术侧结合公司的全链路压测方案,对营收送礼业务进行了全链路压测的服务改造。整个过程涉及到营收核心服务、底层中间件、压测sdk、压测控制台、施压平台等多处改造,链路长、配置多、影响的业务广,对质量方面的要求非常高,测试面临了比较大的挑战。一方面,要保障全链路压测安全可控,各个改造节点均需确保正确可靠,另一方面因底层改动带来的上层业务测试回归量巨大,测试效率难以保证。基于以上痛点,我们设计了全链自动化的测试方案,并与项目一起实践落地。接下来,我们来详细介绍下该方案的设计,希望能对一些正在或即将进行全链路压测建设的团队在质量保障工作上带来一些灵感和参考。

首先,我们先来介绍下业内普遍的全链路压测方案以及B站采用的方案,再基于具体的改造点来看测试范围。

 1.1 行业内全链路压测方案对比

方案一:流量混布, 存储隔离, 线上施压

  • 对线上服务压测,压测前根据容量预估和压测目标,对线上服务进行扩容和cpu、mem等相关配置的变更。

  • 压测产生的数据与线上真实数据做隔离,采用影子库表的方式,防止污染线上真实存储。

  • 需构造压测数据和压测流量,通过压测标记来区分流量属性。

方案二:对数据本身做标记, 逻辑隔离,线上施压

  • 对线上服务施压,与方案一的区别在于数据隔离上,不是通过影子库表,而是在原表上增加标记,做逻辑隔离。

  • 业务需要做适配工作来识别流量属性。

方案三:镜像环境 OR 线下压测              

  • 此方案在线下进行压测,部署线下测试环境或镜像环境。

  • 线下环境稳定性不高,硬件资源和压测数据线上线下差异大,压测结果参考价值有限。

技术同学经过调研,基于当前业务的语言栈较统一、基础组件较统一以及服务治理较完善等特点,选择了方案一作为B站的全链路压测方案。

 1.2 B站全链路压测方案介绍

B站的全链路压测方案在B站在全链路压测上的实践一文中有详细介绍,简单来说主要为流量混部、线上压测和存储隔离三个部分:

  • 流量混部

    - 与线上集群资源共用,在深夜低峰时期进行线上压测

    - 通过流量打标的方式对流量进行区分,压测流量均带有压测标识,支持对http请求和grpc请求打标进行全链路压测

    - 服务接入压测sdk,对压测流量进行识别、拦截和处理

  • 线上压测

    - 通过公司的压测平台,进行压测任务和场景设计、压测数据构造以及压测结果分析等,具体压测平台的设计及原理在B站压测实践一文中有详细介绍。

  • 存储隔离

    - 我们采用存储隔离的手段,对db创建影子表,redis创建影子key,mq创建影子topic,将压测流量完全隔离

    - 搭建全链路压测配置控制台,管理压测规则,主要涉及对已接入全链路压测的服务的以下几点配置:

△ 需要压测的接口

△ 压测接口依赖的下游接口的透传/镜像/Mock规则

△ 数据库表的透传/镜像/写丢弃规则

△ 缓存的透传/镜像规则

△ 消息队列的透传/拦截/镜像规则

直播的全链路压测架构图如下,可以看到整体链路,由压测平台施压,被压测的服务接入压测sdk,获取到由压测规则控制台下发的压测配置信息,根据配置信息对接收到的压测流量做处理,如配置了镜像规则的数据表,压测数据写入影子表,对配置了镜像规则的redis,压测的缓存数据写入影子key等等。

针对此链路上如此多的服务改造点(SQL改造、redis改造、databus改造、job改造、context改造、go channel改造、sync/pipeline改造...),如何能又快又好又全面的测试覆盖,是我们设计全链自动化测试方案的初衷,我们将其主要分为三个阶段。

第一阶段,我们对各个新增节点分别做了测试保障,如mirror sdk、压测配置控制台等,保正底层基础能力的正确性。

第二阶段,当基础建设已完成,进入到了业务接入及全流程验证阶段。业务是不停迭代的,其中随着基架的不断演进,业务所涉及的服务也包含了部分历史债,当此套框架真正接入业务后,我们往往在业务实际使用中会发现很多不适配的地方,包括框架设计不够健壮或者业务的使用姿势不规范等原因,需要修复或兼容。这个阶段的测试也是最繁琐、测试量最大、重复性很高的地方,为此全链自动化测试全面应用于此阶段,来提升效率及业务覆盖度。

第三阶段,主要应对于未来的拓展,随着全链路压测覆盖的业务越来越多,当”常态化“的全链路压测计划提上日程,重复的工作和人力成本随之增加。此时测试工具更需要平台化及可视化,为压测前、压测中、压测后各个阶段的重复工作提供有效的自动化支持。

接下来,我们详细介绍在第一和第二阶段中,测试方案的设计及应用。

注释:

  1. 压测配置控制台:全链路压测配置中心,配置被测服务、被测接口、下游依赖接口、被测接口涉及到的缓存、数据库、消息队列。

  2. mirror sdk:为大仓提供的压测控制sdk,通过配置文件可以直接控制数据库、缓存、消息队列等组件对压测流量进行处理。

 1.3 全链自动化测试方案

我们主要遇到的测试难点如下:

  1. 改造均为核心业务,涉及改造的服务数多、接口数多,测试量大。

  2. 改造非常底层,涉及mysql、tidb、redis、databus等中间件,业务逻辑分支多,传统手动测试很难高效全面覆盖。

  3. 改造的服务涉及的依赖和配置多,中间任何节点的错误均可能导致在压测实施时影响到线上,如配置遗漏可能导致数据写到线上库、sdk故障可能导致压测标失效等,需要在压测前的进行“扫雷”。

设计方向思考

  • 广度:借助接口自动化测试平台来保障业务的覆盖度

  • 效率:人工校验转为工具自动校验,自动化校验业务逻辑

全链自动化方案设计主要包含以下三个部分

  • 链路分析

  • 配置确认

  • 自动化校验

02 主要测试过程与实施

 2.1 链路梳理分析

链路梳理是保障全链路压测安全实施的前提,服务改造、压测配置、自动化校验等工作都强依赖链路梳理与分析,梳理工作非常繁琐,使用传统翻代码的手段不仅低效,而且容易遗漏而引发安全事故。这里我们主要采用动静结合的方式来完成链路梳理工作。

工具:

  1. trace追踪:全链路跟踪系统,提供分布式环境下服务调用链监控,还原请求调用关系。

  2. 自动化代码规范扫描与检查工具bilicontextcheck lint:检查代码中不规范使用context的地方以及是否有context传递中断的场景。

静态扫描:调用链中容易出现因ctx使用不规范导致调用链断裂的情况,对此使用bilicontextcheck lint工具用来检查业务代码中ctx不规范的地方,确保调用链不会断,压测标识能完整传递。

链路追踪:依赖链路追踪工具可视化的返回服务链路的依赖关系,各节点对数据库、缓存、消息队列的调用信息等,以下是使用示例。

以上两个阶段,我们完成了大部分梳理工作,但由于业务实际代码逻辑的实现过于复杂和多样,为了保证梳理工作更全面且不遗漏,我们最后加上人工check代码的方式做补充,打通链路完整性梳理的“最后一公里”。

 2.2 压测配置确认

通过对业务的链路分析,我们明确了具体的压测范围,业务的服务依赖关系,接着需要在压测控制台进行整个链路的压测规则配置,涉及服务的接口配置、依赖接口配置、数据库配置、缓存配置、消息队列配置,根据实际业务场景配置透传、镜像、写丢弃、Mock等规则。

 2.3 自动化校验

测试覆盖率和效率的提升,均离不开自动化测试,因此,测试改造工作也基本围绕"自动化"来展开。在基架改造、业务服务改造、压测配置、服务部署等工作都完成后,将进入测试验证阶段。本阶段主要通过自动化的手段对业务进行正确性验证,两套流量均需包含以下内容的检查:

  • 接口返回校验:response结果需符合业务预期,输入/输出参数检验、格式校验、容错处理、安全检验等

  • 接口存储校验:mysql、tidb、redis的读写符合业务预期

  • 业务异步流程校验:确认压测标识全链路透传,压测流量和正常流量在异步流程下trace均能正常关联,比如送礼链路的异步结算流程,在送礼接口调用完成后,可通过订单id查询结算表数据来验证结算是否异步调用成功

  • 链路完备性校验:结合压测控制台规则,对接口的调用链路进行自动校验

自动化实施的关键key

  • 自动化case需支持切换环境,支持正常流量和压测流量两套流量的构造、识别和检测

  • 数据流能自动化检验,保证调用链路各节点符合预期,包括下游接口调用、数据库、缓存、消息队列等节点

要实现以上功能,我们需要对已有的自动化框架进行改造,保持原自动化case能复用的基础上,增加压测流量构造、链路完备性检测等功能,以下是我们团队自动化框架的分层设计图,红色部分为本次的框架改造点。

自动化框架分层设计

通过上图,可以看到我们的自动化测试框架分为三层结构设计,最上层为case层,按业务做单接口用例和场景用例的编排,中间层为invoker层,做请求封装(http&grpc)、配置管理、断言、中间件连接等基础功能封装和聚合,最底层coverage层包含grpc和php服务测试覆盖率统计功能,本次改造在原有测试框架上进行,对框架的核心改造如下:

  • 增加压测标识“mirror”,通过全局变量 config.mirror 控制流量入口,设计压测标识的从上到下透传。

  • 在invoker层封装链路检测工具集“trace_toolset”,进行链路完备性检查。

  • 在invoker层封装http/grpc请求,request header中增加压测标识mirror。

自动化框架改造 — 入口改造

使框架能支持压测流量的构造,在流量构造层使用全局变量控制流量入口,能一键切换流量指向正常环境还是全链路压测环境。

改造点:在配置文件config中增加压测标识:config.mirror,默认值为空(若值为空则识别为正常流量)。

自动化框架改造 — 压测数据构造

压测写场景,往往涉及到要对压测的上游数据进行构造,如送礼场景,需要压测用户的钱包有余额,压测前需要在相关的影子表插入数据,这类型case属于压测前的数据准备工作,需识别并进行构造。

自动化框架改造 — 自动化链路完备性校验

链路完备:需要确保调用链路完整且染色标不能中断,保障方案分静态收敛和动态收敛两种策略,基于业务验证占据80%+工作量,此验证过程必须尽可能的自动化,为此我们引入链路检测工具集“trace_toolset”,自动进行链路完备性检查。

trace_toolset

基于接口链路的唯一标识traceid,从链路追踪工具中获取链路的各个节点,结合压测规则配置控制台的配置,依次检查调用链中的mysql、tidb、redis、databus的调用是否符合预期,分别对正常流量和压测流量两套规则进行检测,对于校验结果回传至上层case,输出测试报告,以下是链路检查工具与自动化框架结合下的调用流程。

自动化case改造复用

基于服务改造范围大、涉及的接口多、链路长的特性,怎么提升测试效率以及回归效率(底层bugfix回归)是需要解决的一大难题,本次方案主要采用case复用的思路来解决效率问题,复用已有业务沉淀的自动化case,在此基础上,保持case中间部分业务结构不变,通过mirror识别,仅修改头部流量入口和尾部规则校验方法,让case能复用于压测流量,快速将case翻倍。

03 案例实践

 3.1 业务场景和服务依赖梳理

梳理压测接口的服务依赖大盘,以下是某场景的服务依赖关系图,通过服务依赖关系确认哪些服务需要接入压测:

根据深度遍历:定位到某个服务依赖其他服务的接口,对链路上的每个接口以及接口涉及的db、redis、databus做确认。

 3.2 服务压测配置

基于梳理出来的链路关系在压测配置控制台进行配置,需根据实际业务场景配置透传、镜像、丢弃等规则。

 3.3 业务自动化测试

  • 正常流量自动化业务验证

  • 压测流量自动化业务验证

  • 业务逻辑、存储、trace完备性检查

 3.4 问题排查与修复

对于运行失败的自动化case进行排查与修复,测试过程中主要可以发现以下4类问题:业务涉及的服务代码问题、配置问题、sdk&压测控制台问题、基架问题等。

 3.5  预发验证,灰度部署上线

制定上线流程、进行风险评估和应急预案准备,实时监控上线过程, 确保业务安全无损上线。

 3.6 线上全链路压测执行,压测结果分析

业务进行线上全链路压测,通过压测平台进行施压,发现潜在的业务风险。

 3.7 全链路瓶颈分析与优化

对全链路压测过程中发现的异常点逐个进行排查与分析,探索系统瓶颈和隐患,确保业务服务的稳定性。

未完待续

对于全链自动化测试方案的第三阶段,面对未来可能出现的由业务”常态化“全链路压测带来的人力成本高、重复工作多等问题,我们的测试工具也在持续建设以贯穿整个压测生命周期,第三阶段的方案在后面的实践中我们再来为大家深度分享。


软件测试学习资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

这些资料,对于想进阶【自动化测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等配套学习资源免费分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拿下阿里自动化测试岗23k*14薪offer的全程面试记录解析以及总结,一面二面三面,项目,功能,自动化,性能测试,面试题问答

一、自我介绍 面试官您好!我叫xx,来自深圳,毕业之后一直从事于软件测试的工作,有做过保险、金融、电商等项目;有做过做功能测试、接口测试,自动化测试,在工作中积极主动、可以独立的完成测试工…

shiro(一):shiro基本概念及基本使用(认证、授权)

1. 权限的管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用…

算法刷题打卡第76天:判断矩阵是否是一个 X 矩阵

判断矩阵是否是一个 X 矩阵 难度:简单 如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 : 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0 给你一个大小为 n x n 的二维整数数组 grid ,表示一个正方形矩…

CV——day72:从零开始学YOLO——YOLO-v3(可以在我的资源里下载完整的v1到v3的笔记啦!)

YOLO-v36. YOLO-v36.1 YOLO-v3 改进综述6.2 多scale方法改进与特征融合6.3 经典变换方法对比分析6.4 残差连接方法解读6.5 整体网络模型架构分析6.6 先验框设计改进6.7 softmax层改进6. YOLO-v3 **tips:**作者本人因为美军广泛运用于军事领域,所以决定不…

基于php电影点播平台/电影网站

摘要网络技术给生活带来了十分的便利。所以把电影点播平台与现在网络相结合。在点播平台发展的整个过程中,电影信息管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类电影信息管理程序也在不断改进。本课题所设计的电影点播平台,使…

张艺谋《满江红》起诉自媒体人,杨语莲推荐周兆成意在下个谋女郎

伴随着兔年春节的到来,又迎来一波贺岁剧热潮,著名导演张艺谋的《满江红》,也如期和观众朋友见面。随着春节的逐渐结束,贺岁电影《满江红》票房,也再次创下了新高,关于这部电影的话题也多了起来。 最引人关注…

中国电子学会2021年12月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程(Python)等级考试试卷(一级) 一、单选题(共25题,共50分) 1. 昨天的温度是5摄氏度,今天降温7摄氏度,今天的温度是多少摄氏度?( ) A. 12 …

利用ChatGPT自动编写下载高德地图poi数据的代码

最近ChatGPT很火,它自己对于自己的解释如下图。我们可以让它来帮我们写代码,属于是薅机器人羊毛了。 首先注册账号,可百度,如:【教程】ChatGPT 保姆级注册教程,但中国大陆手机号不支持OpenAI的注册服务&am…

进程概念(PCB、进程创建、进程状态等)

进程是一个运行的程序,是所有计算机的基础。这个过程与计算机代码不一样,尽管它们非常相似。程序通常被认为是 “被动的” 实体,而进程则是 “主动的” 实体。硬件状态、RAM、CPU和其它属性都是进程持有的属性。下面我们就来了解更多关于进程…

活体识别1:近红外(NIR)图像特性

说明 最近在接触活体识别,在网上找到一个介绍近红外光(NIR)特性的论文,我简单做个笔记。原文的全文在文末参考资料里。 来自:[1]隋孟君,茅耀斌,孙金生.基于近红外图像特征的活体人脸检测[J].自动化与仪器仪表,2021(0…

Win10下使用WSL2

打包 wsl --export Ubuntu-20.04 E:\Ubuntu\ubuntu.tar.gz 注销之前 wsl --unregister Ubuntu-20.04 导入 wsl --import Ubuntu-20.04 E:\Ubuntu\ E:\Ubuntu\ubuntu.tar.gz --version 2 设置默认登陆用户为安装时用户名 ubuntu2004.exe config --default-user dwb 更新清…

vue 预览 word

最近做的项目要求实现预览word, pdf,png等文件功能,pdf以及png都很简单,轻松百度搞定,但是word预览研究了好久,所以特此记录分享。前端实现预览word分为两种,一种是上传前预览(也就是前端使用in…

SpringBoot笔记:统一请求参数修改(HttpServletRequest流复制),加解密参数也可参考处理

文章目录需求实现思路实战演练实现过滤器Filter继承 HttpServletRequestWrapper实现 RequestBodyAdvice 统一处理请求参数测试代码测试效果需求 需要进行统一的解密请求 header 头里面的关键字 encryKey ,将解密出来的值赋给 provinceId 并传递给后端的每一个请求接…

23年 yolov5车辆识别+行人识别+车牌识别+车速检测代码(python)

行人识别yolov5和v7对比yolo车距yolo车距1代码:yolov5车辆检测代码 已有1503人下载 代码无需更改,直接可以预测!!! 流程: 版本与配置声明 # YOLOv5 requirements # Usage: pip install -r requirements.tx…

C语言--结构体初阶

目录前言结构体类型的声明什么是结构结构的声明结构体变量的定义结构成员的类型结构体变量的初始化结构体的成员访问结构体传参函数调用的参数压栈前言 在前面的C语言学习中,我们学习了形如char,short,int,float等的不同类型的变…

活动星投票臻我风采评选视频投票的功能在线投票程序

“臻我风采评选”网络评选投票_线上小程序的投票方式_视频投票的功能_在线投票程序用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票服务…

即时通讯开发之详解TCP/IP中的IP选路、动态选路

静态 IP 选路 1一个简单的路由表 选路是 IP 层最重要的一个功能之一。前面的部分已经简单的讲过路由器是通过何种规则来根据 IP 数据包的 IP 地址来选择路由。 这里就不重复了。 对于一个给定的路由器,可以打印出五种不同的 flag:  U 表明该路由可用。  G…

Qlik Sense Enterprise Windows版(非集群)——详细安装步骤

Qlik Sense分为客户端(Desktop)和服务器(Server),本文主要介绍Qlik Sense Server的图形化界面安装操作。 安装方式也分为两种,一种是图形化界面安装,另一种是静默安装。一般只有在特殊报错情况下我们才使用静默安装,静默安装的方…

实现分页查询

实现分页查询一、分页要素与语法二、例:博客系统文章列表页2.1 原始前端代码2.2 实现:查询分页数据验证2.3 实现 “首页” “上一页” “下一页” “末页”前端代码添加得到总页数实现 四个点击效果验证一、分页要素与语法 分页要素: 1&…

Qt音视频开发13-视频解码线程基类的设计

一、前言 这个解码线程基类的设计,是到目前为止个人觉得自己设计的最好的基类之一,当然也不是一开始就知道这样设计,没有个三五年的摸爬滚打以及社会的毒打,是想不到要这样设计的,一方面是要不断提炼各种视频类视频组…