具体实施方式
现在参考附图详细描述本发明的实现。下面将利用基于Java的软件系统来描述本发明的优选实施例。但是,应该容易理解基于Java的软件系统不是实现本发明的唯一工具,本发明可以利用其它类型的软件系统来实现。
1.Mervlet应用程序环境的概述
如图1所示,在根据本发明的应用程序环境中,应用程序开发人员创建被称为“Mervlet”的移动应用程序。Mervlet 10是一个能够创建用于移动计算设备的动态web页面的可执行应用程序。Mervlet 10包括未翻译代码和局部静态数据。Mervlet 10的未翻译代码可以包括用来创建web页面的用户接口逻辑和用来为页面生成动态内容的应用程序逻辑。Mervlet 10还可以访问外部数据文件,如ASCII文本文件。此外,与常规应用程序不同,Mervlet 10具有一套与它关联的独特的应用程序属性集。这些属性能够使其跨通信网络动态地实现Mervlet 10的负载平衡。Mervlet 10还具有一套允许Mervlet在网络中不同设备上它自己的安全环境下运行的安全属性集。因此,Mervlet 10具有可重部署动态web文档的特征。
Mervlet 10在Mervlet运行时间引擎12的控制下执行,Mervlet运行时间引擎包括客户化标签库14、用于系统服务的一组组件16和核心翻译器18。Mervlet引擎12可以配置为自恢复的,以便它可以重新启动执行在系统故障时运行的Mervlet集。
Mervlet引擎12利用基于通信系统20的消息通过网络从Mervlet向远端客户设备传递内容。为了负载均衡,发消息系统20还可以通过网络传输Mervlet 10。例如,发消息系统20可以利用点对点异步消息收发来操作请求和回复消息的通信。另外,Mervlet应用程序环境支持可靠的发消息系统20,可靠的发消息系统20能够从短暂的网络和设备故障中恢复并且保证消息传递到末端。可靠的发消息系统20可以配置成允许应用程序开发人员、系统管理员或用户为不同的恢复选项选择用来缓存消息的设备。但是,本领域技术人员很容易识别出可在Mervlet应用程序环境中使用的其它类型的通信系统,包括使用了由HTTP、SMTP或类似传输协议传输的远端过程调用的系统。
另外,Mervlet引擎12与可配置的高速缓存管理器22有接口,可配置的高速缓存管理器22用来在本地设备上缓存Mervlet来隐藏网络中断。如果可对设备的高速缓存编程,那么可以将Mervlet指定的缓存策略下载到设备上。可配置的高速缓存管理器22的缓存机制允许高速缓存管理器动态改变它的高速缓存管理策略。
接下来参见图2和3,在步骤10的操作中,形成通信网络一部分的移动设备或用户客户端设备(UCD)30产生对Mervlet 10的请求。UCD 30执行Mervlet引擎12、发消息系统20和高速缓存管理器22。UCD 30还可以利用象微软公司的Internet Explorer和Pocket Internet Explorer、以及网景公司的Netscape Navigator的web浏览器显示来自Mervlet 10的信息。Mervlet 10可以远程执行,或者发出请求的UCD 30可以在本地执行被请求的Mervlet 10。UCD 30利用统一资源标识符(“URl”)产生对Mervlet 10的请求。为了允许利用因特网访问协议接入Mervlet,URl在网络上注册的名字空间中对Mervlet 10的名称和地址编码。
被请求的Mervlet 10可以存储在本地发出请求的UCD 30或者是具有足够存储器和处理能力来执行Mervlet(“主服务器”)32的网络的远程节点,它可以是另一个UCD 34或计算机服务器级的设备36。在步骤12中,发出请求的UCD 30可以利用现有的资源发现技术,如Sun微系统公司的JINI定位主服务器32。主服务器32必须能够执行Mervlet 10或者在网络上定位未示出的辅助服务器来执行Mervlet 10。在后一种情况中,主服务器32必须向辅助服务器发送Mervlet 10并且从发出请求的UCD 30转发请求。UCD 30和主服务器32可以在一个或多个接入网络38上互相通信。
在步骤14中,发出请求的UCD 30首先检查Mervlet 10是否存储在设备的本地高速缓存中。如果是,那么在步骤16中,在那里执行Mervlet10。否则,在步骤18中,发出请求的UCD 30与主服务器32通信获得对被请求的Mervlet 10的“访问”。然后,在步骤20,主服务器32调用Mervlet10的负载均衡策略来优化Mervlet 10的用户感知性能。例如,主服务器32可以决定是在本地运行Mervlet 10(步骤22)还是将它重新部署在发出请求的UCD 30(步骤24)。在某些情况下,UCD 30为了在它自己的位置运行Mervlet 10,可以发出一个显式请求。但是,主服务器32可以忽略这个请求。如果在步骤22中,在主服务器32上执行Mervlet 10,那么结果会通过Mervlet应用程序环境的发消息系统20发送回UCD 30。
主服务器32可以根据下面的属性确定是否在本地还是在发出请求的UCD 30上运行Mervlet 10,这些属性包括:1)UCD和服务器节点的存储器和处理容量,2)两个节点中每个的负载、网络带宽和等待时间,以及3)与Mervlet性能有关的属性集。例如,如果Mervlet有很高的用户交互性,例如游戏应用程序,并且UCD具有足够的硬件资源来执行Mervlet,那么服务器可以确定在UCD上运行Mervlet。相反,如果Mervlet是数据或需要很强的计算性,而不是交互性,例如,个性化应用程序,那么服务器可以确定在本机上运行Mervlet。但是,本领域技术人员可以根据系统监视的参数清楚地识别出也可以用其它的负载均衡决定。例如,为了改进通信能力,主服务器32和UCD 30可以实现网络切换策略来切换设备之间的接入网络。
现在描述上述支持高层执行模块的系统实现。特别地,要说明Mervlet应用程序环境的几个关键特征,包括:1)用于Mervlet的应用程序模型,2)Mervlet运行时间引擎,3)跨网络的用来优化Mervlet的用户感知性能的负载均衡方案,4)用于可恢复的Mervlet引擎和可靠的发消息系统的可配置容错方案,以及5)可配置的中断模式操作方案。
2.Mervlet应用程序
Mervlet 10定义了用于在移动设备上动态显示生成内容的web页面的用户接口。图4示出了Mervlet 10的结构。特别是,Mervlet 10利用独立于用户接口逻辑40的平台,如标记语言指令,来控制格式化和显示web页面。它还可以处理来自web浏览器的请求和回复。例如,Mervlet 10可以支持使用可以由web浏览器解释的静态HTML、DHTML、XHTML、XML和类似格式标签的web页面。
另外,Mervlet 10利用XML类标签封装用来为web页面生成动态内容的应用程序逻辑42。应用程序逻辑42自己可以驻留在基于服务器的资源中,如JavaBean或定制的Mervlet标签库14,页面可以利用这些XML类标签访问。Mervlet标签库14可以是特定设备上应用程序环境的固有的(native),或者它们也可以在负载均衡期间重新部署Mervlet时随Mervlet 10转移。因此,Mervlet 10将动态web页面的用户接口与独立于平台的为可重用的基于组件设计而生成的内容分离。
Mervlet 10还可以通过发消息系统20实现网络连接并且可以接入本地数据文件。因此,Mervlet的应用程序模型包括用户接口逻辑40、应用程序逻辑42、文件接入46和网络接入44。
另外,由性能属性52和系统属性54组成的新颖的应用程序属性集50与Mervlet 10关联,用于对网络上的Mervlet进行动态的负载均衡。例如,Mervlet 10可以根据它的应用程序属性50跨移动通信网在加载时和运行时动态重新部署,下面会进一步描述。
Mervlet 10还可以根据相关的安全属性集56在它自己的安全环境下执行。密封模型决定用户可以使用哪些资源。利用Java 2安全模型的变体,类加载器和所属类可以由在此引用的Lslam等人1997年在IEEESoftware上发表的题为“使用互联网内容的灵活的安全模型”中讨论的策略机制来修改,一个例外是可以由UCD设置保护域。类加载器生成运行Mervlet 10的安全环境。Mervlet 10运行之前由设备签名并验证。利用安全属性56配置的策略模块实现谁可以信任和允许何种操作的策略。Mervlet引擎12监视Mervlet 10在运行时的任何接入,并且一旦Mervlet试图在它的安全环境之外运行就终止它。通过随着Mervlet 10重新部署安全属性,Mervlet 10的安全环境可以在网络上的不同设备转移和重新生成。
上述特征是Mervlet应用程序模型特有的并且回避了生成动态web页面的其它类型的技术。Mervlet 10可以作为从Sun微系统公司的“JavaServer PageTM-白皮书”中讨论的JavaServer Page(“JSP”)模型演变来的Java应用程序组件来实施,“JavaServer PageTM-白皮书”可以在
http://java.sun.com/products/jsp/whitepaper.html找到并在此引用。基于Java的Mervlet实现可以接入J2ME CDC环境和由Java类使用的资源文件,但是不能访问JNDI、JMS、JTA、JAF、Java Mail、RMI、JDBC和IIOP类。另外,从JSP派生的Mervlet不能接入AWT或SWING类。基于J2ME实现的Mervlet 10也不允许由Mervlet处理的web页面内的脚本。为了在硬件资源有限的瘦客户端设备上优化Mervlet的实现,在实现Mervlet应用程序环境的网络上的所有节点都存在这些限制。因此,这样的Mervlet实现是独立于平台的并且能够调节现有Java平台技术来满足瘦客户端的要求。
除了改变JSP应用程序编程接口(“API”),根据本发明的基于J2ME实现的Mervlet应用程序环境还改变了传统JSP和Servlet执行的语义,如确定何时何处执行Mervlet。下面会更详细地描述这种实现方法。
3.Mervlet引擎
如图1所示,在Mervlet引擎12上编译和执行Mervlet 10。引擎12能够处理从客户端应用程序,例如web浏览器对Mervlet 10的请求,并且能够产生Mervlet 10对客户端浏览器的响应。更具体地说,Mervlet引擎12为应用程序逻辑42翻译Mervlet标签。然后,引擎访问资源或标签库14来为由Mervlet 10的用户接口逻辑40定义的web页面生成动态内容。标签库14可以是设备本身的,或者是利用Mervlet 10重新部署的。然后,引擎12将结果以HTML或XML页的形式发送回发出请求的web页面。用于应用程序逻辑42的任何静态格式化标签都直接传递到发出请求的web浏览器。
Mervlet引擎12可以运行在用于瘦客户端设备的J2ME CDC平台和用于服务器级设备的J2EE平台。J2ME平台通常需要32位的CPU和至少2M的内存。J2EE平台通常需要至少是Intel奔腾(Pentium)III处理器,128M ROM和300M持续存储器。根据本发明,用于Mervlet应用程序环境的、支持在运行时消耗6M RAM的Mervlet引擎的一种可能配置包括至少32位CPU、10M内存和40M持续存储器。但是,应该理解,这些用于Mervlet应用程序环境的值只意味着说明,而不是限制。在J2EE的环境中,Mervlet引擎12可以代替J2EE中的web容器和Servlet引擎模型。因此,Mervlet引擎12可以提供具有访问Java虚拟机(JVM)、个人Java虚拟机(PJVM)或其它类型虚拟机(VM)′的Mervlet 10。运行在设备固有操作系统顶层的VM的作用象抽象的计算机器,接收Java字节码,通过动态地将它们转换成可由本机操作系统执行的形式对它们进行翻译。
如图5所示,Mervlet引擎12通过应用程序编程接口(API)集管理Mervlet 10的生存周期。Mervlet引擎执行的动作包括在步骤30,在网络上寻找由客户端应用程序请求的Mervlet。所请求的Mervlet可以存储在发出请求的客户端或主服务器上。当找到Mervlet后,Mervlet引擎创建一个Mervlet实例,将它加载到引擎的存储器中并且在步骤32对它进行初始化。当初始化完成后,在步骤34,Mervlet准备接收信息,Mervlet引擎能够传递请求并且处理来自Mervlet的回复。一旦不再需要Mervlet,在步骤36,Mervlet引擎撤消Mervlet并且删除它在引擎存储器中的存在和持续存储器中与Mervlet关联的任何数据。
在步骤38中,Mervlet引擎可以在故障后重新启动一个Mervlet。在步骤40,Mervlet引擎还可以在任何时候通知Mervlet它需要存储它的状态。下面结合Mervlet应用程序环境的容错性能更详细地描述Mervlet引擎利用这些动作从故障中恢复的能力。
下面是在基于J2ME平台的Mervlet引擎上实现Mervlet的API集的例子。Mervlet API是从用于Java Servlet接口的标准Java类得来的。Mervlet实现创建了“javax.servlet”类的“javax.mervlet”子类。
这里有10个类被认为用于Mervlet API的“javax.mervlet”实现。下面列出了与Servlet实现保持不变的其中5个类。
● Mervlet Exception,与ServletException相同● MervletInputStream,与ServletInputStream相同● MervletOutputStream,与ServletOutputStream相同● RequestDispatcher,保持不变which remains unchanged● MervletConfig,与ServletConfig相同 |
下面描述的5个类是需要修改语义的。
● Mervlet● MervletContext● MervletRequest● MervletResponse● Single ThreadModel |
“Mervlet”类有三个重要方法:
public void Init()throws“MervletException”;public void Service()throws“MervletException”;andpublic void Destroy() throws“MervletException”; |
Mervlet引擎调用方法“Init()”来初始化Mervlet。必须在找到Mervlet后并且在Mervlet上调用了类加载器后才调用它。必须在允许任何调用方法“Service()”之前调用方法“Init()”。在Mervlet上调用方法“Service()”来允许Mervlet引擎传递请求和处理来自Mervlet的回复。通过在Mervlet上调用方法“Destroy()”来撤消Mervlet。
在需要参数的情况下,构建Mervlet环境并且将它传递到方法中。因此,开发人员可以扩展“Mervlet”类并且替换方法“Init()”和方法“Service()”,例如,如下:
public void Init(MervletConfig)throws“MervletException”;andpublic void Service(MervletRequest,MervletResponse)throws IOException,MervletException. |
另外,可以用下面两个附加的方法作为均衡加载Mervlet和从系统失效(crash)恢复的“Mervlet”类的一部分:
Void Restore(MervletContext m)Void Save() |
当试图从失效中恢复Mervlet时,Mervlet引擎在调用方法Init前先调用方法Restore()来恢复它自己的状态。Mervlet引擎可以在任何时候调用方法Save()来通知Mervlet存储它自己的应用程序状态。但是,Mervlet不应该假设在故障发生前调用了方法Save()。
类“MervletContext”指定Mervlet可用的资源。它是类“ServletContext”的一个扩展并且包括下列附加资源:i)供Mervlet使用的文件;ii)与Mervlet性能有关的属性集,包括用户接口和I/O特征,下面会进一步描述;和iii)Mervlet的资源权利。类“MervletContext”还包括获得和设置这些资源中的每一个的方法。
类“MervletRequest”和“MervletResponse”分别是类“ServletRequest”和“ServletResponse”的扩展。Mervlet引擎利用下面的抽象发消息方法生成请求和响应:
Void Reliable_async_send(Endpoint to,Endpoint From,DataStream Data,Reliability Type,CallbackMethod cm). |
该方法的数据格式与用于HTTP-mime编码的接口格式相同。其它实现可能具有不同的交换格式。
因为Mervlet引擎是多线程的,因此不实现Servlet模型的类“SingleThreadModel”。
接下来参见图6,现在描述显示当响应用户客户端设备30上的客户端应用程序或浏览器60对Mervlet 10的请求时,Mervlet引擎12操作的功能方框图。图6所示的Mervlet 10可以存储在用户客户端设备30或主服务器设备32上。用户客户端设备30和主服务器设备32都执行具有核心翻译机18的Mervlet引擎12。
首先,在发出请求的客户端30上的Mervlet引擎12必须找到Mervlet10。引擎本身由简单的Mervlet组件构成。为了定位或寻找所请求的Mervlet,MervletFinder模块62翻译请求加载Mervlet的客户端30中的所有调用。MervletFinder模块62利用已知的由高速缓存导出的散列函数在客户端30上为被请求的Mervlet 10寻找本地高速缓存。如果找到Mervlet 10,那么MervletFinder模块62为Mervlet分配存储器并且从本地高速缓存读取Mervlet。然后,MervletFinder模块62调用Mervlet 10上的方法“Init”,为被请求的Mervlet传递配置数据来初始化新创建的Mervlet实例。当Mervlet 10完成后,它自己调用方法“Destroy()”。如果Mervlet引擎12想删除Mervlet 10,那么它可以在它上面调用方法“Destroy()”。
如果MervletFinder模块62确定所请求的Mervlet 10不在客户端30,因为在本地高速缓存上没有匹配,那么它向主服务器设备32查询Mervlet10。向服务器32的查询包括Mervlet 10的名称、客户端设备30的CPU使用、客户端设备30的MIPS等级、客户端设备30上可用的内存和持续存储器、以及任何可用的Mervlet 10的性能属性。主服务器32可以利用该信息决定是在客户端30上重新部署Mervlet 10还是利用下面要详细描述的负载均衡方案切换用于服务器32和客户端30之间通信的接入网络38。
Mervlet引擎12还包括InterceptingMervlet模块64,它翻译对到达主服务器32的Mervlet 10的请求。当来自网络的对Mervlet的请求消息到达后,InterceptingMervlet模块64在服务器32上向Mervlet 10派发消息。为了响应对Mervlet 10的请求,InterceptingMervlet模块64还调用PolicyMervlet模块66并且向它传递用于发出请求的客户端30的系统性能参数。然后,PolicyMervlet模块66确定如何均衡加载Mervlet10来优化用户对其的感知性能。PolicyMervlet模块66由系统管理员设置。另外,主服务器32可以同时接受客户端多个请求,因此PolicyMervlet模块66和InterceptingMervlet模块64是多线程的。
特别是,主服务器32和客户端30可以如下均衡加载Mervlet 10。服务器32可以选择在服务器上执行Mervlet 10并且允许发出请求的客户端30与Mervlet进行远程交互。另外,服务器32还可以决定向客户端30发送Mervlet 10以便在客户端设备上执行。PolicyMervlet模块66决定是否利用应用程序准备方案重新部署Mervlet 10,下面会进一步描述。另外,服务器32或客户端30可以利用网络交换方案选择切换用于互相通信的接入网络,下面会进一步描述。
如果服务器32决定在服务器机器上运行被请求的Mervlet 10,那么PolicyMervlet模块66从服务器的高速缓存中检索Mervlet 10并且利用方法“new()”为它分配内存。然后,利用合适的Mervlet环境在Mervlet10调用方法“Init()”。当安全语义与J2EE中的相同时,初始化的Mervlet10实例假设发出请求的客户端可以信任。当被请求的Mervlet 10的实例初始化后,它可以访问服务器上的本地数据。Mervlet 10还可以通过发消息系统20与客户端30上的客户端应用程序通信,下面会进一步详细描述。因此,Mervlet引擎12直接将输出从Mervlet 10发送到发出请求的客户端30。最后,通过调用Mervlet中的方法“Destroy()”来消除Mervlet 10。
如果PolicyMervlet模块66决定应该在发出请求的客户端30上运行被请求的Mervlet 10,那么整理Mervlet并将它发送到远端机器上。为了重新部署Mervlet 10,引擎12将Mervlet打包到Mervlet存档(“MAR”)文件68。MAR文件68最好包括:1)Mervlet 10和任何关联的标签库14,2)用于Mervlet的安全环境属性56和应用程序属性50,3)任何与Mervlet10关联的数据文件,和4)描述MAR文件内容的MAR文件清单。因此,MAR文件68具有客户端30上的Mervlet引擎12所需外部信息,以生成合适的Mervlet环境,当Mervlet 10启动时传递到它的方法“Init()”。MAR文件68可以被压缩,散列然后签名。下载者可以解压缩,验证内容没有被破坏并且验证签名。
现在我们说明Mervlet应用程序环境如何均衡加载一个Mervlet应用环境并且从系统故障中恢复。
3.应用程序负载均衡方案
现在将更详细地描述Mervlet应用程序环境允许Mervlet引擎12均衡加载一个Mervlet 10来优化Mervlet的性能的特征。
根据本发明的负载均衡方案是基于用户与向服务器32请求Mervlet的用户客户端设备30的交互。更详细地说,Mervlet引擎12的PolivyMervlet模块66使用客户端用户接口(“UI”)的事件等待时间的测量来优化对Mervlet 10的感知性能。根据本发明的Mervlet应用程序环境允许基于事件等待时间的负载均衡在应用程序请求时间和应用程序运行时间执行。
模型负载均衡方案允许两种类型的优化:应用程序准备和网络切换。应用程序准备策略允许服务器确定Mervlet在网络上的哪个节点运行。网络切换策略允许发出请求的客户端或服务器选择用于服务器和客户端之间通信的新的接入网络。该模型允许开发人员创建用于负载均衡算法的大类。
为了说明利用负载均衡方案可能得到的性能优化,图7示出了客户端设备上用户接口事件的时间线。在用户与Mervlet交互期间,用户在思考和等待时间之间切换。在每次思考时间T结束后,用户向Mervlet发送请求并且等待回复。Mervlet通常在一个循环中等待从用户发出的请求。在接收到请求后,Mervlet可以执行计算和数据访问来完成用户的请求。然后它将回复送回。图7所示的时间线完成了一次这样的交互作用。
等待时间W是与处理请求有关的时间。等待时间W可以分解为通信时间C和服务器计算时间S。通常,在与应用程序交互时,用户感受到的是基于等待时间均值和方差。因此,当等待时间大约低于预定阈值时,Mervlet的性能可以得到优化。根据本发明的负载均衡方案可以通过将服务器上的Mervlet重新部署到更接近用户或者适时地切换客户端和服务器之间的接入网络来优化用于Mervlet的等待时间的均值和方差。
为了Mervlet 10的负载均衡,Mervlet引擎12的PolicyMervlet模块66使用包括性能属性52和系统属性54的应用程序属性集50,图8中对它们进行了汇总并且下面会更详细地描述。
3.1Mervlet的性能属性
用于Mervlet 10的负载均衡的应用程序属性50包括性能属性集52,它基于两个标准表现Mervlet:1)应用程序如何交互,和2)应用程序的计算性和数据访问强度如何。直观上讲,开发人员想提供能将交互式应用程序转移到更接近用户,将高强度数据应用程序转移到更接近数据源,以及允许高计算强度的应用程序转移到象服务器级的更强大的设备上运行的系统。通常,开发人员编写J2EE上的服务器应用程序,如JSP和Servlet,或者客户端的小应用程序(applet)之类的Java应用程序。例如,一个人通常编写游戏applet和基于服务器应用程序的银行业应用系统。相反,Mervlet开发人员只需要编写一次应用程序,然后PolicyMervlet 66可以利用测量到的性能属性52将Mervlet 10重新部署到更接近用户或者切换接入网络来提供更好的用于Mervlet的等待时间的均值和方差。
3.1.1表征Mervlet交互
更具体地说,用户在与客户端设备30交互和向Mervlet 10请求信息时等待事件,例如,当他们传递(post)web页表格并且点击URL请求信息时。这些动作,包括填写表格等待响应的动作和点击链接获得页面的动作都被称作用户接口事件。当Mervlet 10在客户端设备30上运行时,所有的等待时间W都花在应用程序上。如果Mervlet 10由客户端设备30从远程在服务器32上执行,那么一部分等待时间W用在与发出请求的客户端通信上,即C,而其余的等待时间用在Mervlet自己处理客户端请求上,即S。
为了Mervlet 10的负载均衡,Mervlet应用程序环境为每个表格和向它发送请求的URL测量Mervlet的下列性能属性:等待时间W的均值和方差,服务器计算时间S和通信时间C。
例如,基于客户端的HTML可以翻译所有从客户端上的浏览器到Mervlet的“get”和“post”。这个由Mervlet引擎的InterceptingMervlet模块处理。当执行“get”和“post”时,获得第一个时间标记T1。当“get”和“post”返回并且在浏览器上显示Mervlet生成的回复时,获得第二个时间标记T2。另外,Mervlet的回复消息包括一个指示服务器计算所用时间的参数值S。因此,可以得到下列计算:
W=T2-T1;和
W=S+C,其中
S=服务时间;
C=计算时间;
W=等待时间;
T1=第一时间标记;和
T2=第二时间标记。
服务器32维护分别用A(S)、A(C)、A(W)、和V(S)、V(C)和V(W)表示的服务计算时间、等待时间和通信时间均值和方差的运行平均值。另外,为用于发出请求的客户端和服务器之间通信的每个接入网络计算参数W和C均值和方差的运行平均值。
如果参数C和S是连续随机变量,那么可以假设下列关系式:
A(W)=A(C)+A(S);和
V(W)=V(C)+V(S)+Cov(V,S),其中
V和S的统计协方差=Cov(V,S)。
此外,如果V和S是统计上独立的变量,那么,可以拥有下面的关系:
V(W)=V(C)+V(S)
因此,用于Mervlet的负载均衡策略可以通过减小A(C)和V(C)提高用户对Mervlet的感知性能。
例如,实现应用程序准备优化的算法框架可以通过验证A(W)是否大于预定阈值来确定Mervlet的等待时间W是否不可接受。另外,通过验证A(C)是否大于A(S)来确定通信时间C是否对等待时间W有可感觉得到的影响。如果不能接受W并且可以感觉得到C,那么算法会试图将Mervlet重新部署到另一个设备上。相反,继续在当前设备上运行Mervlet。
同样,可以用来实现网络切换优化的算法框架确定Mervlet 10使用第一接入网络的平均等待时间A(W-网络1)是否大于使用第二接入网络的平均等待时间A(W-网络2)。如果是,算法会切换到第二网络network2与Mervlet进行通信。
本领域技术人员会识别出利用性能属性52可以对Mervlet 10负载均衡实施其它优化算法。负载均衡方案向应用程序设计者提供了机会来创建不同算法提高用户体验和优化用户接口事件的感知性能。
3.1.2表征服务器计算时间和数据访问
如上所述,服务器计算时间S用来测量Mervlet为客户端应用程序的一个请求生成回复所用的全部服务时间。Mervlet可以用服务器计算时间S来执行内部计算和访问外部数据文件,即:
S=D+I,其中
S=服务时间;
D=用于数据I/O的时间;和
I=用于内部计算的时间。
为了获得表示服务器计算时间的值S,当服务器上的Mervlet引擎为了响应客户端应用程序的请求而调用Mervlet的方法“Service()”时,启动服务器上的计时器。当Mervlet生成对请求的回复时,计时器停止。用计时器的持续时间测量出服务器计算时间S。Mervlet引擎的I/O库作为工具记录用在数据I/O的时间D,和数据I/O率,DTP。可以从上面的公式计算用在内部计算的时间I。
Mervlet引擎还可以利用服务器上的计时器记录运行完成时的Mervlet平均总时间,TotalTime。Mervlet的开发人员可以使用这些参数来细化下面会更详细讨论的负载均衡算法。
3.1.3性能属性工具
下面是利用J2ME库解释Mervlet用户接口和文件I/O事件的APl集的范例。这些API需要对java.net、java.io和java.util进行如下修改。
为了解释所有http请求,通过修改java.net来确定用来测量包括等待时间W、服务器计算时间S和通信时间C的Mervlet 10的用户接口事件的性能属性52。下面的方法用来收集有关基于表格和URL处理的HTML的信息,如上所述:
Void recordEvent(EventType et,Event e,TimeStamp t) |
利用该方法可以记录带表格的每个请求/回复对,并对表格中的所有事件计数。
另外,提供下面的方法用于数据文件的读和写:
Void_recordFileIO(AccessType type,int data,Timestamp time) |
参数AccessType的数据类型可以是读或写类型。该方法将测量到的性能属性写入文件。
3.2系统属性
PolicyMervlet 66除了应用程序属性50外,还使用系统属性54作负载均衡和网络切换决定。系统属性54通常与Mervlet应用程序环境使用的计算设备的资源和处理能力有关。更具体地说,如图8所示,为每个客户端30和服务器32记录如下属性:MIPS等级、CPU使用的均值和方差、内存和持续存储器的大小、以及设备所用每个网络类型的网络等待时间和带宽的均值和方差。
3.2.1通过仪器操作的系统属性
为了测量系统属性54,用于J2ME平台的新库java.sys.perf使用下面的方法:
Void System_cpu_util(Util U) |
方法System_cpu_util(Util U)读取UNIX上的/dev/kern,以获得UNIX系统上的CPU使用信息。本领域技术人员会识别出其它操作系统上出现的类似调用。
Void System_network_bandwidth(bandwidth b,accessnetwork a) |
方法System_network_bandwidth(bandwidth b,accessnetwork a)利用接入网络“a”确定客户端30和主服务器32之间的网络带宽。通过从客户端30向主服务器32发送大小S已知的包,回收相同大小的包,然后用包的大小S除以它接收包的时间来计算带宽。为了更加精确该计算,最好在操作系统中执行。
Void sys_network_load_latency(accessnetwork a,latency l) |
方法sys_network_load_latency(accessnetwork a,latency l)利用互联网控制消息协议(ICMP)确定网络等待时间。客户端周期性地向服务器发送ICMP包并且利用返回值保持已过去的等待时间的平均值。系统管理员可以利用该操作的执行设置频率。
Void Network_uptime(Netuptime nu,accesslink a) |
方法Network_uptime(Netuptime nu,accesslink a)确定客户端和服务器之间的网络连接有效时的时间百分比。如果ICMP包返回,那么系统假设网络有效,否则无效。
3.3应用程序属性的收集和分发
为了决定负载均衡,所测量的应用程序属性必须对负载均衡算法有效。应用程序准备优化从服务器上运行。网络切换优化可以从服务器和客户端运行。有很多方法可以使服务器和客户端动态概括应用程序属性。
例如,可以通过服务器上的负载均衡算法从客户端的消息获得发出请求的客户端的系统属性。服务器可以存储它自己的系统属性。
客户端可以根据当前正在运行的Mervlet应用程序在本地保持关于A(W)、A(C)、A(S)、V(W)、V(C)和V(S)的信息。在思考期间,客户端上另一个独立的应用程序可以收集不同网络上的A(C)信息。这种操作最好以能量守恒方式并且不使客户端电池过载的情况下执行。通过跨每个网络接口为Mervlet增加A(S)和V(C)来为每个网络收集A(W)。每个测量到的A(W)值可以存储在用于应用程序准备和网络切换决定的向量中。
作为选择,客户端可以从利用同一个基站或接入点与服务器通信的公共网络上的其它客户端收集A(C)信息。W、C和S可以按每个应用程序或每个用户每个应用程序测量并且存储在客户端的高速缓存中。客户端的高速缓存可以通过,例如服务器与其它客户端同步。假设服务器知道哪些客户端共享同一个接入点或基站。服务器会汇总共享同一基站的所有客户端的信息。然后客户端高速缓存按照系统管理员设置的频率被周期性地发送到服务器。系统管理员设置周期。服务器汇总数据并且当客户端请求时向客户端发送该信息加平滑间隔。平滑间隔是表示后续负载均衡优化之间必须经过的时间的预定值。
客户端的高速缓存还可以在客户端之间直接同步。在这种情况下,每个客户端通过特定网络,如蓝牙、IRDA或802.11b向其它客户端广播高速缓存的信息。这种广播信息不用通过客户端和服务器之间的通信网络传播。客户端自己汇总数据。系统管理员可以修改平滑间隔或者客户端可以实施分布式一致算法来统一平滑间隔。
只要Mervlet在服务器上运行,服务器就可以获得Mervlet的包括所测量的等待、通信和服务器时间的均值和方差的性能属性。系统管理员可以选择在有足够多有关性能属性的测量数据使用动态概述之前Mervlet必须运行的次数,例如10次反复。
3.3.1收集模式
Mervlet的性能属性值可以按每个用户或每个应用程序每个用户或每个设备每个应用程序每个用户来收集。如果一个设备按照每个应用程序测量和存储性能属性,那么负载均衡算法可以使用这个独立于用户的信息。另外,为了允许负载均衡算法调整到不同用户的概述,一个设备可以按照每个应用程序每个用户测量和存储性能属性。
可以期望最小化与记录事件机制关联的额外开销。因此,收集性能和系统属性从内存和处理角度来看应该是非干扰的。由于用来存储每个应用程序属性的数据所需的存储器相对很小,因此向存储器写入该数据和读取系统时钟应该是非干扰的。例如,假设用户接口事件发生在500毫秒到大约1秒,那么支持大约1毫秒粒度的系统时钟的一个Mervlet应用程序环境的Java实现允许测量与事件有关的用户接口时忽略额外开销。
3.4负载均衡算法
Mervlet应用程序环境可以根据它的应用程序属性和系统属性利用两种不同的优化:应用程序准备和网络切换,在应用程序加载时和运行时均衡加载一个Mervlet。具体地讲,当用户请求一个Mervlet时,Mervlet引擎的PolicyMervlet模块将决定在哪运行Mervlet和使用哪个接入网络通信。同样,在运行时,Mervlet引擎可以决定重新部署Mervlet或切换接入网络来提高用户的感知性能。
但是,本领域技术人员很容易识别出下面讨论的负载均衡优化可以用于其它移动应用程序环境并且不仅限于Mervlet。例如,开发人员可以创建名叫Aglet的应用程序来向远程浏览器或其它可以跨网络从一台机器移植到另一台机器的应用程序提供内容。一个Aglet可以有允许Aglet将它自己发送到URL中指定的另一个机器的方法“dispatch(url)”。Aglet系统中的设备可以有系统数据库中存储的等待时间的均值和方差的列表。一个Aglet可以通过系统库访问该信息并且允许自己编写任何策略来选择运行的机器。例如,可以为负载均衡在Aglet系统上实现下面程式化的编码列:
DispatchPolicy(){If(A(W))>Aglet_Threshold)thenDispatch(URL);} |
在这种情况下,A(W)是Aglet的平均等待时间,URL是浏览器机器上Aglet运行时的URL。利用这个方法,Aglet可以1)保留在当前机器上,或者2)将自己转移到浏览器所在的机器上。
3.4.1应用程序准备优化
接下来参见图9,利用判定树显示应用程序准备优化的实现实例。该应用程序准备算法从服务器上运行并且等同于在合适的加载时和运行时的应用程序,如Mervlet。
应用程序准备算法是基于包括平均通信时间C和服务器计算时间S的Mervlet 10的平均等待时间W或其它可重部署的应用程序。通过将Mervlet10从服务器32转移到发出请求的客户端设备30,可以将通信时间C减小到大约为0。首先,在步骤50,该算法利用从请求获得的有关客户端的信息确定从Mervlet请求信息的客户端是否有足够的存储器来运行。同样,在步骤52,该算法确定客户端是否有足够的由它的MIPS等级衡量的处理能力来运行应用程序。
接下来,在步骤54,该算法决定由它的CPU使用衡量的服务器上的计算负载是否大于预定的负载阈值。另外,在步骤54,它还确定与将Mervlet从服务器转移到客户端关联的重新部署的额外开销是否小于预定的RO_Threshold值。可以利用系统管理员设置的关系根据Mervlet的大小来计算重新部署的额外开销。如果两个条件都满足,那么在步骤56,该算法指导服务器将Mervlet转移到它要在上面执行的客户端。这个序列当服务器变得太忙不能及时处理Mervlet时通过将Mervlet转移到客户端来帮助提高对Mervlet的感知性能。
否则,在步骤58,该算法确定Mervlet的平均等待时间是否大于预定的AW_Threshold值。在步骤58,如果满足该条件,并且由平均等待时间和平均通信时间之差衡量的平均服务器计算时间小于预定的AS_Threshold值,并且重部署额外开销小于预定的RO_Threshold值,那么在步骤60,该算法指导服务器将Mervlet转移到它要在上面执行的客户端。当在客户端上重新部署Mervlet使得Mervlet用户接口事件的等待事件太长时,只要随转移的服务器计算时间不太大,该步骤就有助于提高Mervlet的感知性能。
作为选择,如果平均等待时间大于预定阈值并且平均通信时间大于平均服务器计算时间,那么算法可以确定重新部署Mervlet。
同样,在步骤62,该算法确定Mervlet的等待时间的方差是否大于预定VW_Threshold值。如果满足该条件并且按等待时间方差和通信时间方差之差衡量的服务器计算时间的方差小于预定的VS_Threshold值,并且重新部署的额外开销小于预定RO_Threshold值,那么在步骤64,该算法指导服务器将Mervlet转移到它要在上面运行的客户端。当在客户端上重新部署Mervlet使得Mervlet用户接口事件的等待事件太长时,只要随转移的服务器计算时间不太大,该步骤就有助于提高Mervlet的感知性能。否则,在步骤66,在服务器上运行Mervlet。
作为选择,如果A(S)比A(C)小得多,那么应用程序准备算法可以在自己的决定中忽略A(S)。否则,如果S与C几乎相同,那么可以使用比例系数SF来估算设备上的A(S)。SF是服务器上的SpecInt除以设备上的SpecInt所得的比值,其中SpecInt是用来比较处理器速度的已知基准。
本领域技术人员可以识别Mervlet准备算法可以使用等待应用程序的等待时间的其它实现方法。例如,其它方法可以省略比较等待时间均值和方差的步骤。
3.4.1.1在请求时间的应用程序准备
当在服务器32接收到来自客户端设备30对Mervlet请求时,该请求具有下面的结构:
URIMIPS Rating for ClientMean and Variance of CPU Utilization for ClientAvailable Device Memory and Persistent Storage for Client(smoothed over a time period){Performance Attributes,Data Size for Application} |
Mervlet 10的性能属性存储在客户端30的文件中并且由Mervlet URI索引,对用户是可选的。
然后服务器32上的PolicyMervlet模块66查询服务器自己的性能数据库并且检索下面的数据:
Mean and Variance of CPU Utilization for ServerMean and Variance of Network Bandwidth and Latency for Each Access LinkAttached to Server{Performance Attributes,Data Size for Application} |
应用程序准备算法可以利用从客户端30或服务器32或它们的组合获得的应用程序属性选择运行Mervlet 10的设备。
如果服务器32试图均衡加载一个新的Mervlet或者其性能属性不是最新的Mervlet,那么它可以从网络上最近运行Mervlet的另一个设备获得性能属性的值。作为选择,服务器32可以为存储它的类似设备和网络上类似应用程序使用缓存的性能属性值。系统管理员设置最新的标准。
3.4.1.2运行时的应用程序准备
为了均衡加载当前运行的Mervlet,发出请求的客户端30确定它的性能是否已经下降到特定阈值以下,然后将该信息发送到服务器32。具体地讲,当Mervlet 10在服务器32上执行,并且客户端30从远程访问它时,客户端监视来自客户端所有用户接口事件的等待时间的均值和方差。如果A(W)或V(W)达到预定阈值,那么客户端30向服务器32发送包含下面信息的消息:
MIPS Rating for ClientMean and Variance of CPU Utilization for ClientAvailable Device Memory and Persistent Storage for Client(smoothed over a time period){Performance Attributes} |
然后,服务器32确定Mervlet 10是否应该在客户端30上运行。如果是,Mervlet和它的性能属性被转移到客户端。服务器可以在它停止运行和重新部署之前存储Mervlet的状态,以便让客户端能够利用存储的状态继续回复它的执行。
3.4.2网络切换优化
图10示出了利用判定树的网络切换算法的实现。该网络切换算法可以在Mervlet应用程序环境中的服务器32和客户端30上运行。假设客户端和服务器可以利用多个接入网络通信,为了降低等待时间的均值和方差,网络切换算法可以切换接入网络。用户可以从服务器32或另一个设备在客户端设备30上安装不同的网络切换算法。
首先,在步骤70,网络切换算法利用当前的接入网络确定Mervlet的平均等待时间是否大于预定的AW_Threshold值,并且Mervlet的平均通信时间是否大于预定的AC_Threshold值。如果满足这些条件并且网络切换的额外开销小于预定的SO_Threshold值,那么在步骤74-82,网络切换算法将试图切换接入网络。可以利用系统管理员设置的关系根据Mervlet的大小计算网络切换的额外开销。否则,在步骤72保持当前接入的网络。
接下来,在步骤74,该算法为跨所有可接入网络的应用程序计算等待时间的均值和方差。然后它为可接入网络组确定最小的等待时间的均值和方差。在步骤76,如果最小的平均等待时间小于预定的AW_Threshold值并且只有一个接入网络NN与它匹配,那么在步骤78,该算法指导设备切换到接入网络NN。
在步骤80,如果最小平均等待时间小于预定的平均阈值并且两个以上的接入网络与它匹配,那么在步骤82,算法从具有最低等待时间方差的确定组中选择要接入的网络。否则,在步骤84,如果切换接入网络的条件都不满足,那么仍然使用当前的接入网络。
作为选择,如果该算法找到了其平均等待时间比当前使用的接入网络的平均等待时间小预定的阈值T-meantime的接入网络,那么该算法可以切换接入网络。如果所有接入网络的平均等待时间大致相同,但是出现等待时间的方差比当前使用的网络的等待时间的方差小预定阈值T-varianceMeanwait的网络,那么该算法可以切换到该网络。
3.5利用平滑
利用平滑是一种能够在负载均衡期间防止系统颠簸的技术。更具体地说,Mervlet应用程序环境只允许每个时间周期T有N个网络切换事件。这些参数可以随系统的个性化实现而改变,并且可以由网络的系统管理员设置。下面的客户端算法可以用来确定网络切换算法的平滑间隔。
每个客户端都有一个由与它同级的每个客户端在时间周期T内制作的切换列表。可以动态创建同级组并且可以从服务器请求它。每当客户端切换网络时,它都利用特定网络向邻居广播信息。当且仅当时间周期T中的切换事件次数小于N时才运行切换算法。但是,当链接本身失败时,可以配置改算法立刻切换网络。作为选择,服务器可以存储一张最近制作的切换列表并且将该信息发送给每个请求应用程序属性更新的客户端。
4.容错方案
Mervlet应用程序环境允许系统管理员利用下面两种组件选择系统应该容忍的故障类型:能够从故障恢复的Mervlet引擎12和保证传送中的消息带至少一次语义传递的可靠的发消息系统20。可靠的发消息系统20可以配置如下:不容错、可以从客户端和网络故障恢复、和可以从客户端、网络和服务器故障恢复。
例如,在处理多个客户端请求或服务器的响应时,可能会丢失服务器和UCD之间的网络连接。在重新连接时,如果需要,服务器会自动运行决定算法来确定在哪运行Mervlet。另外,系统管理员能够选择是否需要容错的系统组件。容错具有的性能影响必须与所需的可靠性权衡。根据本发明的容错方法表现了移动系统中基于与组件恢复关联的代价的各种故障以及它关联的代价。然后,它允许系统管理员选择恢复的组件。
本领域的技术人员很容易识别出可以利用具有可恢复应用程序引擎和下面要讨论的可靠的发消息系统的其它移动应用程序环境来实现本发明的容错方案。
4.1可恢复的Mervlet引擎
Mervlet引擎12周期性地在持续存储器上存储它的状态,包括所有当前正在执行的Mervlet 10的列表和每个Mervlet 10最近的Mervlet环境。这个列表还包括每个应用程序的优先级。另外,为了在持续存储器中存储Mervlet应用程序的状态,引擎12可以在任何时候调用Mervlet 10上的方法Save()。
为了重新启动发生故障时在设备上正在执行Mervlet集,Mervlet引擎12可以恢复它自己的状态。Mervlet引擎12一次重新启动在它的列表中的一个Mervlet 10。Mervlet的重新启动顺序可以取决于它们的优先级。当Mervlet在设备故障后重新启动时,Mervlet 10可以利用运行时引擎12注册该方法Restore(ApplicationContext)。数据对象ApplicationContext包括来自确定应用程序的运行时引擎列表的数据和它的环境。该方法Restore(ApplicationContext)可以实现Mervlet指定的恢复操作,包括读取本地通信缓存器的状态来确定客户端30上用于Mervlet的可靠的发消息系统20的通信状态。它还可以查询服务器32上用于Mervlet的可靠的发消息系统20的通信状态。当Mervlet 10已经恢复后,该方法可以把控制还给Mervlet引擎12。
4.2可靠的发消息系统
Mervlet应用程序环境的发消息系统20可以利用各种消息收发协议帮助网络上Mervlet之间的通信和Mervlet本身的传输。例如,已经发现有用的消息收发协议的类型包括单向和可以是同步或异步的请求回复协议。为了保证进行中的事务得到保持,发消息系统20可以是容错的。但是可靠的发消息系统不负责设备故障之后对Mervlet自己的恢复。
更具体地说,图11所示的可靠的发消息系统70包括在客户端一侧用来缓存所有从客户端30向外通信的队列72。用户可以配置缓存器大小。另外,每个消息用唯一的序列号标记并且为每个元素寻找回复。如果没有收到回复,那么重新发送消息直到收到回复。当收到回复后,从系统中释放相应的缓冲消息。
可靠的发消息系统70可以这样实现,回复可以依附于设备的底层操作软件或Mervlet 10的高层事件。对于通常的应用程序通信,在回复依附于底层软件时使用普通的形式。对于系统层可靠的通信,为了降低额外开销,缓存器机制被依附在由Mervlet引擎接收到的请求上。
为了实现可靠的发消息系统70,提供下面的API:
Void Reliable_async_send(Endpoint to,Endpoint From,MessageData Data,ReliabilityType,Callbackmethod cm) |
“to”字段标识接收方。“from”字段标识发送方。“data”字段是要发送的连续数据。“type”是应用程序层或系统层。当收到确认后调用回调方法。利用这个API,系统能够保证一个消息的至少一次传递。
图12示出了可靠的发消息系统70的消息格式。它一共有6个字段,前4个的大小是固定的,数据段的大小是可变的,检验和是可变的并且计算所有的字段。可以利用可靠的发消息系统70通过将Mervlet自己包含在单个消息的数据有效负荷中在网络上重新部署Mervlet。
如图13所示的操作中,在步骤102,每次客户端应用程序通过调用方法Reliable_async_send向服务器上的Mervlet发送一条消息时,在步骤104,客户端30上可靠的发消息系统70就查看在客户端的持续存储器,如闪存或微驱是否有可用的缓存空间。系统管理员设置最大缓存空间为预定值MAX_BUF。如果缓存空间足够可用,那么在步骤106,消息被缓存并且可靠的发消息系统70的缓存器管理器为消息附加一个序列号。所有消息和唯一的序列号一起在两对机器之间发送。一旦消息被缓存,调用可以返回到客户端应用程序。调用直到消息被缓存在持续存储器后才返回到客户端应用程序。当调用返回后,客户端应用程序保证即使客户端设备或网络故障也能够将消息发送到相应的Mervlet。
在步骤108,缓存器管理线程周期性地唤醒和向服务器32发送缓存的消息并且等待前面所发送消息的回复。每个消息都有与它关联的预定的超时值。如果在超时期间没有收到消息回复,那么重发消息。继续该过程直到接收到回复。只有当接入网络连通并且已经建立了到主服务器32的通路才触发缓存器管理线程。
在步骤110,在服务器上接收到请求消息后,系统管理员可以选择可靠的发消息系统70如何处理和向服务器上的Mervlet传递消息。例如,在步骤112,系统可以立即向Mervlet传递消息,然后在步骤114,在持续存储器,如硬盘上存储消息。这样增加了消息不在“安全”状态的时间,但是使得Mervlet可以快速访问消息。作为选择,在接收到消息后,在步骤116,服务器32上的可靠的发消息系统70可以将它记录到持续存储器,然后在步骤118将它传递到Mervlet。接着,Mervlet处理该消息(步骤122)并且生成回复(步骤124)。它还向可靠的发消息系统70发出它已经响应了的信号。在步骤126系统记录回复,然后在步骤128试图将它发送到发出请求的客户端。此时,在步骤130,从服务器上持续存储器的缓存器清除请求消息。
客户端在接收到回复后(步骤132)立即将回复存储在持续存储器的缓存器中(步骤134)。然后,在步骤136,它寻找匹配发送到服务器的请求消息并且从缓存器中将它清除。接下来,在步骤138,客户端试图从客户端应用程序向相应的回收方法传递回复。一旦调用回收方法,就在步骤140释放回复。在步骤120,当从相同的客户端接收到序列号较大的下一个消息时,在服务器上释放回复所用的缓存器。如果服务器收到的消息是重复的,那么就删除它。系统管理员设置确认缓存器的大小为ACK_BUF。
4.2.1寻找到主服务器的连接
可靠的发消息系统70管理客户端设备30和服务器32之间的连接。系统周期性地唤醒和执行下列任务。它查看是否可以通过任何客户端接入网络,如蓝牙、无线802.11b(Wi-Fi)、IRDA和通用分组无线服务(GPRS)移动电话网802.11b来联系主服务器32。它是通过向主服务器32发送ICMPPing来完成的。提供匹配的第一接入网络用于客户端30和服务器32之间的进一步通信。可靠的发消息系统70还唤醒它的缓存器管理线程并且告诉它使用哪种协议与服务器32通信。
4.2.2可配置性
容错的代价在于所有写盘都耗费时间和磁盘空间。接下来参见图14,它示出了实现可靠的发消息系统70的几种配置。第一行描述了消息记录到服务器32和客户端30的技术,第二行描述了只在客户端30记录的消息,第三行描述了不记录消息的技术。前两个选择提供下面可替换的容错。如果一个用户希望降低运行时间的消耗并且想把更多的时间用在恢复应用程序上,那么可以考虑第二种选择。第一种选择由于要将消息记录客户端和服务器,因此消耗的时间较高,但是对用户的好处是利用可靠的发消息系统恢复应用程序更加强健。
4.3处理故障
当服务器32从故障中恢复后,它查看图13中所示在步骤106存储在自己持续存储器上的缓存器列表。可靠的发消息系统70假设设备持续存储器上的数据没有被破坏,但是在设备主存储器上的数据被破坏了。如果列表中包含来自客户端30的消息,那么可靠的发消息系统70假设请求还没有被处理,并且试图将消息传递到服务器上相应的Mervlet。同样,如果服务器32在故障恢复找到了缓存的回复,那么系统将它发送到相应的目标客户端30。
为了从故障中成功地恢复整个Mervlet应用程序环境,使用下面的恢复操作顺序:
1)可靠的发消息系统70达到一致的状态。
2)下面要描述的高速缓存基础结构恢复到一致的状态。
3)Mervlet引擎12达到一致的状态。
4)每个Mervlet 10依次恢复到一致的状态。
5.中断模式计算
客户端设备30可能由于两种原因与服务器32或其它设备发生断开:网络故障或系统管理员或用户主动采取行动,例如,为了降低网络的带宽使用。Mervlet应用程序环境提供两种特征来支持中断操作:异步可靠的消息收发和Mervlet高速缓存。
异步可靠的消息收发允许当客户端和服务器之间不存在网络连接时在客户端30或者服务器32将消息排队。当应用程序发送消息时,如上所述在本地缓存或者排队。只有当建立了网络连接后才发送消息。当重新建立了网络连接后,异步可靠的发消息系统重新发送在缓冲队列中等待的消息。可靠的发消息系统70还可以在持续存储器中存储消息队列,因此可以如上所述容忍设备和服务器的故障。
第二个用于断开模式计算的机制要求在客户端设备30的本地高速缓存中存储Mervlet。如图1所示,高速存储器由高速缓存管理器22管理。即使没有网络连接,高速缓存也可以访问浏览器或其它客户端应用程序。如果客户端30的连接中断,高速缓存上的Mervlet仍然可以服务本地浏览器。另外,本地浏览器仍然可以从本地高速缓存请求Mervlet。
可以用各种方法管理高速缓存,但是最好能允许使用象贮藏(hoarding)之类的技术的智能预取。当服务器对未来Mervlet的访问有更多了解的情况下,Mervlet高速缓存机制允许客户端30向服务器32委托各种高速缓存管理决定,例如合作设置或信息被前摄地(proactively)推进到客户端设备30时设置。因此,可以由客户端30、服务器32或两者结合来设置高速缓存管理策略。在运行时,服务器32可以更新高速缓存的替换,并且为存储在客户端设备30中高速缓存上的每个Mervlet编写策略。
此外,本领域技术人员会识别出如果希望将代码和数据分开对待,那么高速缓存管理器22有能够实现它的高速缓存算法。另外,高速缓存可以在高速缓存管理算法中考虑设备特征和个人用户使用概述。
高速缓存管理器22的一种实施是调用pre_fetch类上的方法来实现预取,调用cache_miss类上的方法来实现对高速缓存失败的处理,以及调用cache_write类上的方法来实现向高速缓存写数据。
预取操作可以是服务器初始化或客户端初始化的。对于服务器初始化的预取,服务器32向回送高速缓存状态向量的客户端30发送一条预取通知。然后服务器向客户端发送一套新的文档集和可选的新的替换策略。服务器32还请求在客户端设备30上运行Mervlet 10。当Mervlet 10在客户端30上执行后,它向服务器32回送高速缓存状态向量。然后服务器32向Mervlet 10发送一套高速缓存对象集和一个替换策略。接着,Mervlet10回调服务器32为新的替换策略加载类。
为了处理高速缓存丢失,客户端30上的高速缓存管理器22向主服务器32发送一个表示文档丢失和当丢失发生时本地高速缓存状态向量的请求。向量包括高速缓存的大小和自从服务器上次更新后高速缓存散列表的任何变化。主服务器32回送被请求的文档。它还可以回送其它预取文档和一个替换策略。客户端30在它的高速缓存上使用这个新的替换策略。下面是说明该方法的伪码:
Void handle_cache_miss()Send(primary_server,hash_vector_diff,uri);Receive(cache_objs,new_policy)if(new_policy)load_class(new_policy);Return; |
如果客户端30为它的高速缓存请求一个新Mervlet 10的列表,那么,服务器32将它们回送并且提供一个可选的替换策略。客户端将再次前摄下载实现替换的新类。
可以利用从服务器22下载的新类由高速缓存管理器22修改客户端30上用于本地高速缓存的写策略。对于高速缓存中的每个元素,服务器32可以附加一个当对象被迫离开高速缓存时如何处理脏的或所写对象的策略。因此,高速缓存系统的配置可以选择系统是否执行高速缓存。这是一个动态或运行时的选择。另外,高速缓存系统本身在三个区域是动态可扩展的:替换策略、预取策略和修改的数据管理策略。
虽然在此参考特定的实施利描述和解释本发明,但是本发明不局限于这些说明性的实施例。在不脱离所附权利要求定义的本发明的真正范围和精神的前提下,本领域技术人员认识到各种变化和修改。因此所有这些变化和修改都将包括在本发明的所附权利要求范围内。