一种基于代理的面向服务软件系统的容错方法

文档序号:6375918阅读:172来源:国知局
专利名称:一种基于代理的面向服务软件系统的容错方法
技术领域
本发明涉及一种服务容错技术领域的方法,尤其是涉及一种基于代理的面向服务软件系统的容错方法。
背景技术
基于构件的软件开发可以大幅度提高软件的复用、开发的效率和质量,降低软件开发和维护的成本,各种构件支撑平台的出现很大程度上推动了软件构件化的发展,软件构件技术已经得到了广泛的应用。OSGi (open services gateway initiative,开放服务网关平台)作为一个优雅、完整、动态的组件模型,为开发者提供了一套标准的方法来管理软件的生命周期,它能够对单个Java虚拟机内的Java应用提供一个动态的构件运行环境。OSGi的应用服务程序(bundle)无需重新引导可以被远程安装、启动、升级和卸载。但是OSGi平台本身没有提供一个很好的容错机制,它不能很好的处理网络波动、设备故障以及服务构件故障等引起的错误,所以很有必要对OSGi进行容错扩展。 在对OSGi平台进行容错扩展的过程中,首先要对平台里面各个Bundle进行动态的监测,收集各个Bundle运行时的信息。其次要捕获Bundle在进行调用的过程中抛出的异常或者发生的错误,因为Bundle之间存在依赖关系,依赖于发生错误Bundle的Bundle也应该被视为无法正常运行,所以要进行错误传播的分析,以确定一个最小的影响模块集合。接着寻找影响集里面Bundle的替代Bundle,所以有必要对可替代Bundle进行定义。最后用新的模块替代出错的模块。经对现有技术文献的检索发现,Ahn等人在Proceedings of the 2006 ACMsymposium on Applied computing, Dijon, France 上所发表的 Towards ReliableOSGiFramework and Applications (可靠OSGi框架及应用)中,提出了一种对OSGi平台的容错扩展。Ahn主要是通过提供冗余Bundle的方式进行容错,冗余Bundle的功能是类似的,它们之间可以互相替代。当某个Bundle出错时,用该Bundle的冗余Bundle进行替换。但是该文章中只能对没有状态的Bundle进行容错,无法满足更多的应用需求,而且对可替换的定义过于严格,更加限制了该方法的应用范围。

发明内容
本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种容错准确率高、应用范围广的基于代理的面向服务软件系统的容错方法。本发明的目的可以通过以下技术方案来实现—种基于代理的面向服务软件系统的容错方法,该方法基于扩展的OSGi,所述的扩展的OSGi包括OSGi基本框架、代理管理模块、服务调用记录模块、服务依赖分析模块和服务修复模块,所述的方法具体包括以下步骤第一步代理管理模块为每一个运行的Bundle生成一个对应的代理;第二步当调用某个Bundle的服务时,代理管理模块将该调用首先重定向到对对应代理的调用,由代理再去调用真正的服务,代理管理模块判断代理的调用过程是否捕获到错误信息,若是,则执行第三步,若否,则代理管理模块把本次的调用信息保存到服务调用记录模块;第三步代理管理模块捕获到了错误,停止调用的服务,并且将该服务加入到服务修复模块的错误恢复队列中,开始服务错误修复流程;第四步;服务修复模块首先判断当前错误恢复队列是否为空,若是,则停止服务错误修复流程,若否,则取出错误恢复队列中队首的服务,并执行第五步;第五步服务修复模块判断是否找到当前队首服务的可替代服务,若是,则用可替代服务替换当前队首服务,并返回第四步,若否,则执行第六步;
第六步服务修复模块通过服务依赖分析模块找到所有依赖于当前队首服务的服务,停止这些服务并且将这些服务加入到错误恢复队列中,然后返回第四步。所述的第一步中的生成代理具体是指利用Java类的反射机制,对每个Bundle都生成一个与该Bundle相对应的代理,所述的代理替代该Bundle作为外部的接口。所述的第二步中的服务调用记录模块中保存有所有服务的调用信息,以此作为服务错误修复的依据。所述的第五步中的用可替代服务替换当前队首服务具体为首先将调用当前队首服务的指针都指向可替代服务,然后根据服务调用记录模块中的记录把可替代服务的状态运行到和当前队首服务出错时等价的状态。所述的第六步中的服务依赖分析模块中存储有不同服务之间互相调用的信息图,所述的信息图根据服务依赖分析模块监听到的服务注册信息、注销信息、查询信息和调用信息动态变化。所述的可替换服务的定义具体如下定义服务S为一个五元组,S = {Q,IN, OUT, Trans, q0},满足(I) Q是状态集合;(2) IN是触发事件集合,即对于服务的调用事件,包括调用的函数和参数;(3) OUT是结果事件集合;(4) Trans Q X IN — Q X OUT 是转移函数;(5) q0 G Q,是起始状态;服务S在启动时状态处于初始状态q0,当S接收到触发事件in G IN,按照Trans的规则进行计算,以此类推,如果服务S接受到一组触发事件序列(inl,in2,…),根据Trans的规则,S将会输出一组结果事件序列(outl, out2,…);对于任意的一组触发事件序列,分别作用到服务SI和S2上,如果得到的结果事件序列始终是相同的,则服务SI和S2是可替换的。与现有技术相比,本发明具有以下优点;(I)本发明采用基于代理的扩展,可以在原有的OSGi对Bundle的调用流程中插入代码,便于调用信息的保存和错误信息的捕获;(2)本发明详细定义了可替换服务的概念,并且利用历史调用信息来进行服务状态的迁移,从而达到了将替换服务的类型扩展到有状态的目的,一定程度上拓宽了应用的范围。


