QQ 客户端性能稳定性防劣化系统 Hodor 技术方案
https://cloud.tencent.com/developer/article/2427487 ↗
防劣化机制、向前兼容…今日头条前端架构设计解读
https://cloud.tencent.com/developer/article/1807771 ↗
抖音创作工具防劣化实践
https://www.hellobit.com.cn/doc/2021/8/4/448.html ↗
为什么要构建一个防劣化系统#
- 产品快速迭代,开发时为了”能跑“,不注意引入了性能问题
- 历史问题积攒,架构在演进的时候出现不合理
- 种种原因,引发系统性能下降
手机QQ的方案#
合流门禁+自动化测试+静态检查+动态性能监测
- 建立合流门禁,在合并主分支之前运行一系列测试,观测性能有无下降,如果性能报告发现性能在基准线下拒绝合入主分支
- 全链路自动化+定时测试,能定位性能瓶颈到某一个服务,并生成对应的性能提单
- 对OC符号问题和原生符号进行静态扫描,发现代码不合理所在
- 利用苹果提供的工具进行实时使用时的性能采集,获取对应数据
我们的方案——构建自动化门禁#
数据监测+合流门禁+自动化测试(利用流量重放)
原因#
- 手机qq是客户端,且代码复杂,不易分析,推出静态检查+动态性能监测的方案,我们是web服务,大部分性能问题我们是可以直接通过服务器查找问题,不需要这么复杂的流程
- 腾讯有着强大的测试团队,测试用例+测试流程很成熟,我们没有专门的测试团队,使用实际的流量可以帮助我们在测试较少的情况下进行回归测试+性能测试,能照顾到我们想不到的corner case
使用的组件#
- 流量录制 经过一系列调研:jvm-sandbox-repeater + 自研插件,moonbox,nginx…
最后选择了携程的开源方案:arex
- 支持实时流量录制和回放,进行回归测试
- 全链路追踪,提供trace id
- 支持skywalking的集成,回归测试时可配合进行分析
- 无侵入,利用agent进行数据采集
- 提供webhook,可以构建 gitlab ci/cd流程
- 数据监测:skywalking
- 对于每一个服务都有耗时监测,便于排查
- 机器人实时监控报警
设计#
- 自动化门禁——利用github action,在push到主分支的时候进行相应的检查
- 先调用arex提供的webhook进行回归测试,确认业务逻辑没有错误
- 再通过py脚本获取arex中的测试数据,编写为jmeter模板,进行性能测试(压测),和标准版本比较
- 两个测试都通过才能合并进入主分支
- 日常测试——arex定时任务,定时进行测试
落地遇到的挑战#
- 需要的资源较多,arex单独部署需要4-6个g的内存,和skywalking一起就是6-8个g;测试环境也最好也得单独运行,尽量不在生产环境进行重放或压测
- arex流量回放的回调结果是通过http发送的,不能直接发送给github action,需要一个服务实现提供hook返回测试结果;做性能测试的时候需要能访问arex所在机器的mongobd,做起来是一个偏向微服务的架构
- 没有合适的工具录制websocket流量,基本都是只能录制http或者rpc,聊天接口测试需要单独适配(构建apifox的自动化流程