如果把双11定义为电商公司一年一度的大考,那么全链路压测就是大考之前的一次次模拟考试,帮助要上战场的系统查缺补漏以及进行容量验证和规划。
微服务拆分的背景下,一个简单地请求可能涉及到十几个下游服务,从CDN到接入层、前端应用、后端服务、缓存、存储、中间件,哪怕一个环节出现一点误差,误差在上下游经过几层累积后会造成什么影响谁都无法确定,也许是调用延迟,也许是请求失败,用户的体验自然就无法保证。
所以我们需要建立起一套验证机制,来验证我们各个环节的都是符合我们预期的。验证的最佳方法就是让事件提前发生,如果我们的系统能够提前经历几次“双11”,容量的不确定性问题也就解决了。全链路压测的诞生解决了容量的确定性问题!
如下图所示,全链路压测分为基础设施和管理端两大部分。
基础设施采用了Java动态字节码技术,运行在jvm层,已经覆盖了公司90%以上的应用。
TraceAgent负责记录链路调用,打印日志到磁盘上。每台机器上都部署了我们的链路日志收集程序,然后把它们存储到ES等后端存储中。 全链路压测的数据就是通过这些日志转换而成,同时,基于日志的聚合分析,也形成了我们的监控大盘。
PTS-Agent主要负责影子库,mock等逻辑实现。所有的压测流量都打上了压测标识,而且通过trace传递,即使跨系统调用压测标识也不会丢失。PTS-Agent在发现是压测流量,并且配置了影子库,就会动态修改数据库连接,把它们路由到影子库,而正常流量不会受到任何影响,真正实现了业务无感知。mock等功能也是判断是否是压测流量,是否配置了mock,执行流程如下图:
压测执行流程主要分为三步: 准备压测数据 ===> 配置压测计划 ===> 执行压测任务
管理端模块也是按照上面三个步骤划分的
接口mock配置:我们基于链路数据,把需要压测的所有接口的下游调用链路都分析出来,用户可以根据我们的链路图,对任何下游接口实现mock。
影子库、mq配置:
数据转换功能:如果采集到的谁要做进一步的处理才能使用,则使用数据转换功能,支持js语法;
3.1 任务的启动与停止,线程数配置
3.2 执行过程的监控,包括QPS、响应时间、相应状态码、cpu和内存资源情况,
压测只是手段,我们的目的还是希望发现系统中的瓶颈点。为此,我们也提供了 应用拓扑、链路追踪协助大家排查问题,同时也推荐开源工具async-profiler分析方法耗时情况。
该系统可以展示当前系统所有的下游系统,在哪个节点耗时最长一目了然
未来,我们会朝着高可用平台发展,不仅会满足大家压测种种需求,同时也将为 故障模拟,故障演练等场景赋能,帮助大家提供故障应对能力,敬请期待。
领取专属 10元无门槛券
私享最新 技术干货