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

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

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

A:

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

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

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

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

A:

  1. url上加上打标参数, 例如 http://xx?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带你了解线上压测的知识点相关推荐

  1. 记一次线上压测Dubbo线程池队列满的问题

    本文记录一次线上全链路压测出现的Dubbo线程池队列满的问题. 1 问题描述 线上做全链路压测,其中涉及三个系统,调用关系A->B->C,均是dubbo调用.压测的时候C出现CPU满导致服 ...

  2. Echart 制作柏拉图——带二八法则线

    一.使用场景 制作柏拉图,带二八法则线,柱状图显示不同的颜色,折点显示占比,在接近80%的折点的右方显示虚线到坐标轴位置, 要求图片 二.使用echarts制图,脚本如下: app.title = ' ...

  3. 前端HTML渲染带箭头的线

    前端渲染带箭头的线 1. 效果图 2. 实现方法 参考 1. 效果图 mapbox-gl渲染效果图如下: minedatamap 效果图如下: 2. 实现方法 mapbox-gl minedatama ...

  4. python爬虫教程-Python教父|廖雪峰老师官方爬虫教程,13个案例带你全面入门!

    原标题:Python教父|廖雪峰老师官方爬虫教程,13个案例带你全面入门! Python简直就是万能的,你用Python都做过哪些事? 用网页看各大网站的VIP视频,用python下载? 用Pytho ...

  5. Origin技巧,带误差棒点线图的绘制

    Origin技巧,带误差棒点线图的绘制 https://www.51xxziyuan.com/89/4217.html 通常情况下,我们根据一组x和一组y值并可以绘制出一条在xy平面的曲线.但在科研中 ...

  6. Echarts绘制带箭头的线

    Echarts绘制带箭头的线 这个图主要参考echarts官网的关系图绘制的,难点在于去掉其余导向图的箭头,只保留最后一个节点的箭头,以及处理值为null时箭头的指向问题,代码如下: <temp ...

  7. (149)System Verilog接口(interface)连线待测模块

    (149)System Verilog接口(interface)连线待测模块 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog接口(in ...

  8. 在线多线网络测速工具

    http://www.webkaka.com/Ping.aspx#a6 在线多线网络测速工具

  9. 第13期微生物组-宏基因组分析(线上/线下同时开课,2021.11)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程和转录组的线上直播课.报名参加线上直播课的老师可在1年内选择参加同课程的一次线下课 ...

最新文章

  1. maven初学者常见错误汇总(三)
  2. linux脚本case语句,shell中的case语句,数组及函数
  3. 移动平台自动化测试:appium(二)
  4. php汉字的截取,php汉字截取
  5. rust(69)-闭包
  6. Cocos2d-x学习笔记(19)(TestCpp源代码分析-3)
  7. 从0开始的Python学习009参数
  8. Android Studio开发基础之自定义View组件
  9. 牛客题霸 [跳台阶] C++题解/答案
  10. oracle线程阻塞_Oracle Service Bus –线程阻塞案例研究
  11. POJ 2777 线段树
  12. Microsoft Jet 数据库引擎打不开文件,它已经被别的用户以独占方式打开,或没有查看数据的权限。...
  13. 任正非:鸿蒙不用于手机;IBM 340 亿美元红帽收购案完成;Firefox 68.0 发布 | 极客头条...
  14. [PHP]json_encode增加options参数后支持中文
  15. postgres触发器使用
  16. python 判断数字连续_零基础如何自学python? 这些知识点是你进阶的必经之路
  17. HTML基础编程——简介及第一行代码
  18. 全国软考——软件评测师有感
  19. App上架时,华为应用市场提示:在测试环境:Wi-Fi联网、EMUI11.0 ( P40),软件存在闪退。如何模拟EMUI11.0 ( P40)
  20. strchr()函数与strrchr()函数的实现

热门文章

  1. jQuery动态生成的元素如何绑定事件
  2. Elasticsearch 聚合
  3. es5和es6的区别、以及es6的新特性
  4. 木乃伊迷宫app_木乃伊...我的互联网在哪里?
  5. Windows中使用reg命令编辑注册表
  6. vue返回上一页并刷新上一页数据
  7. PSpice仿真报错ERROR(ORPSIM-15141): Less than 2 connections at node
  8. cocos 合图使用
  9. 番外篇:研究生心得:研二篇(三)
  10. 生活中总结出来的各种定律