13个QA带你了解线上压测的知识点
摘要:设计一个线上压测系统能让我们学习到多少东西?这13个问题看你能否搞定。
本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13个问题看你能否搞定》,作者:breakDawn。
Q: 为什么需要线上压测?
A:
- 需要在某些活动、大促前,评估机器扩容数量,验证系统能否有效支撑流量峰值。
- 线下测试环境的机器资源有限, 无法完全模拟现网。 同时很多配置可能配置不相同,如果没对上导致机器数量估计错误,可能引发重大故事。所以必须要在线上做压测。
Q: 全链路压测和接口压测的区别?
A:
在特定的业务场景下,将相关的链路完整地串联起来同时施压,尽可能模拟出真实的用户行为。
接口A做接口压测,可能是1w/s的QPS, 但是A和B同时压测,可能因为数据库连接等共享资源,导致实际QPS下降。
Q: 业务系统如何区分压测流量?即判断哪些是压测的请求,哪些是正常的请求?
A:
- url上加上打标参数, 例如 http://xx?st=true
- hearder中打标
Q: 这个压测打标的改造和适配要中间所有服务参与吗? 改造成本会不会有点大?
A:
不需要全部参与。
如果设计过链路跟踪系统, 则每个服务都有中间件团队提供的拦截器, 因此直接通过公共拦截器来做压测标记的识别。
Q: 识别到压测标记后, 如何保证往下游发请求时,仍然是压测标记的形式?
即发请求的时候已经不是同一段拦截器的代码了。 但是也要保证尽可能不改动原有的业务逻辑代码。
A:
如果处理请求和发下游请求是在一个线程中完成的, 那么可以使用threadLocal。
即拦截到请求时, 将压测标记set进threadLocal中。
发送下游请求的代码中,如果能从threadLocal中拿到压测标记,则改造url,设置进往下发的请求中
Q: 如果我不在同一个线程中处理和发请求, 怎么办?
即我的业务代码中 做了new Thread或者ExectorPool.submit提交异步请求, 这时候业务逻辑里肯定不会涉及到threadLocal的代码, 而此时压测标记就会丢失了。
threadLocal可以用 InheriableThreadLocal, 这样如果在线程中new新的线程,则标记可以被传递下来。
如果是线程池创建异步请求, 可以用阿里的TransmittableThreadLocal。
Q: 如果我的压测链路中 包含了外部服务的接口怎么办? 例如第三方支付、第三方短信等。
A:
链路跟踪系统中发请求的filter中, 新增MockFilter, 如果判断是压测请求, 则直接返回mock逻辑(不建议部署mock服务, 因为部署mock服务的话,服务器成本又得考虑,不如直接封装到mockFilter代码中)
Q: 会对数据库产生影响的压测请求怎么办?
如果直接落库,可能会影响正常用户的请求访问, 也可能污染线上数据。
A:
为每个生产库 生成一个影子库, 专门用来存储压测数据。
然后做过分库分表的话, 肯定有数据库的proxy,在proxy里都往压测库插入和读写。
如果没有,就扩展Spring的AbstactRoutngDataSource类, 实现一个动态的数据源,让里面可以根据压测标记进行切换。
Q: redis、kafka等中间件对压测有什么特殊处理?
A:
除了添加统一特点的压测标记(中间件和业务不是强相关,所以可以进行特定改造)
还要注意缓存的存活时间要设置短一点。
Q: 压测结束时,如何避免对数据库继续产生影响?
A:
注意不要触发 数据源的init-method方法, 当真正执行压测的时候再建议会话连接。
各种超期时间也要注意设置, 尽快接触压测对组件的影响。
Q: 压测数据怎么构造?一个个手动拼数据参数,然后让测试同学发送吗?
A:
不行,如果业务有改动,参数很容易对不上,同时组装过程耗时也会非常久。
建议从线上直接dump最近的请求数据,这样可保证参数没有变化。
同时做一些脱敏和修正处理。
Q: 怎么完整设计这个压测系统的架构?包含哪些角色
A:
该问题参考《超大流量分布式系统架构解决方案》一书中给出的方案,也可以有其他方案。
- 压测manager服务, 提供给压测控制者查看和使用的。可以读取mysql数据库获取压测结果情况,或者进行调度指令的下发等。
- taskService服务,用于处理调度指令,执行定时调度、即时调度等行为。
- Agent 压测请求发送客户端。根据taskService的指令进行发送
- DataFactoy,给agent提供脱敏、修改后的压测数据。
- MQ, 接收agent压测请求的结果,堆积到队列里提供给DataCollect消费。
- DataCollect, 压测结果消费者, 将结果写入到数据库MYSQL。
- 注册中心,用于管理和注册上面这些服务。
- Detecotr, 流量检测和干预器,可以根据情况即时调整agent的发送速率。

