13个QA带你了解线上压测的知识点

qa,了解,知识点 · 浏览次数 : 176

小编点评

**13个问题解答:** 1. **为什么要在线上进行压测?** 因为线下测试环境的机器资源有限,无法完全模拟现网。 2. **区别链路压测和接口压测?** 链路压测将相关的链路完整地串联起来同时施压,尽可能模拟出真实的用户行为;接口压测是针对接口的单个请求进行施压。 3. **业务系统如何区分压测流量?** 通过在请求中添加标注参数,例如 `&st=truehearder`。 4. **识别到压测标记后如何保证往下游发请求时,仍然是压测标记的形式?** 可以使用 threadLocal 或阿里的 `TransmittableThreadLocal` 等机制来存储和传递压测标记。 5. **如何在同一个线程中处理和发请求?** 可以使用 `threadLocal` 来存储和传递压测标记。 6. **如果处理请求和发下游请求是在一个线程中完成的,如何保证往下游发请求时,仍然是压测标记的形式?** 使用 threadLocal 来存储和传递压测标记。 7. **如何判断多个请求是否都是压测请求?** 如果请求中包含标注参数 `&st=truehearder`,则视为压测请求。 8. **如何在数据库中处理影响压测的数据?** 为每个生产库生成一个影子库,专门用来存储压测数据,然后进行分库分表的话,可以避免数据库的性能下降。 9. **如何处理数据库连接的影响?** 创建多个影子库,每个库用于存储一个生产库的压测数据。 10. **如何处理中间件对压测的影响?** 使用 MockFilter 等中间件,在请求处理之前对其进行标记。 11. **如何处理第三方服务的接口?** 在链路跟踪系统中创建 MockFilter,并根据标记进行过滤。 12. **如何处理数据库的性能影响?** 使用 Spring 的 AbstactRoutingDataSource 类实现动态数据源,根据压测标记进行切换。 13. **如何完整设计压测系统的架构?** 压测管理服务:提供给压测控制者查看和使用的。 任务服务:用于处理调度指令,执行定时调度等行为。 代理:用于发送压测请求。 MQ:接收代理压测请求的结果,并进行处理。 数据收集:用于将压测结果写入数据库。

正文

摘要:设计一个线上压测系统能让我们学习到多少东西?这13个问题看你能否搞定。

本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13个问题看你能否搞定》,作者:breakDawn。

Q: 为什么需要线上压测?

A:

  1. 需要在某些活动、大促前,评估机器扩容数量,验证系统能否有效支撑流量峰值。
  2. 线下测试环境的机器资源有限, 无法完全模拟现网。 同时很多配置可能配置不相同,如果没对上导致机器数量估计错误,可能引发重大故事。所以必须要在线上做压测。

Q: 全链路压测和接口压测的区别?

A:
在特定的业务场景下,将相关的链路完整地串联起来同时施压,尽可能模拟出真实的用户行为。
接口A做接口压测,可能是1w/s的QPS, 但是A和B同时压测,可能因为数据库连接等共享资源,导致实际QPS下降。

Q: 业务系统如何区分压测流量?即判断哪些是压测的请求,哪些是正常的请求?

A:

  1. url上加上打标参数, 例如 ?st=true
  2. 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:
该问题参考《超大流量分布式系统架构解决方案》一书中给出的方案,也可以有其他方案。

  1. 压测manager服务, 提供给压测控制者查看和使用的。可以读取mysql数据库获取压测结果情况,或者进行调度指令的下发等。
  2. taskService服务,用于处理调度指令,执行定时调度、即时调度等行为。
  3. Agent 压测请求发送客户端。根据taskService的指令进行发送
  4. DataFactoy,给agent提供脱敏、修改后的压测数据。
  5. MQ, 接收agent压测请求的结果,堆积到队列里提供给DataCollect消费。
  6. DataCollect, 压测结果消费者, 将结果写入到数据库MYSQL。
  7. 注册中心,用于管理和注册上面这些服务。
  8. Detecotr, 流量检测和干预器,可以根据情况即时调整agent的发送速率。

