写点什么

全链路压测在大搜车的探索与实践

  • 2020-04-02
  • 本文字数:1692 字

    阅读完需:约 6 分钟

全链路压测在大搜车的探索与实践

如果把双 11 定义为电商公司一年一度的大考,那么全链路压测就是大考之前的一次次模拟考试,帮助要上战场的系统查缺补漏以及进行容量验证和规划。

背景

微服务拆分的背景下,一个简单地请求可能涉及到十几个下游服务,从 CDN 到接入层、前端应用、后端服务、缓存、存储、中间件,哪怕一个环节出现一点误差,误差在上下游经过几层累积后会造成什么影响谁都无法确定,也许是调用延迟,也许是请求失败,用户的体验自然就无法保证。


所以我们需要建立起一套验证机制,来验证我们各个环节的都是符合我们预期的。验证的最佳方法就是让事件提前发生,如果我们的系统能够提前经历几次“双 11”,容量的不确定性问题也就解决了。全链路压测的诞生解决了容量的确定性问题!



核心要素

  • 采集线上的真实流量作为压测数据



  • 省去巨大的人工成本:传统压测模式下,压测数据的准备一直是老大难的问题。双 11 可能涉及几十个系统,每个系统都有几十上百的接口。如果所有接口都要压测,准备数据需要巨大的人工成本。如果只压测核心接口,其它接口的隐患可能就无法发现。

  • 解决数据多样性不足:准备的压测数据往往跟线上真实的流量模型存在差异,很可能会过多的命中 cache 或者数据库缓存。

  • 数据转换:敏感数据脱敏,不符合的数据改造

  • 直接在线上的真实环境进行双 11 模拟



  • 新搭建可对比线上环境的压测环境,成本太大;

  • 测试环境或预发环境压测结果没有说服力,参考价值不大

  • 识别压测流量和真实流量,不产生脏数据,并且不需要业务方改造适配(涉及的系统多且风险较大)



  • 压测流量打上标识,通过 trace(链路追踪中间件)向下游系统传递。

  • 压测流量触发的数据库操作都路由到影子库,不对线上数据库产生影响

  • 第三方系统的 mock

  • 有些第三方系统按照调用次数收费

  • 监控

  • 系统 qps,耗时

  • 硬件监控(cpu,内存)等

系统架构

如下图所示,全链路压测分为基础设施和管理端两大部分。



基础设施

基础设施采用了 Java 动态字节码技术,运行在 jvm 层,已经覆盖了公司 90%以上的应用。


TraceAgent 负责记录链路调用,打印日志到磁盘上。每台机器上都部署了我们的链路日志收集程序,然后把它们存储到 ES 等后端存储中。 全链路压测的数据就是通过这些日志转换而成,同时,基于日志的聚合分析,也形成了我们的监控大盘。


PTS-Agent 主要负责影子库,mock 等逻辑实现。所有的压测流量都打上了压测标识,而且通过 trace 传递,即使跨系统调用压测标识也不会丢失。PTS-Agent 在发现是压测流量,并且配置了影子库,就会动态修改数据库连接,把它们路由到影子库,而正常流量不会受到任何影响,真正实现了业务无感知。mock 等功能也是判断是否是压测流量,是否配置了 mock,执行流程如下图:


管理端

压测执行流程主要分为三步: 准备压测数据 ===> 配置压测计划 ===> 执行压测任务


管理端模块也是按照上面三个步骤划分的


  • 数据集管理:我们提供了灵活的 sql,可以让用户自由的选择采集,哪些应用,哪些接口,多长时间段的线上数据。

  • 压测计划管理:为每个压测场景 配置 影子库,接口 mock 等

  • 压测执行:配置施压机,线程数等,以及开始和停止压测任务实践案例


  1. 数据采集:指定时间范围 以及通过 sql 语法指定采集的应用以及接口



2. 配置压测计划

接口 mock 配置:我们基于链路数据,把需要压测的所有接口的下游调用链路都分析出来,用户可以根据我们的链路图,对任何下游接口实现 mock。




影子库、mq 配置



数据转换功能:如果采集到的谁要做进一步的处理才能使用,则使用数据转换功能,支持 js 语法;


3. 压测执行

3.1 任务的启动与停止,线程数配置


3.2 执行过程的监控,包括 QPS、响应时间、相应状态码、cpu 和内存资源情况,





