保证异步程序健壮性的方法及设备与流程

文档序号:11620490阅读:239来源:国知局
保证异步程序健壮性的方法及设备与流程

本申请涉及信息技术领域,尤其涉及一种保证异步程序健壮性的方案。



背景技术:

在iaas(infrastructureasaservice,基础设施即服务)系统中,以创建虚拟机的操作为例,管理节点发出一个信息:我要创建10台虚拟机,。每台虚拟机的创建,需要查找可用的cpu,内存,网络等多种资源。对于管理节点来说,它发出请求后,可以继续进行查找数据库、克隆、创建存储、连接网络等多种操作。假设管理节点发送一个请求到计算节点(物理机)上需要1s,物理机创建虚拟机需要100s,创建成功返回管理节点消息需要1s。那么创建100台虚拟机,对管理节点来说,若采用同步的构架,就需要102×100s。若采用异步的构架,由于物理机创建这些虚拟机的过程相对独立,这个过程虽然并不会降低物理机创建所有虚拟机的资源消耗和时间开销,但是对于整个系统来说耗时将远小于同步的方式。

异步的架构往往使用异步方法来执行任务,但是异步方法中的异常处理一直是一个难题。由于在理论上,对每个可能出现异常的代码块,都需要加上能够处理异常的代码,从而保证异步程度的健壮性,否则当代码块出现异常时,将导致程序崩溃。由于对异常处理的代码,其本身行数较多,可能大于可能出现异常的代码块本身,并且同一个项目中技术人员的水平、执行情况的差异,整个过程工作量巨大,且在很难保证对每个可能出现异常的代码块都加上能够处理异常的代码。

申请内容

本申请的一个目的是提供一种保证异步程序健壮性的方法及设备。

为实现上述目的,本申请提供了一种保证异步程序健壮性的方法,该方法包括:

在编译过程中,检测异步程序中异步方法所对应的代码块;

在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序。

进一步地,在编译过程中,检测异步程序中异步方法所对应的代码块,包括:

在编译过程中,查询所述异步程序中预先定义的数据结构;

在查询到所述数据结构后,根据所述数据结构在所述异步程序中确定所述异步方法所对应的代码块。

进一步地,在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序,包括:

根据预设的注入规则,在所述异步方法对应的代码块中确定注入异常处理代码的注入位置;

在所述注入位置注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序。

进一步地,在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序,包括:

在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时,对所述异常进行处理,并继续执行所述异步程序。

进一步地,所述异常处理代码为trycatch语句。

基于本申请的另一方面,还提供了一种保证异步程序健壮性的设备,其中,该设备包括:

识别装置,用于在编译过程中,检测异步程序中异步方法所对应的代码块;

注入装置,用于在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序。

进一步地,所述识别装置,用于在编译过程中,查询所述异步程序中预先定义的数据结构;以及在查询到所述数据结构后,根据所述数据结构在所述异步程序中确定所述异步方法所对应的代码块。

进一步地,所述注入装置,用于根据预设的注入规则,在所述异步方法对应的代码块中确定注入异常处理代码的注入位置;以及在所述注入位置注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序。

进一步地,所述注入装置,用于在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时,对所述异常进行处理,并继续执行所述异步程序。

进一步地,所述异常处理代码为trycatch语句。:

与现有技术相比,本申请提供了一种保证异步程序健壮性的方案,该方案在异步程序编译过程中,检测异步程序中异步方法所对应的代码块,然后在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序,从而避免整个异步程序在某些异步方法的代码块出现异常时崩溃,从而保证异步程度的健壮性,降低人力成本。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:

图1为本申请实施例提供的一种保证异步程序健壮性的方法的流程图;

图2为本申请实施例提供的一种保证异步程序健壮性的设备的结构示意图;

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

下面结合附图对本申请作进一步详细描述。

在本申请一个典型的配置中,终端、服务网络的设备均包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。

图1示出了一种保证异步程序健壮性的方法的处理流程,该方法具体包括:

