流量录制系统的设计与实现

无论在全链路压测还是在系统功能测试方面,流量录制回放功能是系统必备功能,也是业界各大公司持续建设的研发效能系统。

接下来以sandbox-repeater提供的简易流量录制回放系统为例,介绍一个录制回放系统具备的基本功能,依葫芦画瓢,在真实应用中可以结合具体的系统架构、业务场景、质量保证方案需要做改进。

sandbox-repeater提供了standalone模式及远程模式,standalone模式针对单机,把录制的流量存储在本地文件中;将配置文件中的repeat.standalone.mode置为false即可开启远程模式,远程模式及接近真实应用场景的模式,实现对远程服务节点的流量录制回放功能。

对于一个待实现录制回放功能的服务,需要经过服务注册、录制回放配置管理、录制回放代理模块安装、录制回放流量管理功能、回访结果的diff功能(分析功能)


服务注册

管理待附加流量录制回放功能的服务节点,核心信息包括服务的地址信息(如ip端口,如果是集中管理的微服务,可以有服务id标识等)、服务名称、产品线、所属环境等信息。

节点上报的方式可以有主动上报或被动注册两种。

主动上报,就是服务定期会有心跳检测机制实时上报到服务注册接口地址。如果是rpc服务,可以在根据微服务发现管理机制基础上进行服务的服务的统一维护即可。

被动注册,就是通过手动的方式或其它间接方式来进行注册,通常是一次性注册,不具有活检功能。

repeater提供了内部心跳上报机制,上报sandbox-module模块的加载情况。

代理管理

此处的代理指sandbox及基于sandbox-module实现的repeater模块,录制回放的功能借助sandbox-repeater完成。关于sandbox-repeater的实现介绍参照上篇文章。

sandbox启动方式分为两种,一种是静态agent方式,即在服务启动时指定agent,另一种是动态agent方式,将sandbox attach到已经在运行中的java进程中。二者实现的效果是一样的。

对于一个高度灵活的管理模块,希望采用第二种方式,首先将部署脚本预先安装到宿主机或者动态拷贝到宿主机相应目录,执行脚本从cdn或其它存储资源上下载安装包,将代理代码安装到宿主系统所在机器,然后启动代理,可以通过sandbox提供的api实现对sandbox-module的动态控制,比如启动、卸载、重新加载,其它功能可以进行二次编码实现。

配置管理

需要对那些接口、组件、方法进行录制和回放,sandbox-repeater通过配置管理控制,并且有相应的配置规则,可以参照sandbox-repeater使用文档。

完成配置编写之后,需要将配置绑定并推送到响应节点,这样才能在录制回放中读取内存中最新的配置运行。

流量管理

     流量录制,目前一些资料实现的都是入口方法的请求|响应的录制回放,对过程中方法的录制回放功能没有过多的应用或相关分享。随着我们对质量的追求日益精进,越发希望提供方法粒度的录制回放功能。

流量录制

      sandbox-repeater可以提供全链路方法级的流量录制功能,在录制过程中,会将需要录制的方法结果存储一个map对象中,key为traceId,当投递结果时,从map中获取该traceId的所有过程数据,装配成record推送到queue队列中,由一个异步线程进行消费发送给record api后存入数据库。

流量mock

      sandbox-repeater中提到的流量回放应该准确来说是流量mock,通常说的流量回放指将请求流量通过直接或间接的方法打到指定服务的方式。 

    通过调用sandbox机制实现的回放接口发送回放请求,将回放请求记录事件总线,回放触发器(发器订阅了总线事件)获取回放事件信息,通过回放事件入口函数的类型(只对入口函数事件进行回放,此处采用桥接模式,函数类型为回放器定义的类型)获取回放器(比如http、redis、java、dubbo等),执行回放动作。比如http回放,解析请求的uri、参数,装配好请求参数后,发送一个本地http请求。

录制回放系统两个关键问题是:录制的流量去哪了?回放时的流量从哪获取的?

sandbox-repeater配置中指定了流量上报和获取的接口,可以实现流量的存储。目前这种设计对于高并发流量的录制功能是存在明显瓶颈的,所以不能直接用在高并发系统的录制功能中,需要对repeater进行进一步改造,比如将流量打入kafka,在进一步处理。

流量diff功能,这个是目前微服务系统质量保证的重要手段,设计的核心问题有:

对结果进行哪些维度的diff,如果完全匹配diff往往diff结果非常多;

针对回放过程中的依赖结果不同,如果进行diff。


未完待续.....

难点:

高并发下的性能瓶颈:高并发下的录制回放问题,尤其支持方法粒度的mock能力;

多任务并发管理:多任务并非回放能力;

特殊场景录制策略:统一trace内对方法、参数均相同的多次请求如何录制、回放;

你可能感兴趣的:(流量录制系统的设计与实现)