一种压测方法、装置、电子设备及存储介质
文献发布时间:2023-06-19 09:30:39
技术领域
本申请涉及压测技术领域,具体而言,涉及一种压测方法、装置、电子设备及存储介质。
背景技术
现代企业应用服务为了应对大规模流量访问,需经常性进行压力测试,以评估应用服务的流量承载能力,在对应用服务进行压力测试时,一般通过脚本构造压测数据,再通过压测引擎实施压测。
现有的压测方法,在压测过程中,不仅产生大量的脏数据,而且压测结束后需要手动将生产表中压测产生的脏数据清除掉,为压测人员增加了大量的工作量。
发明内容
本申请实施例的目的在于提供一种压测方法、装置、电子设备及存储介质,通过染色标记区分染色数据和生产数据,并隔离存储,解决了现有方法需要手动将生产表中压测产生的脏数据清除掉,为压测人员增加了大量的工作量的问题。
本申请实施例提供了一种压测方法,所述方法包括:
接收客户端发送的请求消息;
通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息;
在将所述请求消息在跨线程和/或跨进程执行并生成压测流量过程中,将所述染色标记进行相应传递;
将所述请求消息所产生的压测流量保存至影子表中。
在上述实现过程中,通过在压测流量中添加染色标记,并将染色标记进行跨线程和跨线程传递,从而实现全链路透传,并将染色数据和生产数据的隔离(染色数据动态存入影子表,生产数据存入生产表),避免了压测人员在每次压测完成后,清除生产表中的脏数据的操作,节约了工作时间,提高了效率,解决了现有方法需要手动将生产表中压测产生的脏数据清除掉,为压测人员增加了大量的工作量的问题;并且通过染色标记实现了生产数据和染色数据的动态隔离,染色数据不影响生产数据,因此压测可以随时在线上集群环境进行,而不影响实际业务的正常运行。
进一步地,所述通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息,包括:
在线程池获取线程执行异步调用的方法之前,通过预先设置的拦截位点进行拦截,以将当前线程的染色标记传递给子线程;
在所述子线程执行之前,将所述染色标记添加至所述子线程的线程上下文中。
在上述实现过程中,将当前线程的染色标记传递给子线程,并将染色标记添加至所述子线程中,实现染色标记的跨线程传递。
进一步地,所述通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息,包括:
在当前服务发送http跨进程请求之前,通过预先设置的拦截位点进行拦截,以获取请求对象;
将当前服务中的当前线程的染色标记添加至所述请求对象的请求头中,以将所述染色标记传递至下游服务中;
在所述下游服务接收到所述请求后,通过所述下游服务中预先设置的拦截位点获取所述请求头中的染色标记;
将所述染色标记添加至所述下游服务的线程上下文中。
在上述实现过程中,服务之间通过http跨进程调用时,通过拦截位点实现染色标记从当前服务跨进程传递给下游服务,实现了染色标记的http跨进程传递。
进一步地,所述通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息,包括:
在当前服务发送rpc跨进程请求之前,通过预先设置的拦截位点进行拦截,以获取rpc请求;
将当前服务中的当前线程的染色标记添加至rpc请求的attachments中,以将所述染色标记传递至下游服务中;
在所述下游服务接收所述rpc请求后,通过所述下游服务中预先设置的拦截位点获取所述attachments中的染色标记;
将所述染色标记添加至所述下游服务的线程上下文中。
在上述实现过程中,服务之间在进行rpc跨进程调用时,通过预先设置的拦截位点实现染色标记从当前服务跨进程传递给下游服务,实现了染色标记的rpc跨进程传递。
进一步地,所述通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息,包括:
在异步消息发送之前,通过预先设置的拦截位点获取所述消息;
将当前服务的当前线程的染色标记添加至所述消息的header中;
在所述下游服务接收所述消息后,通过所述下游服务中预先设置的拦截位点从所述消息的header中获取所述染色标记;
将所述染色标记添加至所述下游服务的线程上下文中。
在上述实现过程中,在异步消息发送之前通过拦截位点获取消息,并将当前线程的染色标记保存至消息的header中,以便下游服务获取该消息后同时得到染色标记,实现了染色标记的消息中间跨进程传递。
进一步地,所述将所述请求消息所产生的压测流量保存至影子表中,包括:
在将所述压测流量对应的染色数据进行保存之前,将sql执行语句的表名修改为影子表名,以将所述染色数据保存至影子表中。
在上述实现过程中,染色数据在保存之前,将会动态的将sql执行语句的表名修改为影子表名,染色数据将会自动存入影子表中,从而与生产数据隔离,实现了生产数据和染色数据的动态隔离。
进一步地,调用缓存数据时,判断当前线程对应的数据是否含有染色标记;
若有,则在key值参数上添加设定字符串,以区分染色数据和生产数据。
在上述实现过程中,通过染色标记区分染色数据和生产数据,并修改染色数据对应的执行参数,在key值参数上添加设定字符串与生产数据进行区分。
本申请实施例还提供一种压测装置,该装置包括:
消息接收模块,用于接收客户端发送的请求消息;
标记获取模块,用于通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息;
染色标记传递模块,用于在将所述请求消息在跨线程和/或跨进程执行并生成压测流量过程中,将所述染色标记进行相应传递;
存储模块,用于将所述请求消息所产生的压测流量保存至影子表中。
在上述过程中,通过染色标记对压测流量进行标记,并实现跨进程和跨线程的全链路透传,染色数据和生产数据的隔离(染色数据存入影子表,生产数据存入生产表),避免了压测人员在每次压测完成后,清除生产表中的脏数据的操作,节约了工作时间,提高了效率,解决了现有方法需要手动将生产表中压测产生的脏数据清除掉,为压测人员增加了大量的工作量的问题。
本申请实施例还提供一种电子设备,所述电子设备包括存储器以及处理器,所述存储器用于存储计算机程序,所述处理器运行所述计算机程序以使计算机设备执行上述中任一项所述的压测方法。
本申请实施例还提供一种可读存储介质,所述可读存储介质中存储有计算机程序指令,所述计算机程序指令被一处理器读取并运行时,执行上述中任一项所述的压测方法。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对本申请实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的一种压测方法的流程图;
图2为本申请实施例提供的压测方法的实现框图;
图3为本申请实施例提供的跨线程传递的流程图;
图4为本申请实施例提供的http跨进程的染色标记传递流程图;
图5为本申请实施例提供的rpc跨进程的染色标记传递流程图;
图6为本申请实施例提供的消息中间跨进程的染色标记传递的流程图;
图7为本申请实施例提供的染色数据的存储过程流程图;
图8为本申请实施例提供的压测装置的结构框图;
图9为本申请实施例提供的压测装置的具体结构框图。
图标:
100-消息接收模块;200-标记获取模块;300-染色标记传递模块;310-跨线程传递模块;311-子线程标记模块;320-请求对象获取模块;321-第一标记添加模块;322-第一标记获取模块;323-第二标记添加模块;330-rpc请求获取模块;331-第三标记添加模块;332-第二标记获取模块;333-第四标记添加模块;340-消息获取模块;341-第五标记添加模块;342-第三标记获取模块;343-第六标记添加模块;400-存储模块;401-判断模块;402-染色数据保存模块。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
实施例1
请参看图1,图1为本申请实施例提供的一种压测方法的流程图。该方法用于对应用服务进行压力测试,应用于服务器,示例地,作为其中一种实施方式,本方法可以是一种将请求中的染色标记在全链路进行传递从而用于压测的插件,采用插件的好处是对应用服务进行压测的同时不会对应用服务本身的功能造成改变和影响,提高其使用的便利性,如图2所示,为本申请实施例的压测方法的实现框图,该方法具体可以包括以下步骤:
步骤S100:接收客户端发送的请求消息;
示例地,在通过客户端向发送请求消息之前,需要对该请求消息进行预处理,使其具有压测标记;通常压测请求是基于http请求的,通过在http请求中添加压测标记(染色标记)键值对(baggage-flow=ptest)来标记该请求消息为压测流量,具体地,通常在在http请求的请求头里面加入染色标记(通常是键值对)等标识信息;因此,在压测时,接收到的客户端发送的请求消息为具有染色标记的请求消息。
步骤S200:通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息;
步骤S300:在将所述请求消息在跨线程和/或跨进程执行并生成压测流量过程中,将所述染色标记进行相应传递;
拦截位点是负责获取请求消息中是否有染色标记的,如果有染色标记就将其放到线程上下文中,在下次跨进程或跨线程时,从线程上下文中获取,并交给跨进程请求或子线程,以实现染色标记的继续传递,最终达到染色标记的全链路传递的目的。
拦截位点是预定义的通用点,例如可以把http请求或某个名称作为拦截位点,在具体应用过程中,遇到预定义的通用点即开始拦截,并且拦截位点的选择,是线程池开启子线程执行必然调用的方法之一,因此不需要为每个服务单独设置拦截位点,具有通用性。
在将请求消息在跨线程和/或跨进程执行过程中,通过拦截位点获得请求消息中的染色标记,将染色标记进行相应的跨线程和/或跨进程传递,该过程并不影响请求消息的执行,因此,并不影响生产数据的正常运行。
本申请是基于java_agent技术,通过在应用服务启动之时挂载软件包(agent插件包),实现无侵入式地增强应用服务,应用服务是无感知的,当流量请求到达服务处理之时,通过方法级别的拦截服务容器对应的处理方法进行拦截,具体拦截的是tomcat(Java Web服务器)接收处理请求的方法,在方法执行之前将染色标记放入处理线程的上下文中,实现对当前线程的标记;添加染色标记后的请求消息在处理过程中,可能会存在同服务内跨线程的处理流程,也可能发生跨服务进程的处理流程,或者两者皆有,其中,如图3所示,为跨线程传递的流程图,跨线程传递具体可以包括:
步骤S310:在线程池获取线程执行异步调用的方法之前,通过预先设置的拦截位点进行拦截,以将当前线程的染色标记传递给子线程;
步骤S311:在子线程执行之前,将染色标记添加至子线程的线程上下文中。
将染色标记添加至子线程的线程上下文中,确保染色标记的跨线程传递。
示例地,基于java常用的两种线程池:jdk(Java Development Kit)自带的线程池和Spring框架封装的线程池,在获取线程执行异步调用的方法之前,实现拦截,将当前线程的线程上下文中的染色标记传递给子线程,在子线程执行之前,将染色标记保存到子线程的线程上下文中,实现染色标记的跨线程传递。
对于跨进程传递的实现,示例地,应用服务跨进程调用主要包括http(HyperTextTransfer Protocol,超文本传输协议)跨进程、rpc(Remote Procedure Call Protocol,远程过程调用协议)跨进程和消息中间跨进程等方式,其中,如图4所示,为http跨进程的染色标记传递流程图,服务之间的http跨进程调用主要包括以下步骤:
步骤S320:在当前服务发送http跨进程请求之前,通过预先设置的拦截位点进行拦截,以获取请求对象;
步骤S321:将当前服务中的当前线程的染色标记添加至请求对象的请求头中,以将染色标记传递至下游服务中;
步骤S322:在下游服务接收到请求后,通过下游服务中预先设置的拦截位点获取请求头中的染色标记;
步骤S323:将染色标记添加至下游服务的线程上下文中。
服务之间在进行http跨进程调用时,示例地,通过HttpClient技术发送请求时,通过设置拦截位点,在当前服务发送跨进程请求之前,获取到request请求对象,将当前线程上下文中的染色标记设置到请求对象的请求头中,传递给下游服务;下游服务在处理请求之前,经过拦截位点从请求头中获取染色标记,放入下游服务的当前线程的上下文中,这样就实现了染色标记从上游服务跨进程地传递给了下游服务。
如图5所示,rpc跨进程的染色标记传递流程图,服务之间的rpc跨进程调用主要包括以下步骤:
步骤S330:在当前服务发送rpc跨进程请求之前,通过预先设置的拦截位点进行拦截,以获取rpc请求;
步骤S331:将当前服务中的当前线程的染色标记添加至rpc请求的attachments中,以将染色标记传递至下游服务中;
步骤S232:在下游服务接收rpc请求后,通过下游服务中预先设置的拦截位点获取attachments中的染色标记;
步骤S333:将染色标记添加至下游服务的线程上下文中。
服务之间在进行rpc跨进程调用时,示例地,通过grpc和dubbo等技术实现rpc调用,通过设置拦截位点,在当前服务发送跨进程请求之前,将当前线程上下文中的染色标记放入到rpc请求的attachments(附件)中;下游服务在对接收到的rpc请求进行处理之前,通过拦截位点时,将attachments中的染色标记放入下游服务的处理请求线程的上下文中,这样就实现了染色标记从上游服务跨进程地传递给了下游服务。
如图6所示,为消息中间跨进程的染色标记传递的流程图,服务之间的消息中间跨进程调用主要包括以下步骤:
步骤S340:在异步消息发送之前,通过预先设置的拦截位点获取消息;
步骤S341:将当前服务的当前线程的染色标记添加至消息的header中;
步骤S342:在下游服务接收消息后,通过下游服务中预先设置的拦截位点从所述消息的header中获取所述染色标记;
步骤S343:将染色标记添加至下游服务的线程上下文中。
服务在进行异步消息发送的过程中,常用消息中间件有kafka、rocketMQ和activeMQ等,消息中间件是实现异步跨进程消息传递的一种中间件技术。在消息发送之前,通过拦截位点获取消息,并将当前线程的上下文中的染色标记保存到消息的header中,下游服务在接收消息前,经过插件的拦截位点,从消息的header中获取染色标记放入下游处理线程的上下文中,这样就实现了染色标记从上游服务跨进程地传递给了下游服务。
通过跨线程和跨进程的染色标记的传递,使整个服务集群都能将压测标记传递下去,也就实现了全链路对压测流量的染色;通过在请求头中添加压测标记,无侵入式地实现压测标记在服务集群全链路的透传。
对于压测流量在存储层的处理,存储层包括redis缓存和持久化数据库MySQL的存储,对于数据库MySQL的存储,如图7所示,为染色数据的存储过程流程图,具体包括如下步骤:
步骤S400:将所述请求消息所产生的压测流量保存至影子表中。
在存储时,判断当前流量是否具有染色标记,若有,则保存至影子表中,若无,则保存至生产表中,具体包括以下步骤:
步骤S401:判断当前流量是否具有染色标记;
步骤S402:若有,则当前流量为压测流量,在将压测流量对应的染色数据进行保存之前,将sql执行语句的表名修改为影子表名,以将染色数据保存至影子表中。
对于数据库MySQL的存储,如果是染色数据,则插件会动态地将sql执行语句的表名(table)修改为影子表名(table_ptest),染色数据就会自动保存到影子表中,与生产数据隔离;动态识别压测流量,将染色数据保存到数据库的影子表中,避免了脏数据在生产表中的产生,减少了压测人员的工作量。
对于redis缓存,当前线程在调用redis方法之前,插入数据时,该插件会判断当前线程中是否含有染色标记,以判断是否是染色流量的链路,如果没有染色标记,说明是生产流量,不做处理;如果是染色流量,插件将修改方法执行的参数,在key值参数上拼接设定字符串,以生产数据做区分;获取数据时,同样根据染色标记区分,是否在key值参数上添加设定字符串,来获取染色数据。
本申请所提供的压测方法通过在测试流量中添加染色标记,实现全链路透传,可以实现染色数据和生产数据的隔离(染色数据进入影子表,生产数据进入生产表),避免了压测人员在每次压测完,清除生产表中脏数据的操作,节约了工作时间,提高了效率。
此外,不仅实现了生产数据和染色数据的动态隔离,而且染色数据不影响生产数据,因此压测随时在线上集群环境进行,而不影响实际业务的正常运行。
本方法是在skywalking的插件基础上改造完成,skywalking插件通过javaagent和bytebuddy实现方法级拦截位点对应用服务的字节码增强,因此可以通过其他字节码增强技术实现拦截,在此不作限定。
实施例2
本申请实施例提供一种压测装置,该装置应用于实施例1中的服务器,如图8所示,为压测装置的结构框图,该装置具体包括:
消息接收模块100,用于接收客户端发送的请求消息;
标记获取模块200,用于通过预先设置的拦截位点进行拦截所述请求消息并从所述请求消息中获取带有染色标记的至少一条请求消息;
染色标记传递模块300,用于在将所述请求消息在跨线程和/或跨进程执行并生成压测流量过程中,将所述染色标记进行相应传递;
存储模块400,用于将所述请求消息所产生的压测流量保存至影子表中。
如图9所示,为压测装置的具体结构框图,其中,染色标记传递模块300具体包括:
跨线程传递模块310,用于在线程池获取线程执行异步调用的方法之前,通过预先设置的拦截位点进行拦截,以将当前线程的染色标记传递给子线程;
子线程标记模块311,用于在子线程执行之前,将染色标记添加至所述子线程中。
http跨进程传递具体可以包括:
请求对象获取模块320,用于在当前服务发送http跨进程请求之前,通过预先设置的拦截位点进行拦截,以获取请求对象;
第一标记添加模块321,用于将当前服务中的当前线程的染色标记添加至请求对象的请求头中,以将染色标记传递至下游服务中;
第一标记获取模块322,用于在下游服务接收到所述请求后,通过所述下游服务中预先设置的拦截位点获取所述请求头中的染色标记;
第二标记添加模块323,用于将染色标记添加至所述下游服务的当前线程中。
rpc跨进程传递具体可以包括:
rpc请求获取模块330,用于在当前服务发送rpc跨进程请求之前,通过预先设置的拦截位点进行拦截,以获取rpc请求;
第三标记添加模块331,用于将当前服务中的当前线程的染色标记添加至rpc请求的attachments中,以将染色标记传递至下游服务中;
第二标记获取模块332,用于在下游服务接收所述rpc请求后,通过所述下游服务中预先设置的拦截位点获取attachments中的染色标记;
第四标记添加模块333,将染色标记添加至下游服务的当前线程中。
消息中间跨进程传递具体可以包括:
消息获取模块340,用于在异步消息发送之前,通过预先设置的拦截位点获取消息;
第五标记添加模块341,用于将当前服务的当前线程的染色标记添加至消息的header中;
第三标记获取模块342,用于在下游服务接收消息后,通过所述下游服务中预先设置的拦截位点从所述消息的header中获取染色标记;
第六标记添加模块343,用于将染色标记添加至下游服务的当前线程中。
示例地,存储模块400包括:
判断模块401,判断当前流量是否具有染色标记;
染色数据保存模块402,用于若当前流量具有染色标记,则当前流量为压测流量,在将所述压测流量对应的染色数据进行保存之前,将sql执行语句的表名修改为影子表名,以将染色数据保存至影子表中。
通过将压测流量添加染色标记,通过设置拦截位点,实现染色标记的全链路透传,并通过染色标记区分染色数据和生产数据,实现生产数据和染色数据的动态隔离,避免了压测人员在每次压测完,清除生产表中脏数据的操作,节约了工作时间,提高了效率。
本申请实施例还提供一种电子设备,所述电子设备包括存储器以及处理器,所述存储器用于存储计算机程序,所述处理器运行所述计算机程序以使计算机设备执行是实施例1中任一项所述的压测方法。
本申请实施例还提供一种可读存储介质,所述可读存储介质中存储有计算机程序指令,所述计算机程序指令被一处理器读取并运行时,执行实施例1中任一项所述的压测方法。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
- 压测方法、压测平台、电子设备及可读存储介质
- 一种压测方法、装置、电子设备和可读存储介质