具体实施方式
本发明涉及到方法、系统以及计算机程序产品,它们通过在开发一个或多个应用程序时提供单个编程模型用于访问并使用多个不同的消息传输,从而简化了可靠的消息传递应用程序开发。本发明的实施例可由包括各种计算机硬件的专用或通用计算机组成,,这将在下文详细讨论。
图1描述了可靠的消息传递栈100a和100b的高级表示。在消息传递栈中,如果没有可靠消息传递协议125,当应用程序105期望把消息发送至如另一应用程序层185时,它将把一条消息或一系列消息115直接传送至数据报消息传递层140。(注意应用程序105可以是任何形式的应用程序,如服务,且通常应被理解成适当地包含应用程序框架。)由于数据报不可靠,因此消息115可能被重复、延迟和/或丢失。例如,在具有防火墙且忽略可靠性(fire and forget reliability)的可靠性较低的数据报协议中,消息即消息115会因各种原因丢失,包括因为处在传输160和165间的中间135。相应地,对方端点应用程序185将永远都无法接收消息即消息115,发送应用程序105无法知晓消息115是否已接收。
然而,根据本发明的示例实施例,向可靠消息传递栈100a和100b提供了可靠的消息传递协议125。相应地,例如,可靠消息传递框架120(也可以是180)可以确保从应用程序105发送的消息即消息115正确地到达其目标端点。例如,如果应用程序105期望把消息115传输至其会话对方应用程序185,可以发送()消息115至可靠消息传递框架120,在可靠消息传递框架120中将消息分配给会话并给出消息序列号。会话标识符对应于应用程序105和应用程序185之间的会话通信。换言之,会话是指两个应用程序105和185之间的双工会话。序列编号对应于会话通信中的特定消息。例如,在两个应用程序105和185之间传递的单个会话中可能有多个消息,每一消息都以应用程序的发送顺序循序编号。另外,在应用程序105、185以及其它可能的应用程序间可以建立多重会话(每一建立的会话可以具有相同或不同的传送保证)。相应地,为每一消息分配唯一的会话和序列号,来标识特定的会话和会话中消息的顺序。
在写入关于消息191的会话和序列头部并执行了其它所需信道处理后,消息191被储存在发送缓存的会话状态190中。然后,消息191的副本通过数据报消息传递140传输,数据报消息传递140通过提供如路由头部而便于消息191的端对端传输。消息191接着可能通过一个或多个中间物被传输,如通过中间物135,每一中间层将消息191的端对端传输简化为一系列的点对点传输。可以使用可延伸的侦听机制来实现如路由、滤波、政策管理以及安全等行为。必须注意,消息传递端点和中间物140、175、150上可用的传输145、170、155以及行为或者可以通过编程建立,或者可以通过配置建立。
如果为应用程序105指定了至少一次传送保证(下文将详细描述),可靠消息传递框架120就期望接收来自可靠消息传递框架180的确认,表明哪些消息被正确接收。消息192携带表明消息191(如序列中的消息5)已被接收的确认。周期性地,如果可靠消息传递框架120没有接收到确认消息192,或者由于可靠消息传递框架180没有正确接收到副本,或者由于120没有接收到任何来自180的确认,则重新发送消息191。相应地,如果消息191被如中间层135丢失、延迟或者误传,可靠消息传递框架120就继续(在超时时间段内,后文将描述)周期性地发送消息191,试图确保消息191的至少一个副本被可靠消息传递框架180正确接收。然而,必须注意,由于同消息191相类似的原因,确认192可能被丢失、延迟或者误传。在这一情况下,本发明提供了确认消息192的可靠消息传送,将在后文描述。
一旦可靠消息传递框架180成功接收到消息191的副本,它就把确认消息192发送至可靠消息传递框架120。在接收到确认消息192后,可靠消息传递框架120就从其会话状态(发送)缓存190中删除消息191的副本,并停止对其继续发送。类似地,可靠消息传递框架180在其会话状态195中记录它已接收到消息191的副本,使得可以丢弃可靠消息传递框架180接收到的任何重复消息,不管该消息是否已被传送至应用程序185。接着,应用程序185可以通过其接收()命令从会话状态(接收)缓存195中检取已接收的消息。如果可靠消息传递框架120由于丢失、延迟或者误传而没有接收到确认192,则继续重新发送消息191,由此引发可靠消息传递框架180发送确认192的另一副本。这一过程将继续直至可靠消息传递框架120接收到至少一个确认192或可靠消息传递框架120放弃重试并向应用程序105发送错误指示为止。
可靠消息传递框架120和/或180可以根据本发明各自被配置为对话200(图2),如结合图2的更详细描述。对话200是一种消息框架抽象,其中,服务(或应用程序实例)使用对话200与其它服务进行可靠的面向会话的通信。程序员可以使用对话通道220来访问对话。此外,对话200提供了可靠的消息传递架构和单个编程模型,其中对应用程序的消息传送保证可配置。必须满足这些可靠性保证,否则将出现会话失败。对话200的设计使得相应的运行时刻实现具有灵活性来提供附加特征,所述附加特征以维持为应用程序实现断言的保证(正确性约束)为条件。特别地,可以向应用程序提供各种程度的可用性和可伸缩性,它们对应用程序的实现来说是透明的。而且,应用程序105和185之间的这些会话通信可以通过各种传输类型(如TCP/IP 160和HTTP 165)、传输连接实例和网络拓扑来实现。
对话200提供的可靠性保证包括至少一次(ALO)、至多一次(AMO)以及顺序(IO)传送。也提供了附加的会话生存时间(TTL)保证。AMO保证确保了对于发送应用程序发送的任何消息而言,消息将至多一次被传送至接收应用程序。由于对话200是一种抽象,因此如果重复消息会破坏应用程序语义,则应用程序无需检测并丢弃会重复消息。类似地,ALO保证使得发送应用程序发送的所有消息都能被接收端点接收到,这令应用程序无需检测丢失或误传的消息并协调其重发。IO保证使得消息以发送应用程序发送的顺序被传送至接收应用程序。这令应用程序无需处理消息的无序接收。
对话200也提供了会话TTL保证,这要求伙伴端点双方间的对话会话在会话TTL到期之前完成。如果会话TTL在对话会话完成之前已经到期,则将对话通道置于错误状态并向应用程序提供错误通知。应用程序可以通过重新协商TTL来延长会话TTL。
对话使得这些消息传送保证或者可以单独使用或者可以以任何形式组合使用,来满足给定应用程序和部署的特定要求。例如,三种AMO、ALO和IO保证的组合提供了对于大多数可靠通信机制典型的恰好一次的顺序传送,如TCP/IP。然而,与典型的通信机制及其相应的编程模型不同,这些保证可以定制,而无需改变应用程序使用的编程模型。
对话200不仅允许可配置的保证,还允许本地可靠消息传递特性可以独立于彼此、并且独立于以上所选的保证而被选择并配置。这些本地可靠消息传递特性划分为两个不同类别:对编程模型完整的类别和涉及独立于应用程序的定制的类别。例如,完整型本地特性包括:已办理缓存,其具有应用程序的一致性、单独以及可分性语义;或者模板(profile)参考,其将模板同会话相关联,以允许独立的定制。可定制的本地特性包括:会话状态存储配置、缓存限额、发送超时、可配置的消息TTL、会话优先级消息或有害消息检测阈值,后文将进行描述。
根据本发明的示例实施例,对话200提供会话状态和消息存储作为可替代的组件,称为对话存储260。由于对话存储260是可替代的,因此第三方可以独立地创建并部署对话存储260的实现。管理员可以选取在给定安装中实际使用的对话存储。相应地,这一机制具有很大的灵活性以满足持久性、性能、独立性和管理目标。对话存储260可以是可插式存储,至少包括内存中存储、盘上持久存储、端口监控进程存储、非易失内存存储、光学存储、磁带、网络附加存储或可移动存储的其中之一。而且,对话存储可以是远程或非节点的。
根据本发明的示例实施例,提供了一种内存中对话存储实现(如对话存储260),它可以将所有状态保存在应用程序内存中。该存储提供了对状态的快速访问;然而,其代价是如果应用程序进程状态丢失(如应用程序被用户终止,由于如应用程序错误被操作系统终止,或被其中应用程序执行失败的系统所终止),则所有的状态都将丢失。
根据本发明的另一示例实施例,快速对话存储实现(如对话存储260)将状态保存在独立专用的端口监控进程内存中。该对话存储确保状态能幸免于应用程序进程失败,然而,其代价是必须进行进程切换来保存状态。如果端口监控进程失败或者操作系统或计算机节点失败,则其负责的会话的所有状态都将丢失。
根据对话存储实现(如对话存储260)的还有一实施例,会话状态信息以持久方式被维持在数据库中,比如在结构化查询语言(SQL)服务器中。这个持久状态可以幸免于计算机节点或操作系统失败,然而,其代价是必须进行磁盘写操作来维持状态。使用如SQL服务器这样的数据库系统来维持状态的好处是安装可能已在适当位置具有工具、技术以及进程,用于对重要应用程序状态进行常规的备份和恢复。
本发明也提供了为了在本地计算机节点或另一节点上运行而配置的一些对话存储。例如,持久对话存储,如SQL服务器,可以被配置为使用本地服务器数据库或另一节点上的服务器数据库。另一节点可以是群集系统的一部分,因此具有很高的可用性。
本发明还使得多重存储(或存储配置)可以同时存在,来满足应用程序(多个)所使用的特殊部署特性。而且,可以修改应用程序配置来使用不同的存储(或存储配置)以便适应如负载或容量增加这样的变化,利用新存储选项的优点或着重突出其它部署环境的考虑因素。此外,同一应用程序中的不同通信会话会具有不同的配置要求。对话使得每一会话可以单独配置。例如,应用程序中一些会话可能在持久状态存储中运行最好,然而其它会话可能在易失性状态存储中运行最好。对话存储可以通过模板(下文描述)来配置,或者以应用程序代码来指定。
对话200所提供的另一可配置特性是缓存限额。对话200在发送端和接收端应用程序中缓存消息。这种缓存提高了两个应用程序的独立性,使得任一方即使在另一方未运行或不可获取时,如由于网络分区问题,都能够向其本地缓存发送或接收消息。例如,即使当另一方暂时不可用,如未运行或不可获取时,应用程序205也可以继续发送消息。该特性通过将消息累积在本地发送缓存250中直到可以成功传输而实现。类似地,即使当发送消息的应用程序目前未运行时,应用程序205也可以接收先前在接收缓存245中缓存的消息。对话200提供了可配置缓存限额,该限额定义了可由系统缓存的最大消息数(视消息尺寸而定)。相应地,这限制了对话状态235消耗的空间,并限制了其它端点可消耗的本地资源。这一特性也允许消息传递系统保存空间,使应用程序足以本地缓存指定的消息数。对话200还提供了最小缓存限额,该限额定义了由消息传递架构缓存的最小保留的消息数,同最大消息尺寸一起定义了由消息传递架构缓存的最小字节数。缓存限额可以通过模板(后文描述)来配置或以应用程序代码来指定。
对话200也提供了可配置的发送超时特性。当发送消息时,该消息被置于对话存储260/发送缓存250中。如果缓存已满,即,已达到缓存限额,则对发送()的调用被阻塞,直到或者发送超时,或者缓存中的空间变为可用以保存消息为止。当消息成功传输至接收端点并得到其确认,且本地端点不再需要该消息来重试时,此时缓存中的空间变为可用。如果在发送超时之前空间已变为可用,则发送()210调用正常地完成。如果在空间变为可用之前发送超时已到期,则引发一个异常,通知应用程序该消息无法被成功缓存(捕捉)。相应地,应用程序可以稍后重试。可配置的超时使得应用程序可以根据阻塞的简单性选择不同程度的响应。发送超时可以通过模板(后文描述)来配置,也可以应用程序代码来指定。
如上所述,对话200支持端对端的会话TTL保证。对话200也提供了可被配置为本地特性的任选的消息生存时间。消息TTL要求发送的消息必须在TTL指定的时间内被接收端点成功接收,否则将向应用程序205引发错误。对话200还为消息TTL提供了可配置的延长。相应地,当TTL到期时,向发送应用程序205提供通知。然后,应用程序205可以选择终止对话或延长消息的TTL。同发送超时类似,TTL可以由应用程序代码设定,也可以用模板间接地配置。
对话200提供的另一特性是分配的任选优先级。对话200中的所有消息都具有相同的优先级。然而,当来自多重对话的消息可用于发送时,在发送消息时,较高优先级的对话将优先于较低优先级的对话。类似地,当消息可用于“传送”至接收应用程序时,较高优先级的消息优先于的较优先级的消息而被接收。优先级可以由应用程序代码所设定,也可使用后文描述的模板来间接地设定。
对话200还提供了消息的任选办理的缓存。当对话用于事务处理时,本地发送和接收缓存作为事务性的资源管理器。在这一情况下,事务处理中接收到的消息被视为是事务处理结果的暂时传送(从接收缓存中被删除)。类似地,事务处理中发送的消息被视为事务处理结果的暂时捕捉(被添加到发送缓存)。如果事务处理确认,这些暂时的消息捕捉和传送就变为永久性。如果事物处理中止,则放弃这些暂时的操作,就如从未发生过。同其它事务性资源管理器类似,对话存储负责为暂时缓存操作(如捕捉的消息在事务处理外是不可见的)提供事务性的独立,并在事务管理器的控制下提供相对事务完成的事务可分性。
事务性缓存简化了正确消息传递应用程序的开发(如即使在失败或并发活动时都可作出正确的状态变化)。应用程序可以使用这一特性来协调消息交换和本地消息处理。例如,应用程序可以在事务处理的范围内接收并处理消息。这一消息处理可以包括读取并更新一个或多个事务性数据库,以及在事务处理包含的对话中发送一个或多个消息。如果事务处理中止,则所有的工作都未完成。特别地,暂时发送的消息被丢弃——即,会话对方不会看到这些部分结果——且接收到的消息仍然可用于传送。后者允许在新事务处理的范围内处理消息。当事务处理确认时,所有行动变为永久性的,包括删除接收到的消息和缓存发送的消息。净影响是恰好一次消息处理。事务性缓存是一种本地对话特性,因为应用程序是否使用该消息对其会话对方应用程序来说是完全透明的。
根据示例实施例,并如下文结合图2的描述,在发送端点处当调用发送()210时,消息被暂时置于对话存储260中。如果事务处理确认,则消息被提交至存储260,并变为可用,用于发送至对方端点。如果事务处理中止,则丢弃该消息。在接收端,当调用接收()215(或删除)时,消息暂时从对话存储260中被删除。如果事务处理确认,则消息永久从存储260中被删除。如果事务中止,则消息留在存储260中并可用于重新传送。办理接收允许消息的恰好一次处理。
应该注意,尽管已办理缓存是排队系统的常见特性,但是这些系统通常需要持久存储。对话200提供了这些相同的事务语义而不考虑对话存储260的持久性,并且在所有情况下提供了相同的程序模型。例如,内存中存储通过作为事务性资源管理器参与而提供了事务语义。然而,对话200允许应用程序实现独立于部署细节,包括与传输和连接特征、消息路由以及端点状态管理相关的细节。
对话200提供的另一特性是任选有害消息功能。如上所述,当在事务处理中接收并且处理消息后,该事务中止,消息仍保留在对话存储260中,并且可用于重新传送至应用程序。有时造成事务中止的原因是瞬变的,如,由于死锁产生的超时,则传送和消息处理在下一次尝试中将能成功。如果对于给定消息的传送尝试反复引起中止,则该消息被视为“有害”。对话200提供了一种方法来配置消息传送中止多少次以后消息可视为有害。当检测到有害消息时,向应用程序引发错误,停止对该消息处理的进一步尝试,直到应用程序采取纠正措施为止。这能确保进程资源不被浪费在永远不会成功或仅在一些干预下才会成功的尝试上。有害消息检测可以通过模板(后文描述)来配置,也可以应用程序代码来指定。
任选的模板特性提供了对话配置选项的命名集合。如上所述,对话有很多可配置特性,如缓存限额、超时、存储等等。而且,对话200提供了可配置的消息传送保证,如ALO、AMO和IO,应用程序代码可以独立指定所需的最低级别的传送保证,这可以在需要时通过配置而增加。模板提供了一种组合共用对话设置的方法,并通过名称来引用这些设置。而且,对话200的实现允许通过应用程序配置文件来选择模板,因此管理员可以对设置进行部署时间控制。当创建或接受对话时,应用程序根据名称来引用模板,该模板中指定的所有设置都用来创建对话200。设置可以作为应用程序的一部分,如代码,而被直接建立,或者作为其它编程结构被建立。模板可以通过代码或其它编程结构间接地同程序相关联,使得模板值可以独立于应用程序而被设置。直接建立的模板值优先于通过模板引用间接设定的模板值。
由于对话200提供这些特性和保证的任意组合,它们相互独立,因此对话200可以被配置为满足任何耦合配置,从类似于传输控制协议(TCP)和远程过程调用(RPC)的紧耦合编程模型,到类似于数据报和队列的松耦合编程模型。另外,对话200有效地支持各种双方消息交换模式(MEP),如单向、半双工(从单个请求/响应到更复杂的模式)以及最复杂的全双工交互。因而,对话200考虑到双方通信编程模型的统一。
图2根据本发明的示例实施例描述了对话200的操作特性。对话通道应用程序编程接口(API)220作为应用程序205的抽象。如上所述,对话200采用消息传递协议,如Web服务可靠消息传递(WS-RM),它定义了消息序列。序列定义了会话中的一组单向消息。两个这样的序列组合在一起以形成一个对话,通信双方之间每个方向上有一个序列。当调用通道200方法发送()210时,作为参数传输至发送方法210的消息被储存在发送状态250中,并根据消息发送的顺序唯一地标上单调递增的消息序号。
消息255在发送状态250中被缓存以维持序列中关于单独消息255的状态。在这一点上,可以说消息在状态250中“被捕捉”,发送()210返回至应用程序。更特别地,发送方法210接受一个消息作为参数。该消息被传输至发送缓存250被标上序列号,相继或同时被储存在存储260中。此刻消息被认为“被捕捉”,发送方法210返回。对其它消息重复这一调用可以产生消息255的全部或部分序列。
对话状态235包括发送和接收缓存,分别为250和240。对话状态235控制并存储像对话标识符、应用程序指定的保证以及对方端点地址这样的常量信息。对话状态250还控制像下一输出传输序列号和确认状态这样的会话信息。而且,像对话TTL、超时、存储位置等配置数据被保持在对话会话状态235中。
一旦消息被捕捉,协议270就对其进行处理并相应地通过端口285发送已捕捉的消息,如消息275。对话200的编程模型和运行时刻架构提供了一种灵活和有效的端点分辨模型。
该模型至少确保两个端点充分被分辨出来,以提供可靠消息交换。特别地,协议270可以在传送对话中的初始消息用于处理之前,确保双方端点都具有足够的参考,从而通过对话200及其相应的会话保证端点唯一性以及消息的正确相关的参考。这需要用于,如确保消息被可靠地传送至单个会话对方,以便确保至多一次传送。该端点分辨可以基于多重因素,包括标识由对话200的创建者所使用的对方应用程序的标识符(如通用资源标识符(URI))、本地配置、消息头部中的路由数据、中间配置以及目标应用程序配置。
必须要注意的是,应用程序的实现205不需要涉及对话端点分辨的细节。对话200的架构执行分辨进程来协调初始端点,以确保该端点是会话唯一选择的对等端点。这一步骤根据需要完成,并且对于应用程序实现205来说是透明的。
也可提供对话200的运行时刻端点分辨来确保达到消息传送目标,而同时提供了在大范围网络配置中实现正确执行的灵活性。该特性支持应用程序在各种配置中的灵活部署,着重突出可伸缩性、可用性、安全性(如防火墙)以及性能需求。服务部署配置包括,如,应用程序场(farm)(如超过尺寸范围的复制品)以及应用程序分区(如根据用户号码或者地理区域进行分区处理)。应用程序场和分区可以单独使用,也可以一起使用。例如,应用程序可以部署为使用至应用程序分区的数据相关路由,应用程序分区又包括应用程序服务器的场(farm)。
协议270也确定应用程序205指定了哪种端对端保证和本地特性,独立于上文描述的执行端点分辨的方法。如果应用程序205指定了ALO保证,则协议270在对话的发送缓存250中保存消息275的副本,直到协议270从接收端(未示出)接收到表明消息275被正确接收的肯定确认为止。当协议270从接收端接收到肯定确认时,它就在会话状态235中记录这一事实,并从发送缓存250中删除该消息。如果协议270在指定的重试时间超时内没有接收到肯定确认,则用相同的消息序号重新发送同一消息275的副本。对话200可能重复这一进程多次,并可采用重试定时补偿策略来避免网络上进一步的阻塞。如果在消息TTL指定的时间内没有接收到确认,则引发一个错误,通知发送应用程序205无法满足保证。
当接收到对话消息280时,协议270复制接收缓存状态240中的消息。协议270还记录下一预期的消息序号。当接收到消息280时,如果对话200保证包括AMO,则将到达消息280的消息序号与之前到达的消息序号集合进行比较,消息序号集合如上所述被储存在接收缓存状态240中。如果该集合中已经包含了匹配的序号,则认为消息280是重复的并将其丢弃;否则,则将消息280置于本地接收缓存240中用于进一步的引用。
如果保证包括ALO,则协议270在接收到消息280后向对话的对方端点发送未排列的完整选择性肯定确认。该确认必须包含会话中目前已接收的所有消息的序号。可以使用简写符号来保存消息空间,该简写符号包括序号范围的集合。
如果指定的保证不包括IO,则消息280立即可用于通过接收通道220被“传送至”接收应用程序205。特别是,向应用程序205发送消息可用于接收的通知。然后,应用程序205可以调用接收()215,于是把可用于传送的下一消息传递到应用程序205,并且称为发生“传送”。
如果指定了IO保证,则将到达消息280的序号同下一预期的序号进行比较。如果序号小于下一预期的序号,则丢弃到达的消息280。如果两者匹配,则到达消息280立即可用于传送至接收应用程序205,并且把下一预期的序号设为下一丢失消息的序号。如果序号大于下一预期的序号,则还指定了行为是否取决于ALO保证。如果未指定ALO保证,则消息280立即可用于传送至接收应用程序205,并将下一预期的序号设为到达消息280的序号加1。如果指定了ALO保证,则消息280不可用于传送至接收应用程序205,而是保留在接收缓存240中。因而,如果两者不匹配,则假定至少有一个具有较低序号的消息还未接收到。当所有这类丢失的较低序号的消息都到达时,则消息的连续范围可用于以正确顺序传送至接收应用程序,并将下一预期的序号设为下一丢失消息的序号。
如上所述,当消息可用于传送至接收应用程序205时,向应用程序205发出通知。然后,应用程序205可以在对话通道220上调用接收()方法215来接受下一可用的消息传送。接收()可以被多次调用,从而依次接收每一可用的消息。为了保证顺序而连续地传送事件通知。因而,当消息可用于传送至应用程序205时,通过调用先前向对话200事件注册的应用程序代码来向应用程序205传送单个事件通知。在对应用程序代码的调用返回之前,即使其它消息可用于传送,也不会作出对该应用程序代码的其它调用。在该应用程序代码中,应用程序205通常调用对话接收()215来接收下一可用消息。
如上所述,当调用发送()210时,将当前发送缓存250中的消息数同指定的缓存限额进行比较。如果消息数超过了限额,则调用者者发送()210根据一事件而被阻塞,直到或者空间变为可用,或者超出发送超时为止。当发送缓存250的空间变为可用时,缓存检测是否还有调用者等待发送消息,如果有,则调用者发送()210解除阻塞,并且能够再次发送消息。
对话200的所有状态——包括那些在缓存250和240的状态、在通道220中的状态以及在协议270中的状态——都可以同时被保持在对话存储260中。对话存储260应该包含最新的信息。这确保对话状态235具有对话存储260的持久性属性,并使得所有的特性都无需考虑正在使用的存储260而起作用。例如,将消息280置于接收缓存240中可能涉及对存储260的磁盘写入。为了提供保证,仅在消息已被记录到存储260之后才发送确认。这可以确保,如任一发送端或接收端始终都持有消息的副本。类似地,在发送端,发送()210仅在消息已被记录到存储260中以后才完成。
如上所述,对话260可以是可插式存储,允许极大的灵活性以满足持久性、性能、独立性和管理目标。例如,存储260可以从单个框架中的多个存储中选取,包括以下:内存对话存储实现,其将所有状态保存在应用程序内存中;快速对话存储实现,其将状态保存在独立专用的端口监控进程的内存中;或者持久数据库存储实现,如结构化查询语言(SQL)服务器。同一应用程序205中的不同对话可使用不同的存储。此外,本发明还提供了一些对话存储260,它们可配置为运行于本地计算机节点或另一节点上。
由于对话200充当代表应用程序205的代理,因此使应用程序与连接变化隔离。这允许如批处理形式,其中应用程序开始、发送和接收一些消息,然后退出而无需等待其它端点响应或甚至可用。而且,消息传送可以仅以很大的灵活性来调度,仅需服从于满足各种传送保证和本地特性,如消息或会话TTL。例如,根据传送保证,对话200可以独立于应用程序205,在某一时间段(负载平衡)传播峰值消息负载、或将消息传送转移至一个更具成本价值的时间上、等待资源变为可用、补偿消息或对话优先级等等。另外,存储260还为应用程序205提供了关闭及重启能力。批处理、调度以及应用程序关闭和重启能力提高了系统的可用性和可伸缩性。
另外,如上文所述,应用程序205可以指定发送()210或接收()215操作关于对话缓存250和240而分别被处理。这使得应用程序可以,如在一个或多个对话上接收消息、发送消息、并在单个事务中更新应用程序表。在对事务的这一使用上,这只是本地概念,并不涉及其它端点。
对话也提供了运行时刻的错误恢复,可以自动恢复(屏蔽)许多错误265,而不涉及应用程序的实现。应用程序可以依赖接收为对话200的寿命断言的特征(即断言的保证和特性)。如果对话200的架构或者协议270确定不再能满足断言的特征,则将对话置于错误状态,并引发错误事件,允许独立于干线应用程序代码甚至应用程序205的带外纠正行动。如果错误265可以纠正(修复),对话就可以被置回服务中。不可恢复的错误,即无法修复的错误,会引发对话200的终止和应用程序通知。这一设计符合“失败快速(fail-fast)”模型,这是可靠应用程序开发的基础。
可存活的失败可以包括以下失败:破坏、丢失、重复或延迟的消息;传输和网络失败;进程失败;中间层和系统失败。如上所述,由于对话200为应用程序提供了抽象并维持其自身的缓存和存储,因此对话200也支持具有间歇连接性的应用程序和环境。对话也可以适应于变化的环境,如网络拓扑、重新协商的安全环境或端点重定位的变化。
对话200可以通过如重发消息来自动尝试自我修复这些错误。或者可以向第三方,如系统操作员或诊断代码发送请求,请求协助修复错误。这些协助可以是,如为了修复网络中中断连接的简单人为介入,或可能是一个自动的修复进程。在任何情况下,一旦错误已修复,对话200就可以继续发送消息。这一特性同其它可用性特性一起允许长时间存续的对话。然而,如果错误无法由对话200或者通过一些其它第三方介入来修复,则必须向起动该对话的应用程序205引发错误消息。
应用程序可以被配置为使用对话存储260,使得对话可以跨过应用程序进程失败和重启而被维持。一些存储260可以额外地容许系统失败和重启。
其它传输错误可以由指定域错误处理器和上述基本消息重发支持的组合来自动处理。示例包括由安全证书或者政策过期引发的错误。如果在安全会话上发送的消息由于证书过期而产生错误,那么对话200可以重新同安全证书协商并清除对话错误。当对话进程得以继续,根据标准重试进程将使用更新后的证书重新发送所缓存的消息。
同样如上所述,对话200的设计及相应的架构使得运行时刻能令对话200动态地适应变化的执行环境。这一特性对应用程序透明,并支持长时间存续对话的存在以及高度可用的应用程序。
上述错误处理器(可以是可插式的)、发送和传送重试以及错误和修复模型的组合使得对话可以适应于很多环境变化。这些变化包括但不限于,政策变化(如消息政策)、协议变化(如对新的安全协议的支持)、网络拓扑变化(如路由器或防火墙的增加或删除)、改变已部署的应用程序来处理增加的负载(如引入应用程序场和/或分区)、以及对话端点和相关状态的重定位(如灾难恢复)。也可考虑到可伸缩的部署选项,包括从非常小到非常大的支持。例如,对话200支持按比例放大、按比例缩放(scale-out)、应用程序复制或分区,同样对应用程序的实现是透明的。
图3描述了对话200的生命周期和状态。对话200可以处于两个主要状态中的一个,活动状态320或不活动状态360。如果对话200处于活动状态320,则对话通道对象位于内存中,否则对话200是不活动状态360,对话200仅存在于对话存储260中。通过去激活350和重新激活340进程来管理系统资源,可以手动或自动进行。例如,如果应用程序调用Dispose,则手动地进行去激活350,或者不活动时间而自动地进行,在不活动时间中,一段时间逝去,其中在对话通道上没有交换任何消息。这类通道可以被去激活(将相应的对象从内存中释放),从而释放内存资源使其可用于其它事物。
如果应用程序从对话管理器(未示出)请求通道,则手动地进行重新激活340,或者如果新消息到达会话,则自动地进行重新激活340。每一对话在对话创建310期间由对话管理器分配一个唯一的ID。该ID由应用程序205根据重新激活340请求传送至对话管理器,对话管理器使用该ID来定位对话状态并重新起动通道。去激活350和重新激活340接口使得系统可以限制系统资源,所述系统资源与发送输出消息或处理输入消息未积极使用的对话相关联。这使得架构可以回收相关资源,与对话存储260相关的资源除外。而且,这一设计考虑到的资源调度包括:根据优先级或资源可用性调度消息发送;批处理消息来进行更高效的发送;根据优先级或资源可用性调度消息传送;以及批处理消息传送来获得更高效的处理。
对话的创建310由对话管理器控制,并可由调用创建310函数的应用程序来起动。或者,消息传递系统可以在从另一端点接收到表明需求新对话的消息后起动对话创建310。在这一情况下,系统通知应用程序205对话被请求。然后,应用程序205可以调用对话管理器上的接受(Accecpt)方法来接受该对话请求,并引发对话创建310,也可以调用对话管理器上的拒绝(Reject)方法来拒绝该对话请求。对话管理器也控制拆卸330,拆卸330可以由于多个原因而被起动。原因之一是会话已成功完成,即,双方都完成了发送并没有留下任何消息。拆卸330的另一原因可能是对话200被终止,如,应用程序调用Terminate()函数或从对方端点接收到终止指示。当一方终止对话时,将向另一方发送消息以表明该终止。该消息没有任何可靠性,它仅仅是一种尝试,告诉对方对话已被终止。终止表示对话会话中不会再有进一步的消息交换。
尽管本发明的描述将对话定义为双工通信机制,其中应用程序消息可以由双方会话端点发送和接收,然而另一示例实施例包括了一种单工模型。根据实施例,一个会话端点仅发送应用程序消息,并且不从其对方端点接收应用程序消息,而会话对方端点仅接收应用程序消息,而不发送应用程序消息。同样的可配置保证和可配置本地端点特性可以与在对话中一样应用在单工模型上。实现的不同之处在于,在发送端点不需要接收缓存240,在接收端点不需要发送缓存250。
本发明范围内的实施例还包括计算机可读媒质,来携带或持有储存的计算机可执行指令或数据结构。这类计算机可读媒质可以是任何可由通用或专用计算机访问的可用媒质。作为示例,并非局限,这类计算机可读媒质可以包括RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备,或任何可用来以计算机可执行指令或数据结构的形式携带或储存所需的程序代码装置并可由通用或专用计算机访问的媒质。当消息通过网络或另一对计算机的通信连接(可以是硬布线、无线或者两者的组合)来传输时,计算机适当地将该连接视为一种计算机可读媒质。这样,任何这样的连接都适当地被视为计算机可读媒质。计算机可读媒质的范围也应该包括以上所述的组合。计算机可执行指令包括,如,引发一般用途计算机、特殊用途计算机或特殊用途处理设备执行指定函数或函数组的指令和数据。
图4以及下述讨论将要提供对可实现本发明的合适的计算环境的简要综合描述。尽管不需要,本发明仍将在计算机可执行指令的一般环境下进行描述,计算机可执行指令如程序模块,在网络环境中被计算机执行。一般来说,程序模块包括例程、程序、对象、组件、数据结构等等,完成指定的任务和实现特定的抽象数据类型。计算机可执行指令、相关数据结构以及程序模块代表了执行本发明方法步骤的示例程序代码装置。这类可执行指令的特性序列或相关数据结构代表了实现步骤中描述的功能的相应行动的示例。
本领域技术人员可以理解,本发明可以在具有多种类型计算机系统配置的网络计算环境中实践,包括个人计算机,手持式设备、多处理器系统、基于微处理器或可编程用户电子产品、网络PC、小型机、大型计算机等等。本发明也可以在分布式计算环境中实践,在该环境中,任务由本地及通过通信网络连接(可以是硬布线链路、无线链路、或者两者的组合)的远程处理设备来完成。在分布式计算环境中,程序模块可以同时位于本地和远程内存存储设备中。
根据图4,实现本发明的示例系统包括以常规计算机420形式表示的通用计算机设备,包括处理单元421、系统内存422、以及将包括系统内存422的各种系统组件耦合至处理单元421的系统总线423。系统总线423可以是几种总线结构类型的任何一种,包括内存总线或内存控制器、外围总线和使用任意各类总线结构的本地总线。系统内存包括只读内存(ROM)424和随机存取内存(RAM)425。基本输入/输出系统(BIOS)426,包括如在启动时协助在计算机420内的元件之间传输信息的基本例程,可以储存在ROM 424中。
计算机420也可以包括用于对磁硬盘439进行读写操作的磁硬盘驱动器427、用于对可移动磁盘429进行读写操作的磁盘驱动器428、以及用于对可移动光盘431如CD-ROM和其它光学媒质进行读写操作的光盘驱动器430。磁硬盘驱动器427、磁盘驱动器428和光盘驱动器430分别通过磁硬盘驱动接口432、磁盘驱动接口433和光盘驱动接口434连接至系统总线423。驱动器及其相应的计算机可读媒质为计算机可执行指令、数据结构、程序模块和其它用于计算机420的数据提供了非易失存储。尽管这里描述的示例实施例采用了磁硬盘439、可移动磁盘429和可移动光盘431,也可以使用其它类型的用于存储的计算机可读媒质,包括盒式磁带、闪存卡、数字化视频光盘、Bernoulli盒式磁带、RAM、ROM等等。
程序代码装置包括一个或多个程序模块,可以储存在硬盘439、磁盘429、光盘431、ROM 424或RAM 425中,包括操作系统35、一个或多个应用程序36、其它程序模块437以及程序数据438。用户可以通过键盘440、指示设备442或其它输入设备(未示出)向计算机输入命令,其它输入设备如麦克风、操纵杆、游戏操纵杆、圆盘式卫星电视天线、扫描仪等等。这些以及其它输入设备通常通过同系统总线423耦合的串行端口接口446连接至处理单元421。输入设备也可以通过其它接口连接,如并行接口、游戏接口或通用串行总线(USB)。监视器447或另一显示设备也通过接口,如显示适配器448,连接至系统总线423。除了监视器,个人计算机通常包括其它并行输出设备(未示出),如扬声器和打印机。
计算机420可以在网络化的环境中操作,该环境使用逻辑连接至一个或多个远程计算机,如远程计算机449a和449b。远程计算机449a和449b的每一台都可以是另一台个人计算机、服务器、路由器、网络PC、对等设备和其它公共网络节点,通常包括许多或所有上文描述的同计算机420相关的元件,尽管图4中只描述了内存存储设备450a和450b及其相关应用程序436a和436b。图4描述的逻辑连接包括局域网(LAN)451和广域网(WAN)452,此处作为示例,并非局限。这类常见的网络环境有办公室或企业范围计算机网络、企业内部互联网及因特网。
当在LAN网络环境中使用时,计算机420通过网络结构或适配器连接至本地网络451。当在WAN网络环境中使用时,计算机420可包括调制解调器454、无线链路或用于在广域网452如因特网中建立通信的其它装置。调制解调器454可以是内置的,也可以是外置的,通过串行端口接口446连接至系统总线423。在建立网络的环境中,所描述的同计算机420或其部分相关的程序模块,可以储存在远程内存存储设备中。此处描述的网络连接是示例性的,也可以使用用于在广域网452中建立通信的其它装置。
本发明可以在不背离其精神和主要特征的情况下以其它特定形式来实施。所描述的实施例仅作说明,并非限制。因此,本发明的范围由后附权利要求书来指明,而非前文的描述。所有在等效权利要求意义和范围之内的改变都包含在其范围内。