图I为本发明的扩展的OSGi架构示意图;图2为在本发明的服务修复流程示意图;图3为在本发明的错误恢复前后服务调用流程示意图。
具体实施例方式下面结合附图和具体实施例对本发明进行详细说明。实施例本实施例将基于开放式服务平台OSGi (Open Service Gateway initiative,开放服务网关平台)来实施的。OSGi平台是一个为Java提供的可插拔、面向服务的构建模型。Bundle是OSGi启动和加载的基本单元,由普通的JAR文件加上额外的描述信息构成。 Bundle通过OSGi平台进行服务的发布、绑定、查找以及动态的实现模块之间的通信,为了达到模块之间松耦合和模块内高内聚,被调用的服务可以在使用的时候进行绑定。为了实现本发明基于代理的面向服务软件系统的容错方法,该方法基于扩展的OSGi,如图I所示,所述的扩展的OSGi包括OSGi基本框架I、代理管理模块2、服务调用记录模块3、服务依赖分析模块4和服务修复模块5。代理管理模块2可为每个运行的Bundle生成一个与之对应的代理。代理的增加使得监测服务之间的调用情况得以实行,当服务出现错误的时候,代理可以马上检测到,及时地进行容错处理。错误的检测只是容错的第一步,接下来要计算错误的传播,当出错服务不能修复的情况下,所有引用该服务的服务都将不能正常工作。最后是错误的修复,错误的服务将会被具有相同功能的服务替代,并且新服务的状态要运行到和旧的服务出错时等价的状态。容错扩展的增加可以在不重新启动整个架构的前提下替换失效的服务。服务调用记录模块3记录了所有的服务调用信息,服务依赖分析模块4维护了当前服务的依赖关系,服务修复模块5在服务发生错误的时候负责替换新的服务。这些模块都是建立在OSGi框架的服务注册中心(Service Registry)和服务管理器(Bundlemanager)以及 Remote-OSGi 之上的。在OSGi原有的架构上要实现错误检测是一个很大的挑战,OSGi架构没有为service client 提供监听 service provider的功能。所以service provider必须检查自己的状态,如果出现错误的时候,必须从OSGi里面注销,与此同时service client必须监听所有的注册事件。简言之,在OSGi架构上实现错误检测是一件非常麻烦和低效的工作。本发明扩展的OSGi架构提供了简单高效的错误检测的机制,利用Java类的反射机制,代理对象的代码可以插入到服务的调用过程,检测服务调用的状态,比如调用成功或者失败。对于捕获的错误,每个代理都会保存起来,当发现了不可恢复的错误时,将会找到合适的替代服务,使代理重定向到新的服务,最后调用错误修复管理器让新的服务运行到和旧的服务等价的状态。本发明基于代理的面向服务软件系统的容错方法的具体步骤为第一步代理管理模块为每一个运行的Bundle生成一个对应的代理;第二步当调用某个Bundle的服务时,代理管理模块将该调用首先重定向到对对应代理的调用,由代理再去调用真正的服务,代理管理模块判断代理的调用过程是否捕获到错误信息,若是,则执行第三步,若否,则代理管理模块把本次的调用信息保存到服务调用记录模块;第三步代理管理模块捕获到了错误,停止调用的服务,并且将该服务加入到服务修复模块的错误恢复队列中,开始服务错误修复流程,如图2所示;第四步服务修复模块首先判断当前错误恢复队列是否为空,若是,则停止服务错误修复流程,若否,则取出错误恢复队列中队首的服务,并执行第五步;第五步服务修复模块判断是否找到当前队首服务的可替代服务,若是,则用可替代服务替换当前队首服务,并返回第四步,如果该错误是永久性的、不可恢复的错误,该服务将会被卸载,并执行第六步;第六步服务修复模块通过服务依赖分析模块找到所有依赖于当前队首服务的服务,停止这些服务并且将这些服务加入到错误恢复队列中,然后返回第四步,,直到队列里 面没有需要恢复的服务这个过程才会停止。图3所示为在本发明容错架构下,错误恢复前后服务调用流图。本发明中错误恢复是基于相同服务的冗余,一旦发现失败服务的时候,系统就会搜索失败服务的替代服务,然后用新搜索到的服务替换掉就的服务,最后把新的服务运行到和旧的服务出错时等价的状态,就完成了错误的恢复。图3中错误恢复前,用户通过代理I进行对服务I的调用,当服务I出现错误的时候,代理I将会重定向到服务2,而对于服务的调用者来说,这些都是不可见的,好像就跟没发生错误一样。在寻找替换服务的过程中,一个关键问题就是怎么定义可替换服务。本发明所述的可替换服务具体指定义服务S为一个五元组,{Q,IN, OUT, Trans, q0},满足(I) Q是状态集合;(2) IN是触发事件集合,即对于服务的调用事件,包括调用的函数和参数;(3)OUT是结果事件集合,即服务对于外部的影响,例如向文件写入一组字符或者向设备发出指令等;(4) Trans Q X IN — Q X OUT 是转移函数;(5) q0 G Q 是起始状态。服务 S = {Q,IN,OUT, Trans, q0}。将以如下方式运作服务S在启动时状态处于初始状态q0,当S接收到触发事件in G IN,按照Trans的规则进行计算,例如Trans (q0, in) = (ql, out), S将进入新的状态ql G Q,同时输出结果事件out G OUT。以此类推,如果服务S接受到一组触发事件序列(inl, in2,…),根据Trans的规则,S将会输出一组结果事件序列(outl, out2,…)。对于任意的一组触发事件序列,分别作用到服务SI和S2上,如果得到的结果事件序列始终是相同的,则认为SI和S2是可替换的。在错误恢复过程中,一个关键问题就是服务状态的恢复。由于本发明所涉及的可替代服务对于相同的输入序列具有相同的对外界的影响序列,而在本发明的扩展OSGi中已经记录了所有服务调用的信息,所以只需要把对于旧的服务的调用序列按顺序作用到新服务上去,新服务就可以到达所需的状态了。本发明定义的可替代服务只是所有服务的一个子集,没有考虑更加普适的服务。
权利要求
1.一种基于代理的面向服务软件系统的容错方法,其特征在于,该方法基于扩展的OSGi,所述的扩展的OSGi包括OSGi基本框架、代理管理模块、服务调用记录模块、服务依赖分析模块和服务修复模块,所述的方法具体包括以下步骤 第一步代理管理模块为每一个运行的Bundle生成一个对应的代理; 第二步当调用某个Bundle的服务时,代理管理模块将该调用首先重定向到对对应代理的调用,由代理再去调用真正的服务,代理管理模块判断代理的调用过程是否捕获到错误信息,若是,则执行第三步,若否,则代理管理模块把本次的调用信息保存到服务调用记录模块; 第三步代理管理模块捕获到了错误,停止调用的服务,并且将该服务加入到服务修复模块的错误恢复队列中,开始服务错误修复流程; 第四步服务修复模块首先判断当前错误恢复队列是否为空,若是,则停止服务错误修 复流程,若否,则取出错误恢复队列中队首的服务,并执行第五步; 第五步服务修复模块判断是否找到当前队首服务的可替代服务,若是,则用可替代服务替换当前队首服务,并返回第四步,若否,则执行第六步; 第六步服务修复模块通过服务依赖分析模块找到所有依赖于当前队首服务的服务,停止这些服务并且将这些服务加入到错误恢复队列中,然后返回第四步。
2.根据权利要求I所述的一种基于代理的面向服务软件系统的容错方法,其特征在于,所述的第一步中的生成代理具体是指利用Java类的反射机制,对每个Bundle都生成一个与该Bundle相对应的代理,所述的代理替代该Bundle作为外部的接口。
3.根据权利要求I所述的一种基于代理的面向服务软件系统的容错方法,其特征在于,所述的第二步中的服务调用记录模块中保存有所有服务的调用信息,以此作为服务错误修复的依据。
4.根据权利要求I所述的一种基于代理的面向服务软件系统的容错方法,其特征在于,所述的第五步中的用可替代服务替换当前队首服务具体为 首先将调用当前队首服务的指针都指向可替代服务,然后根据服务调用记录模块中的记录把可替代服务的状态运行到和当前队首服务出错时等价的状态。
5.根据权利要求I所述的一种基于代理的面向服务软件系统的容错方法,其特征在于,所述的第六步中的服务依赖分析模块中存储有不同服务之间互相调用的信息图,所述的信息图根据服务依赖分析模块监听到的服务注册信息、注销信息、查询信息和调用信息动态变化。
6.根据权利要求I所述的一种基于代理的面向服务软件系统的容错方法,其特征在于,所述的可替换服务的定义具体如下 定义服务S为一个五元组,S = {Q,IN, OUT, Trans, q0},满足 (1)Q是状态集合; (2)IN是触发事件集合,即对于服务的调用事件,包括调用的函数和参数; (3)OUT是结果事件集合;(4)Trans Q X IN — Q X OUT 是转移函数; (5)q0 G Q,是起始状态; 服务S在启动时状态处于初始状态q0,当S接收到触发事件in G IN,按照Trans的规则进行计算,以此类推,如果服务S接受到一组触发事件序列(inl,in2,…),根据Trans的规则,S将会输出一组结果事件序列(outl,out2,…); 对于任意的一组触发事件序列,分别作用到服务SI和S2上,如果得到的结果事件序列始终是相同的,则服务SI和S2是可替换的。
全文摘要
本发明涉及一种基于代理的面向服务软件系统的容错方法,该方法具体包括代理管理模块为每一个运行的Bundle生成一个对应的代理;当调用某个Bundle的服务时,该调用首先被重定向到对代理的调用,代理管理模块判断代理的调用过程是否捕获到错误信息,若是,则停止调用的服务,开始服务错误修复流程,若否,则代理管理模块把本次的调用信息保存到服务调用记录模块;服务错误修复利用找到的可替代服务替换错误的服务,若无可替代服务,则根据服务依赖分析模块寻找所有依赖于当前错误服务的服务,停止这些服务并且将这些服务加入到错误恢复队列中进行错误修复。与现有技术相比,本发明具有可有效容错、适用范围广等优点。
文档编号G06F11/07GK102831027SQ20121031392
公开日2012年12月19日 申请日期2012年8月29日 优先权日2012年8月29日
发明者黄林鹏, 顾亮亮, 李晨 申请人:上海交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1