系统瓶颈定位工具

压测只是手段,我们的目的还是希望发现系统中的瓶颈点。为此,我们也提供了应用拓扑、链路追踪协助大家排查问题,同时也推荐开源工具async-profiler分析方法耗时情况。

应用拓扑:全局视角,快速定位下游系统瓶颈点

该系统可以展示当前系统所有的下游系统,在哪个节点耗时最长一目了然


链路追踪:记录所有调用,方便分析所有慢请求

未来规划

未来,我们会朝着高可用平台发展,不仅会满足大家压测种种需求,同时也将为 故障模拟,故障演练等场景赋能,帮助大家提供故障应对能力,敬请期待。


2020-04-02 14:032530

评论

发布
暂无评论
发现更多内容

用 Go 写一个轻量级的 ldap 测试工具

冯骐

运维 开发 ldap Go 语言

Golang 中的并发限制与超时控制

冯骐

并发 超时 Go 语言

区块链赋能电子合同!构建互联网可信生态整体解决方案

源中瑞-龙先生

上云三问 | 京东云这次的大促有哪些“不一样”?

京东科技开发者

云主机 云安全

3 月日更挑战|春日胜景,记录暖心每一天

InfoQ写作社区官方

七日更 3月日更 热门活动

迄今为止最好用的Flink SQL教程:Flink SQL Cookbook on Zeppelin

Apache Flink

flink

上过云么?一行代码秒上云体验过么?

华为云开发者联盟

华为云 云服务器 devcloud 代码托管

从小厂逆袭快手,我是如何准备面试的

haxianhe

Spring Boot+Maven实现车牌训练、识别系统

不脱发的程序猿

maven Spring Boot 图像处理 28天写作 车牌训练、识别系统

如何使用Excel表格精准分析PT100温度阻值关系?

不脱发的程序猿

28天写作 PT100 温度采集算法 Excel数据分析 传感器采集

LeetCode题解:190. 颠倒二进制位,移动n,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Open-Falcon 中的 LDAP 认证

冯骐

Python 运维 Open-Falcon ldap Go 语言

用 Go 写一个轻量级的 ssh 批量操作工具

冯骐

运维 SSH Go 语言

【经验分享】如何释放企业CMDB价值?——CMDB建设路径浅谈

嘉为蓝鲸

运维自动化 配置中心 CMDB 配置信息 配置管理

简述Electron的发展和应用

anyRTC开发者

WebRTC 跨平台 Electron RTC sdk

Nginx安装后要做的第一件事

运维研习社

nginx WEB安全

交换机配置的自动备份与变更告警

冯骐

Python 运维 网络 备份 multissh

元素XPATH定位点击为什么老失败?

小小娃爱吃甜食

Python 自动化 测试 selenium

Volcano社区正式发布v1.2.0版本

华为云原生团队

人工智能 开源 AI 云原生

failure: repodata/repomd.xml from cloudera-manager: [Errno 256] No more mirrors to try

wjchenge

在主动要求涨工资这事上,不要学我!从第一份工资800开始说起

四猿外

程序员 涨薪 工资 收入 跳槽

Serverless 极致弹性解构在线游戏行业痛点

阿里巴巴云原生

Serverless 微服务 开发者 云原生 消息中间件

智汇华云 | 深入理解Istio中的证书管理

华云数据

《精通比特币》学习笔记(第一章)

棉花糖

区块链 读书笔记

拍乐云加盟UCloud优云精选计划,构建云上的美好互动

拍乐云Pano

ucloud 云服务 RTC 拍乐云 白板

面试官:如何用SpringCloud从零设计一个大型电商平台?

Java架构追梦

Java 架构 面试 微服务 SpringCloud

【LeetCode】俄罗斯套娃信封问题Java题解

Albert

算法 LeetCode 28天写作

思科设备漏洞 CVE-2018-0171 的快速修复

冯骐

Python 运维 安全 网络 交换机

用 Nginx 的 auth_request 模块集成 LDAP 认证

冯骐

Python nginx 运维 ldap 认证

Pgbouncer最佳实践:系列四

PostgreSQLChina

数据库 postgresql 软件 开源社区

量化交易马特机器人(币掌柜/小树/小喜/瓦力)系统开发策略搭建

薇電13242772558

数字货币 量化策略

全链路压测在大搜车的探索与实践_大前端_杨光跃_InfoQ精选文章