Q: 怎么模拟实际用户的请求发送? 因为实际场景应该是多个不同ip的用户访问进来才对。

A:

  • apache HttpComponents的httpclient包
  • Java11的异步httpclient, 支持HTTP/2, 支持用reactive stream。

 

点击关注,第一时间了解华为云新鲜技术~

与13个QA带你了解线上压测的知识点相似的内容:

13个QA带你了解线上压测的知识点

摘要:设计一个线上压测系统能让我们学习到多少东西?这13个问题看你能否搞定。 本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13个问题看你能否搞定》,作者:breakDawn。 Q: 为什么需要线上压测? A: 需要在某些活动、大促前,评估机器扩容数量,验证系统能否有效支撑流量峰

[转帖]13 个 QA 带你了解线上压测的知识点

https://my.oschina.net/u/4526289/blog/5586897 摘要:设计一个线上压测系统能让我们学习到多少东西?这 13 个问题看你能否搞定。 本文分享自华为云社区《设计一个线上压测系统能让我们学习到多少东西?13 个问题看你能否搞定》,作者:breakDawn。 Q:

[转帖]Shell 脚本中经典的13个面试题

经典的Shell十三问 1. 为何叫做shell?2. Shell prompt(PS1)与Carriage Return(CR)的关系?3. 别人echo, 你也echo, 是问echo知多少?4. ""(双引号)与(单引号)有什么区别?5. var=value? export前后差在哪?6. e

Python 潮流周刊#60:Python 的包管理工具真是多啊(摘要)

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 本期周刊分享了 13 篇文章,13 个开源项目,全文 2300 字。 重要提醒:

Python性能测试框架:Locust实战教程

01认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站(或其他系统)进行负载测试,并确定系统可以处理多少个并发用户,Locust 在英文中是 蝗虫 的意思:作者的想法是在测试期间,放一大群 蝗虫 攻击您的网站。当然事先是可以用 Locust 定义每个蝗虫(或测试用

11个开源项目,5位技术大咖…华为云亮相2023开放原子全球开源峰会

摘要:华为云受邀参加了2023开放原子全球开源峰会中开源数据库、开源安全技术与实践等分论坛,并承办了云原生分论坛 2023年6月13日,由2023全球数字经济大会组委会主办,开放原子开源基金会、北京市经济和信息化局、北京经济技术开发区管理委员会承办的2023开放原子全球开源峰会在北京圆满落幕。本次峰

算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 不要轻易使用 For 循环 For 循环,老铁们在编程中经常用到的一个基本结构,特别是在处理列表、字典这类数据结构时。但是,这东西真的是个双刃剑。虽然看起来挺直白,一用就上手,但是,有时

[转帖]工信部电子标准院授予阿里巴巴9个开源项目“优秀”评级

http://blog.itpub.net/31545803/viewspace-2932061/ 1月13日消息,工信部电子标准院近日公布第二批通过开源项目成熟度评估的开源项目名单,阿里巴巴主导的Flink、Dubbo、龙蜥操作系统、Seata、Nacos等多个开源项目获得“优秀”评级。 电子标准

上周热点回顾(5.13-5.19)

热点随笔: · 一个不知名的开源项目可以带来多少收入 (NocoBase)· 博客园商业化之路-众包平台:500位驭码好汉,等你来发单挑战 (博客园团队)· C#应用的欢迎界面窗体方案 - 开源研究系列文章 (lzhdim)· 3 个好玩的前端开源项目「GitHub 热点速览」 (削微寒)· C#的

在.NET 8 RC1 版本中 MAUI、ASP.NET Core 和 EF8 的新特性

从年初2 月份发布第一个预览版,经历7个预览版后,Microsoft 西雅图时间9月13日发布了 .NET 8 RC 1: https://devblogs.microsoft.com/dotnet/announcing-dotnet-8-rc1/[1], 这是该框架在 11 月初正式发布之前的两个