Q: 怎么模拟实际用户的请求发送? 因为实际场景应该是多个不同ip的用户访问进来才对。
A:
- apache HttpComponents的httpclient包
- Java11的异步httpclient, 支持HTTP/2, 支持用reactive stream。
13个QA带你了解线上压测的知识点的更多相关文章
- 双11线上压测netty内存泄露
最近线上压测,机器学习模型第一次应用到线上经历双11大促.JSF微服务有报错 LEAK: ByteBuf.release() was not called before it's garbage-co ...
- AE常用代码(标注要素、AE中画带箭头的线、如何获得投影坐标、参考坐标、投影方式、FeatureCount注意事项)
手上的电脑已经用了将近三年了,想入手一台Surface Pro,所以计划着把电脑上的资料整理下,部分资料打算发到博客上来,资料有同事.也有自己的.也有来自网络的,来源途径太多,也没法详细注明,请见谅! ...
- 第13章 GPIO-位带操作—零死角玩转STM32-F429系列
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 关于 Mesos,你知道多少?13 个问题带你深入了解 Mesos
听过不少人在讨论 Mesos,然而并不是很明白 Mesos 到底能够解决什么问题,使用场景是怎样的,周伟涛(国内较早一批接触使用 Docker,Mesos 等技术的开发者)用一句话形容它, Mesos ...
- OpenLayer——绘制带箭头的线
绘制带箭头的线,计算相对复杂,多少是有点影响性能了.更简单的做法:初始.目标点用不同的点进行强调即可. <!DOCTYPE html> <html lang="en&quo ...
- 如何利用百度地图JSAPI画带箭头的线?
百度地图JSAPI提供两种绘制多折线的方式,一种是已知多折线经纬度坐标串通过AddOverlay接口进行添加:另一种是通过在地图上鼠标单击进行绘制(鼠标绘制工具条库).目前这两种方式只能绘制多折线,并 ...
- 13张PPT带你了解主动式消息队列处理集群
前言 偷偷和你们说,我搞了一份内部资料,该内部资料共有13张PPT,据作者透露,该PPT至少花了整整1周时间才编写完成,其内容简洁明了,内容深度足够,易于初学者理解,也给深度开发人员分享了不一样的消息 ...
- C# 13行代码带你模拟登录QQ空间
最近想做一个QQ空间点赞的小工具,于是晚上下班回来就开始分析PC版的QQ空间,打开Chrome,切换到Network,然后输入账号密码,然后点击登录... 然后,我曹....一堆请求就开始了....搞 ...
- 神级程序员通过两句话带你完全掌握Python最难知识点——元类!
千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为 每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生 ...
- 一文带你学会java的jvm精华知识点
前言 本文分为20多个问题,通过问题的方式,来逐渐理解jvm,由浅及深.希望帮助到大家. 1. Java类实例化时,JVM执行顺序? 正确的顺序如下: 1父类静态代码块 2父类静态变量 3子类静态代码 ...
随机推荐
- C、C++函数和类库详解(GCC版)(2014-4-23更新)
C.C++函数和类库详解(GCC版)(未完成) 整理者:高压锅 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认 ...
- Python:基础&爬虫
Python:基础&爬虫 Python爬虫学习(网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另 ...
- 关于虚拟机的IP地址经常改变问题的解法
主要解法就是配置静态IP地址 首先了解一下IP和子网掩码,网关的含义:IP 是标识计算机特定地址的二进制数,子网掩码用于和IP组合划分子网;网关是将信息传送到网关进行收发 开始配置:首先打开Linux ...
- 数据结构-线性表-单循环链表(使用尾指针)(c++)
目录 单循环链表 说明 注意 (一)无参构造函数 (二)有参构造函数 (三)析构函数 (四)获取长度 (五)打印数组 (六)获取第i个元素的地址 (七)插入 (八)删除 (九)获取值为x的元素的位置 ...
- 优雅设计之美:实现Vue应用程序的时尚布局
前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式.如果使用的是Nuxt,则可以提供开箱即用的优雅解决方案.然而,令人遗憾的是,在Vue中,这些问题并未得到官方文档的解决. 经 ...
- python 执行脚本,并将输出打印到文件
转载请注明出处: 在使用 python 直接执行脚本时,执行的相关输出会打印到当前的控制台,如果想输出到指定的文件,可以采用以下几种方式: 1.在启动时,使用 > 操作符,该操作符会将输出写入到 ...
- Element类型&Text类型&Comment类型
Element节点类型 nodetype=1 nodename=大写元素标签名 父节点可以说document 或element 其子节点可以是Element .Text .comment 访问元素 ...
- 微服务系列-使用WebFlux的WebClient进行Spring Boot 微服务通信示例
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 概述 在之前的教程中,我们看到了使用 RestTemplate 的 Spring Boot 微服务通信示例. 从 5.0 ...
- .NET8:快速集成Rapid.NET三维控件
.NET8正式版本发布了,AnyCAD Rapid.NET针对.NET8进行了升级和优化.本文以WPF项目为例介绍在.NET8中使用AnyCAD Rapid.NET三维控件. 1 从.NET6升级 若 ...
- 【源码系列#02】Vue3响应式原理(Effect)
专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核推荐 欢迎各位ITer关注点赞收藏 Vue3中响应数据核心是 reactive , reactive 的实 ...