步骤s101,在编译过程中,检测异步程序中异步方法所对应的代码块。其中,所述代码块是指一段程序的代码中实现特定功能的一部分代码。

步骤s102,在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序,而不是使得异步程序崩溃或者终止执行。

以如下java代码为例,对上述方法进行详细说明,实际场景中本方案也可以适用于其它高级语言所编写的代码。

为方便说明,可以将上述代码分为如下三个代码块:

代码块一:

attachnictovmonhypervisormsgamsg=newattachnictovmonhypervisormsg();

amsg.setvmuuid(self.getuuid());

amsg.sethostuuid(self.gethostuuid());

amsg.setnics(msg.getnics());

其作用为创建一个amsg对象,并使用该对象的方法设置vmuuid(虚拟机的通用唯一识别码)、hostuuid(物理机的通用唯一识别码)和nics(网卡信息)等参数。

代码块二:

bus.maketargetserviceidbyresourceuuid(amsg,hostconstant.service_id,self.gethostuuid());

bus.send(amsg,newcloudbuscallback(msg){

其作用为将设置好的参数发送给消息总线(cloudbus),使得相应的物理机会收到对应的消息,来执行挂载指定网卡到虚拟机的操作。同时,还创建了一个对象cloudbuscallback,即注册了一个异步方法,使得指定物理机上的虚拟机挂载指定的网卡后,会调用该异步方法。

代码块三:

该代码块即为异步方法所对应的代码块,其主要内容为对象cloudbuscallback的异步方法的具体实现。当物理机收到对应消息后,就会执行挂载网卡到虚拟机的操作,由于此处采用了异步方法,因此管理节点并不关心物理机的处理过程,当物理机完成挂载操作后会调用刚才的异步方法,发送一个消息(msg)到消息总线,将操作结果返回给管理节点。在这个过程中,管理节点可能还发送了数千条其它消息,同样以异步的形式,由此大大提高了整个系统的吞吐量。

管理节点收到消息后,根据reply的返回方法为成功(success)或者(失败)fail(!reply.issuccess())。如果成功,将成功信息bus.reply(msg,r)发回给消息总线;如果失败,返回一个错误信息r.seterror给消息总线,理论上不管成功失败,这些信息都会向外发送给用户,这都算是正常的一个过程。但是不管异步方法的返回结果成功还是失败,都可能出现异常,比如过程中发生了网络抖动、虚拟机宕机了等等。能够引起异常的情况多种多样,对于程序员来说是很难完全考虑和处理的,这些异常情况发生时,往往会导致程序崩溃、无法继续执行或者跳出运行等一系列不可预料的情况。

由此,可以在编译过程中,检测异步程序中异步方法所对应的代码块。具体地,可以在编译过程中,查询所述异步程序中预先定义的数据结构,在查询到所述数据结构后,根据所述数据结构在所述异步程序中确定所述异步方法所对应的代码块。所述预先定义的数据结构是指在进行代码注入之前预先设置好的能够标识异步方法相关的数据结构,例如前述代码中newcloudbuscallback(),此处创建了一个cloudbuscallback的对象,即注册了一个异步方法,通过匹配的方式确定后续的一段代码即为异步方法所对应的代码块。

在确定异步方法所对应的代码块之后,需要向此代码块中注入异常代码,本申请实施例中注入的过程同样在编译阶段完成,具体的注入方式如下:首先根据预设的注入规则,在所述异步方法对应的代码块中确定注入异常处理代码的注入位置,然后在所述注入位置注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序。所述预设的注入规则是指在进行代码注入之前预先设置好的确定注入位置和注入内容的方式,对于不同的编程语言、不同的异常处理代码、不同类型的异步方法的代码块,其注入位置和内容都有可能存在不同。在实际场景中,可以根据不同编程语言、不同异步方法类型以及不同的异常处理代码设置相应的注入规则。

在本申请的一个优选实施例中,所述异常处理代码为trycatch语句,在实现注入时,可以借助aspectj框架,基于预先设置的数据结构、注入规则等在异步程序编译时,在异步方法对应的程序块中自动注入trycatch语句。例如,以前述的代码块三为例,注入trycatch语句后的代码如下:

通过在异步方法对应的代码块中注入trycatch语句,使得所述异步方法出现异常时,程序可以对该异常进行处理,例如前述程序中将把发生异常的情况向用户展示成错误信息,同时使得异步程序可以继续运行,而不会出现程序崩溃、无法继续运行等情况,从而有效保证了整个异步程序的健壮性。

而在实际场景中,对于其它的高级语言,可以使得特定的异常处理代码,使得在所述异步方法所对应的代码块中注入异常处理代码后,若所述异步方法出现异常,可以对所述异常进行相应处理(例如展示为错误信息等),并继续执行所述异步程序。

本申请提供方案中,是在程序的编译过程中注入异常处理代码。相较于在运行时注入方式,本申请的方案在注入过程中,无需处理代码的撤销注入,在异步程序编译完成的同时已经完成了代码的注入,使其在运行时无需进行任何代码注入的匹配检查,也不需要有任何其他对注入代码的管理逻辑,程序的执行开销较小。而在运行时注入异常处理代码,注入的过程在异步程序运行的时候进行的,异步程序中需要有专门的代码逻辑管理异常处理代码的注入操作,使得异步程序的整个执行过程中的资源开销较高。

此外,出于安全性上的考虑,在运行时注入,需要有特定的机制来保证异常处理代码注入操作的原子性,并且对于代码的改动发生在运行阶段,无法与现有的代码签名机制兼容。而在程序编译时实现注入充分利用了编译器所有的静态检查,以及优化过程。由于运行时不会再进行动态修改,只要编译顺利完成即可保证代码的可运行性以及完整性,与现有的代码签名机制兼容。

基于同一发明构思,本申请实施例中还提供了保证异步程序健壮性的设备,该设备对应的方法是前述实施例中的保证异步程序健壮性的方法,并且其解决问题的原理与该方法相似。

图2示出了一种保证异步程序健壮性的设备的结构示意图,该设备包括识别装置210和注入装置220。所述识别装置210用于在编译过程中,检测异步程序中异步方法所对应的代码块。其中,所述代码块是指一段程序的代码中实现特定功能的一部分代码。所述注入装置220用于在所述异步方法所对应的代码块中注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序,而不是使得异步程序崩溃或者终止执行。

以如下java代码为例,对上述方法进行详细说明,实际场景中本方案也可以适用于其它高级语言所编写的代码。

为方便说明,可以将上述代码分为如下三个代码块:

代码块一:

attachnictovmonhypervisormsgamsg=newattachnictovmonhypervisormsg();

amsg.setvmuuid(self.getuuid());

amsg.sethostuuid(self.gethostuuid());

amsg.setnics(msg.getnics());

其作用为创建一个amsg对象,并使用该对象的方法设置vmuuid(虚拟机的通用唯一识别码)、hostuuid(物理机的通用唯一识别码)和nics(网卡信息)等参数。

代码块二:

bus.maketargetserviceidbyresourceuuid(amsg,hostconstant.service_id,self.gethostuuid());

bus.send(amsg,newcloudbuscallback(msg){

其作用为将设置好的参数发送给消息总线(cloudbus),使得相应的物理机会收到对应的消息,来执行挂载指定网卡到虚拟机的操作。同时,还创建了一个对象cloudbuscallback,即注册了一个异步方法,使得指定物理机上的虚拟机挂载指定的网卡后,会调用该异步方法。

代码块三:

该代码块即为异步方法所对应的代码块,其主要内容为对象cloudbuscallback的异步方法的具体实现。当物理机收到对应消息后,就会执行挂载网卡到虚拟机的操作,由于此处采用了异步方法,因此管理节点并不关心物理机的处理过程,当物理机完成挂载操作后会调用刚才的异步方法,发送一个消息(msg)到消息总线,将操作结果返回给管理节点。在这个过程中,管理节点可能还发送了数千条其它消息,同样以异步的形式,由此大大提高了整个系统的吞吐量。

管理节点收到消息后,根据reply的返回方法为成功(success)或者(失败)fail(!reply.issuccess())。如果成功,将成功信息bus.reply(msg,r)发回给消息总线;如果失败,返回一个错误信息r.seterror给消息总线,理论上不管成功失败,这些信息都会向外发送给用户,这都算是正常的一个过程。但是不管异步方法的返回结果成功还是失败,都可能出现异常,比如过程中发生了网络抖动、虚拟机宕机了等等。能够引起异常的情况多种多样,对于程序员来说是很难完全考虑和处理的,这些异常情况发生时,往往会导致程序崩溃、无法继续执行或者跳出运行等一系列不可预料的情况。

由此,识别装置可以在编译过程中,检测异步程序中异步方法所对应的代码块。具体地,识别装置可以在编译过程中,查询所述异步程序中预先定义的数据结构,在查询到所述数据结构后,根据所述数据结构在所述异步程序中确定所述异步方法所对应的代码块。所述预先定义的数据结构是指在进行代码注入之前预先设置好的能够标识异步方法相关的数据结构,例如前述代码中newcloudbuscallback(),此处创建了一个cloudbuscallback的对象,即注册了一个异步方法,通过匹配的方式确定后续的一段代码即为异步方法所对应的代码块。

在确定异步方法所对应的代码块之后,需要向此代码块中注入异常代码,本申请实施例中注入的过程同样在编译阶段完成,具体的注入方式如下:注入装置首先根据预设的注入规则,在所述异步方法对应的代码块中确定注入异常处理代码的注入位置,然后在所述注入位置注入异常处理代码,以使所述异步方法出现异常时继续执行所述异步程序。所述预设的注入规则是指在进行代码注入之前预先设置好的确定注入位置和注入内容的方式,对于不同的编程语言、不同的异常处理代码、不同类型的异步方法的代码块,其注入位置和内容都有可能存在不同。在实际场景中,可以根据不同编程语言、不同异步方法类型以及不同的异常处理代码设置相应的注入规则。

在本申请的一个优选实施例中,所述异常处理代码为trycatch语句,在实现注入时,可以借助aspectj框架,基于预先设置的数据结构、注入规则等在异步程序编译时,在异步方法对应的程序块中自动注入trycatch语句。例如,以前述的代码块三为例,注入trycatch语句后的代码如下:

通过在异步方法对应的代码块中注入trycatch语句,使得所述异步方法出现异常时,程序可以对该异常进行处理,例如前述程序中将把发生异常的情况向用户展示成错误信息,同时使得异步程序可以继续运行,而不会出现程序崩溃、无法继续运行等情况,从而有效保证了整个异步程序的健壮性。

而在实际场景中,对于其它的高级语言,可以使得特定的异常处理代码,使得在所述异步方法所对应的代码块中注入异常处理代码后,若所述异步方法出现异常,可以对所述异常进行相应处理(例如展示为错误信息等),并继续执行所述异步程序。

本申请提供方案中,是在程序的编译过程中注入异常处理代码,相较于在运行时注入方式,本申请的方案在注入过程中,无需处理代码的撤销注入,在异步程序编译完成的同时已经完成了代码的注入,使其在运行时无需进行任何代码注入的匹配检查,也不需要有任何其他对注入代码的管理逻辑,程序的执行开销较小。而在运行时注入异常处理代码,注入的过程在异步程序运行的时候进行的,异步程序中需要有专门的代码逻辑管理异常处理代码的注入操作,使得异步程序的整个执行过程中的资源开销较高。

此外,出于安全性上的考虑,在运行时注入,需要有特定的机制来保证异常处理代码注入操作的原子性,并且对于代码的改动发生在运行阶段,无法与现有的代码签名机制兼容。而在程序编译时实现注入充分利用了编译器所有的静态检查,以及优化过程。由于运行时不会再进行动态修改,只要编译顺利完成即可保证代码的可运行性以及完整性,与现有的代码签名机制兼容。

另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个设备,该设备包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该设备运行基于前述根据本申请的多个实施例的方法和/或技术方案。

需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(asic)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,ram存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。

对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1