具体实施方式
前述的现有技术的问题为本发明的原理所克服,本发明针对使用具有同步频率的时钟的可靠的消息通信的方法、系统和计算机程序产品。在一些实施例中,消息目的地处理具有消息ID和存活时间(TTL)值的消息第一副本。消息目的地更新交互高速缓存以指示已经处理过具有该消息ID的消息。消息目的地在处理了消息的第一副本之后,并且在基于TTL值的倒数计时器到期之前,收到消息的第二副本(也具有该消息ID)。消息目的地基于指示先前已经处理过具有该消息ID的一个消息的交互高速缓存,拒收消息的第二副本。
在其它实施例中,消息目的地处理具有交互ID、消息ID和TTL值的消息的第一副本。响应于最后一个基于在已处理消息中指定的TTL值的倒数计时器到期,消息目的地从其交互高速缓存中移除与交互ID相关联的进度信息。消息目的地在倒数计时器到期之后收到消息的第二副本。消息目的地向具有与消息目的地的时钟频率同步的时钟频率的对应消息源发送请求,要求交互ID的进度的指示。消息目的地收到交互已经进展、从而具有该消息ID的消息可被弃置的指示。消息目的地弃置消息的第二副本。
在其它实施例中,消息目的地收到与一个在先的实例ID对应的消息的第一副本。接着,消息目的地在初始化成具有该在先实例ID的消息处理器实例处处理消息的第一副本。消息目的地检测到目的地计算机系统所利用的存储器内容有无意的丢失。消息目的地重新初始化消息处理器实例,使更新的实例ID与在先的实例ID不同。消息目的地在重新初始化消息处理器实例之后收到消息的第二副本,消息的第二副本对应于在先的实例ID。消息目的地拒收消息的第二副本,因为消息的第二副本对应于与更新的实例ID不同的实例ID。
在另外的实施例中,消息源向具有与消息源时钟频率同步的时钟频率的消息目的地发送具有交互ID、消息ID和TTL值的消息第一副本。消息源在发送消息的第一副本之后,向目标计算机系统发送具有交互ID、消息ID和更新TTL值的消息第二副本。更新TTL值是从消息的第一副本中指定的TTL值减去从消息的第一副本被发送起已过去的时间计算出来的。消息源检测到消息TTL到期。消息源更新交互高速缓存以指示消息不再需要确认。
在本发明范围之内的实施例包括计算机可读介质,用以装载或持有存储在其上的计算机可执行指令或数据结构。此类计算计可读介质可以是通用或专用计算计系统可访问的任何可用介质。作为示例,而非限制,此类计算机可读介质可包括物理存储介质,诸如RAM、ROM、EPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备、或任何其它可用于装载或存储计算机可执行指令、计算机可读指令、或数据结构所需程序代码手段、并可由通用或专用计算机系统访问的介质。
在此描述及所附权利要求书中,“网络”定义为实现计算机系统和/或模块之间电子数据的传输的一个或多个数据链路。当通过网络或其它通信连接(有线的、无线的、或有线和/或无线的组合)向计算机系统传送或提供信息时,该连接被恰如其分地表述为术语计算机可读介质。以上各项的组合也应被包括到计算机可读介质的范围之内。计算机可读指令包括例如使通用计算机系统或专用计算机系统执行某个功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制码、诸如汇编语言等中间格式指令或甚至源代码。
在此描述及所附权利要求书中,“计算机系统”定义为协同工作以对电子数据进行操作的一个或多个软件模块、一个或多个硬件模块、或其组合。例如,计算机系统的定义包括个人计算机的硬件组件,以及诸如该个人计算机的操作系统等软件模块。各个模块的物理布局并不重要。计算机系统可包括经由网络耦合的一个或多个计算机。类似地,计算机系统可包括单个物理设备(诸如移动电话或个人数字助理“PDA”),其中各个内部模块(诸如存储器和处理器)协同工作以对电子数据进行操作。
本领域技术人员应当理解,可在网络计算环境中用许多类型的计算机系统配置来实施本发明,这些配置包括,个人计算机、膝上计算机、手持式设备、多处理器系统、基于微处理器的或可编程的消费者电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、等等。本发明还可在分布式系统环境中实施,其中通过网络连接的(通过有线的数据链路、无线数据链路、或通过有线和无线数据链路的结合)本地和远程计算机系统同时执行任务。在分布式系统环境中,程序模块可同时位于本地和远程记忆存储设备中。
在此描述和所附权利要求书中,“消息源”定义为可靠的消息通信交换的起源。消息源既可表示创建了要可靠传送的消息的应用程序,又可表示管理可靠交换的基础结构。在简单对象访问协议(“SOAP”)处理模型中,源是初始发送者。
在此描述和所附权利要求书中,“消息目的地”定义为可靠的消息通信交换的目标。消息目的地既可表示使用消息的应用程序,又可表示管理可靠交换的基础结构。在SOAP处理模型中,目的地是最终的接收者。
在此描述和所附权利要求书中,当消息源和消息目的地的时钟滴答频率在频率的可允许漂移上处于某指定上限之内时,消息源和消息目标具有“同步的时钟频率”。
漂移可以各种不同方式定义。当指全球世界时钟时,偏移可定义为:
偏移=|(S2-S1)-(D2-D1)|/(C2-C1)
并且上限可定义为:
上限=Min(单向等待时间)/Max(TTL)
其中S1和D1分别是在世界时钟有值C1的实例时,源和目的地处的时钟值,且S2和D2分别是在后来世界时钟有值C2的实例时,源和目的地处的时钟值。当漂移<上限时,漂移是可允许的(即,源和目的地时钟可视为具有同步的频率)。
单向等待时间是从目的地到源测量的(例如,如目的地为某未知序列所初始化的“REQACKACK”消息的等待时间所捕获的)。TTS是在某个消息上指定的TTL,诸如往返延迟的倍数。因此,指定消息的较大TTL导致对源和目的地时钟的漂移率有更严格的要求。另一方面,指定消息的较小TTL导致对源和目的地时钟的漂移率有较宽松的要求。
不参考全球世界时钟的情况下,从源的角度出发的漂移可定义为:
漂移-源=(D2-D1)/(S2-S1)
从目的地角度出发的漂移可定义为:
漂移-目的地=(S2-S1)/(D2-D1)
且上限可定义为:
上限=Min(单向等待时间)/Max(TTL)。
以上假设两个时钟都往前走。即,S2>S1且D2>D1。在某些例子中,例如,当目的地时钟走得较快,可能出现漂移-源>1且漂移-目的地<1的情况。当漂移-目的地<上限时,漂移是可允许的(即,源和目的地可视为具有同步的频率)。单向等待时间是从目的地到源测量的。TTL是消息上指定的TTL,诸如往返延迟的倍数。
应当理解,本发明的实施例不要求各时钟同步到绝对时间。
消息通信体系结构
图1示出便于用具有同步频率的时钟的可靠消息通信的计算机体系结构100的例子。如计算机体系结构100中所示,计算机系统102、103、104、106和107连接到网络101。网络101可以是局域网(“LAN”)、广域网(“WAN”)、或甚至因特网。连接到网络101的计算机系统可从计算机体系结构100中所连接的其它计算机系统接收数据或往其发送数据。据此,计算机系统102、103、104、106和107,以及其它连接的计算机系统(未图示),可通过网络101交换消息相关的数据(例如,因特网协议(“IP”)数据报和诸如传输控制协议(“TCP”)、超文本传输协议(“HTTP”)、简单邮件传输协议(“SMTP”)等其它使用IP数据报的较高层协议)。
计算机系统102、103、104、106和107分别包括对应的交互高速缓存122、123、124、126和127。这些交互高速缓存122、123、124、126和127的每一个可维护对应于与其它计算机系统的交互序列的交互ID、和已为每个交互序列所处理的消息的消息ID的列表。这些交互高速缓存122、123、124、126和127的每一个还可为每个消息维护存活时间(“TTL”)值。TTL值可指示源试图向目的地传送消息的持续时间。当在源处TTL到期,源可指示该消息不再需要确认(例如,作为源视其为已丢失的结果)。当在目的地处TTL到期,目的地随即可从交互高速缓存中移除对应的消息ID和/或交互ID(从而释放了系统资源)。
计算机系统102、103、104、106和107分别包括对应的时钟112、113、114、116和117。这些时钟112、113、114、116和117的每一个都具有同步的频率。即,这些时钟在时间上以本质上同样的频率前进。例如,在时钟112、113、114、116和117之间对秒、分、小时、日、月、年等的定义可以有一个共识。因此,即使当多个时钟的绝对时间不同步时,多个时钟之间时间的相对改变可以是一致的。
据此,当某段时间以后第一时钟前进若干分钟时,第二时钟(有和第一时钟同步的频率)会前进同样的分钟数的可能性是极高的。例如,可能第一时钟有绝对时间下午5:05,且第二时钟有绝对时间下午5:07。如果,在6分钟后,第一时钟前进至下午5:11,则第二时钟已前进至下午5:13的可能性是极高的。
此外,应当理解,各时钟的频率相对于彼此可能有一些漂移,而这些时钟仍可被视为具有同步的频率的时钟。例如,当通信中的计算机系统处的时钟之间的漂移率少于通信计算机系统之间的往返等待时间时,本发明的实施例尤其有利。
在某些实施例中,目的地可在源认为某消息(A)已被处理过或(B)已丢失之后,遗忘它已经处理过该消息(例如,通过从存储器中移除某个消息交互)。在实施中,当目的地(从源)收到包含对应消息ID的ACKACK头时可发生事件(A)。在实施中,当TTL到期时可发生事件(B)。即,目的地知道,如果源的TTL到期则源认为消息丢失。在某些实施例中,在最小往返延迟之后消息得到确认(发送消息,接着收到确认)。因此,可将TTL设为某个大于往返延迟的值。在实施中,将TTL设成往返延迟的倍数以支持若干次的重新发送(或设成一无限值以便于恰好一次传送(exactly-once-delivery))。
可能计算机系统107包括从包括计算机系统102、103、104和106处的客户程序等大量客户程序(例如,Web浏览器)接收电子消息的服务器(例如,Web服务器)。因此,计算机系统107可执行处理从这些客户程序中的任何一个所收到的消息的消息处理(例如,消息处理实例137)。
消息源算法
现在参考图6,图6示出使源能够可靠传送消息的方法600的示例性流程图。方法600包括向消息添加交互ID、序列号、和TTL值的动作。例如,计算机系统106可向消息152添加交互ID 152、计数153、和TTL值154。从而,消息可以是消息(ID,N,TTL,数据)的格式,其中数据增加了可靠消息通信基础结构所使用的跟踪信息。
ID唯一地标识消息源和消息目的地之间的交互。消息偏移量N可以是标识消息源和消息目的地之间的互动中某个消息的偏移量(例如,序号)的整数值。交互ID和消息偏移量N在一起可以唯一地标识一个可靠消息。TTL指示消息源将试图可靠传送某消息的持续事件。
方法600包括启动具有TTL值持续事件的倒数计时器的动作(动作602)。例如,计算机系统106可启动具有TTL值154的持续时间的倒数计时器。方法600包括发送消息的动作。例如,计算机系统106(消息源)可向计算机系统107(消息目的地)发送消息151。
可能消息源将TTL值设为消息源和消息目的地之间的往返等待时间的倍数。在某个指定的间隔(例如,等于往返等待时间),消息源可试图重新发送消息(例如,消息151)。例如,如果计算机系统106和107之间的往返等待时间为10毫秒,TTL值可设为60毫秒。将TTL值设为60毫秒将允许至少6次重新发送(取决于具体的间隔)。
方法600包括检测重新发送间隔到期的动作(动作604)。例如,计算机系统106可检测对应于消息151的重新发送间隔到期。
方法600包括判定消息是否已得到确认(判定框605)。当消息已得到确认(判定框605处为是),方法600执行动作607。例如,计算机系统106可从计算机系统107接收指示交互ID 152和计数153的ACK。从而,确认可以是ACK(ID,N)的形式,其中确认指示ID所标识的交互的消息N(或N所表示的一个或多个消息偏移量范围,诸如(1-6,10-14,16))到达消息目的地。当消息源收到ACK,消息源可更新对应的交互高速缓存(例如,交互高速缓存126),以指示某消息(例如,消息151)不再需要确认。
另一方面,当消息未得到确认(判定框605处为否),方法600在判定框606进行判定。因此,方法600可包括判定倒数计时器是否已经到期(判定框606)。例如,计算机系统106可判定基于TTL值154的倒数计时器是否已到期。当倒数计时器到期时(判定框606处为是),方法600执行动作607。另一方面,当倒数计时器还未到期时(判定框606处为否),方法600执行动作608。
方法600包括重新计算TTL值和倒数计时器的动作(动作608)。例如,计算机系统106可在检测到重新发送的间隔之后为消息151重新计算TTL值和倒数计时器。因此,如果初始TTL值为60毫秒且重新发送间隔为10毫秒,则可在重新发送消息151前将新的TTL值设为50毫秒。
方法600包括指示消息不再需要确认的动作(动作607)。例如,计算机系统106可更新交互高速缓存126以指示消息151不再需要确认。因此,计算机系统106在从计算机系统107收到确认之后,或在倒数计时器到期时,终止消息151的任何重发。
消息源可不时地或响应于来自消息目的地的请求而发送确认-确认(ACKACK),以向消息目的地指示消息源不再需要确认。例如,计算机系统106可向计算机系统107发送包括交互ID 152和计数153的ACKACK 171。从而,确认-确认可以是ACKACK(ID,N)的形式,其中确认-确认指示对于ID所标识的交互,消息源不再需要对消息N(或N所表示的一个或多个消息偏移量范围,诸如(1-3,5,8-12))的确认。ACKACK还可包括表示消息目的地处的消息处理器实例的实例ID。例如,ACKACK 171包括对应于计算机系统106已知的消息处理实例137的最后一个实例的实例ID 172。
来自消息目的地的请求可以是指示消息目的地需要交互的进度的请求确认-确认消息(图1中未示出)。由此,请求确认-确认可以是REQACKACK(ID)的形式,其中请求确认-确认指示消息目的地在继续进行之前需要ID所标识的交互的进度。源可周期性地和在收到REQACKACK(ID)时,向目的地发送ACKACK(ID,N)。
消息目的地算法
现在参考图7,图7示出使目的地能可靠传送消息的方法700的示例性流程图。方法700包括接收消息的动作。例如,计算机系统107可接收消息151(动作701)。方法700包括判定收到的实例ID(如果有的话)是否匹配当前的实例ID。例如,计算机系统107可判定实例ID 172是否匹配消息处理实例137的当前实例ID。计算机系统106可选择性地在消息151中包括实例ID 172(未图示)。但是,可要求计算机系统106将其包括在它响应于REQACKACK所发送的ACKACK消息中。例如,在收到消息151之后,计算机系统107可向计算机系统106发送REQACKACK(交互ID 152)。计算机系统106可以ACKACK(交互ID 152,消息偏移量(可能和计数153不同),实例ID 172)响应。
当收到的实例ID不匹配当前实例ID(判定框702处为否),方法700执行动作708。另一方面,当收到的实例ID匹配当前实例ID时(判定框702处为是),方法700进行判定框703处的判定。
方法700包括判定消息是否需要确认(判定框703)。例如,计算机系统107可判定消息151是否需要确认。计算机系统107可检查交互高速缓存127以判定是否先前曾收到过消息151的ACKACK。如果先前收到过ACKACK,消息151不再需要确认。可能交互高速缓存127不包括交互ID 151所标识的交互。因此,计算机系统107可向计算机系统106发送REQACKACK(交互ID 151)。响应于此,计算机系统107可从计算机系统106收到对应的ACKACK。计算机系统107可用ACKACK中的进度信息(例如,消息偏移量和实例ID)更新交互高速缓存127。
方法700包括发送确认的动作(动作704)。例如,计算机系统107可向计算机系统106发送包括实例ID 152和计数153的ACK 161以确认收到消息151。
方法700还包括判定是否要处理消息。例如,计算机系统107还可判定是否要处理消息151。当不要处理消息时(判定框705处为否),方法700执行动作708。另一方面,当要处理消息时(判定框705处为是),方法700执行动作706。
方法700包括启动倒数计时器的动作(动作706)。例如,一收到消息151,计算机系统107可启动基于TTL值154的倒数计时器。计算机系统107必需维护交互ID 152和计数153,直至计数器到期,或收到对应的ACKACK。方法700包括处理消息的动作(动作707)。例如,计算机系统107可向消息处理实例137传送消息151,消息处理实例137进而处理该消息。
方法700包括更新交互高速缓存的动作(动作709)。例如,计算机系统107可更新交互高速缓存127。交互高速缓存可在收到ACKACK(例如,ACKACK 171)之后更新,或者在倒数计时器(例如,基于TTL值154)到期之后更新。因此,计算机系统107可刷新交互高速缓存127中倒数计时器已到期且交互ID已空闲了一段时间的交互。
方法700包括弃置消息的动作(动作708)。例如,计算机系统107可弃置消息151。当实例ID不匹配时,先前收到消息的ACKACK时,先前已处理过该消息时,或某消息的倒数计时器已到期时,消息可被弃置。
消息源和消息目的地相互操作
方法600(消息源的角度)和方法700(消息目的地的角度)可相互操作以提供可靠的消息通信。在某些实施例中,在处理初始消息序列之前先设立各种预设条件。例如,消息源接收唯一地标识消息目的地端点实例(例如,消息处理实例137)的端点引用,且呈送给消息目的地端点实例的各消息之间的相关性是有意义的。每当消息目的地端点实例被初始化时,目的地可复位实例ID(例如,无状态引导时间)。此外,消息源可以还知道消息目的地的策略(如果它们存在的话),并且能够按此构造遵守任何策略的消息(例如,在WS-Metadata Exchange的帮助下)。此外,当要求安全消息交换时,消息源和消息目的地可建立安全的上下文(例如,在WS-SecureConversation的帮助下)。
甚至在当目的地从存储器周期性地移除可靠的消息通信序列信息时,其它保护可靠的消息通信序列信息的机制也是可能的。例如,消息目的地可用私钥(例如,属于某公钥/私钥对)加密会话密钥(或共享密钥),并向消息源发送该加密的会话密钥(例如,在令牌中)。消息源收到令牌并可保留该令牌供稍后使用。消息源还可用对应的公钥(属于某公钥/私钥对)将加密的会话密钥解密,以揭示未加密的会话密钥。交互中的后续消息可用此会话密钥来保护。
消息目的地可能不时地收到该消息目的地已经遗忘(即,交互ID等已从对应交互高速缓存中移除)的某个交互的消息。响应于此,消息目的地可向消息源发送REQACKACK,请求该交互的跟踪信息。响应于REQACKACK(可能包括在ACKACK中),消息源可向消息目的地发送先前收到的该交互的令牌。消息目的地可解密该令牌(它知道其自身的公钥/私钥对)以揭示对应于该交互的未加密会话密钥或共享密钥。交互中所包括的后续消息可用此会话密钥来保护。
当消息源不能提供某交互的令牌时(并因此不能提供对应的会话或共享密钥),消息目的地启动具有新的交互ID和消息ID为1的新的交互。消息目的地可随即向消息源发送新的令牌,为新的交互建立新的安全环境。由此,本发明的实施例可用于减少,或可能防止,可靠消息通信会话被截取的可能性。
此外,还可建立各种协议的变体,以确保可靠的消息通信。例如,消息源可将消息偏移量(N)初始化到1,并为交互中每个后续的消息将消息偏移量增加1。此外,确认可包括消息目的地成功地收到的、或者ACKACK中指定的除未收到的消息的消息偏移量以外的每个消息的一个或多个范围。因此,消息源发布的ACKACK可包括每个已收到ACK或TTL已到期的消息的一个或多个消息偏移量的确认范围。当TTL到期,目的地知道源认为消息(或某些范围的消息)已经丢失。因此,目的地可关闭对该消息(或该范围消息)的消息范围的确认。
因此,当在各种不同条件下收到消息的多个副本时,确保对消息处理实例进行至多一次传送。例如,当消息ID和对应的指定交互在消息目的地处的某个交互高速缓存中维护时(在TTL到期之前或之后),当消息ID(可能还有对应的指定交互)已被刷新出消息目的地处的交互高速缓存时,及当消息目的地遭受无意的存储丢失时,确保了至多一次传送。
当消息目的地处收到消息时,消息目的地判定所收到的消息是否包括实例ID。如果收到的消息不包括实例ID,并且该消息所指定的交互ID未在交互高速缓存中出现时,消息目的地向消息源发送REQACKACK。消息源以包括实例ID的ACKACK(基于所建立的协议变体)来响应。所收到的实例ID(无论是包括在消息中或ACKACK中)是向消息源指示为先前某个时间的对应消息处理器实例的当前ID(基于所建立的预设条件)的实例ID。消息目的地将收到的实例ID与对应消息处理器的当前ID相比。当收到的实例ID和当前ID不匹配时(可能指示消息目的地在指定交互期间遭受无意的存储丢失),则拒收该消息,并且使指定的交互失败。
另一方面,当收到的实例ID与当前ID匹配时(因此消息目的地在指定交互期间维护了交互高速缓存),检查来自收到的消息的其它跟踪信息。消息目的地检查对应的交互高速缓存以判定所收到消息的消息ID和交互ID是否先前被处理过。因为消息目的地可能周期性地刷新对应的交互高速缓存(但不一定立即在TTL值到期后立即刷新),交互高速缓存甚至可为过期的消息维护跟踪信息(至少某段时间)。因此,对应的交互高速缓存可指示消息先前被处理过,作为所收到的消息被传送到消息处理器实例的结果。当对应的交互高速缓存指示所收到的消息先前被处理过时,所收到的消息被弃置。
但是,可能对应的交互高速缓存不包括消息的跟踪信息。当对应的交互高速缓存不包括跟踪信息时,消息目的地向消息源发送REQACKACK。例如,可能所收到的消息先前被目的地处理过。如果对于所收到的消息所指定的交互ID,跟踪信息没有在目的地交互高速缓存中出现,则对于消息目的地处所有是指定交互的-部分的消息,倒数计时器肯定已经到期。否则,目的地消息处理器不可能已经将指定交互从其交互高速缓存中刷新掉。这指示消息的倒数计时器在消息源肯定也已经到期,因为消息源将在发送消息之前启动倒数计时器,并且消息源和消息目的地具有同步的时钟频率。
在消息源处,或通过接收先前的ACK,或通过倒数计时器到期,消息源指示(在返回的ACKACK中)不再需要对该消息的确认(即使最后在倒数计时器到期之前已发送了该消息)。消息目的地接收ACKACK,并将来自该ACKACK的跟踪信息与消息中所包括的跟踪信息对比。因为ACKACK指示不需要对该消息的确认,所以消息目的地弃置该消息。
图2示出便于在消息ID在消息目的地的交互高速缓存中维护时的可靠消息通信的第一个示例性消息流程。当在TTL到期之前收到消息的第二副本时,消息流程200确保至多一次传送。
如消息流程200中所示,源201和目的地202交换电子消息。可能源201是计算机系统102、103、104和106中的一个,目的地202是计算机系统107。源210和目的地202具有以同步的时钟频率203前进的时钟。因此,源201和目的地202处的时间值的相关改变是一致的可能性极高。例如,如果在某段时间以后,源201处的时钟前进了10分12秒,则在同一段时间以后目的地202处的对应时钟也前进了10分12秒的可能性极高。
消息流程200包括消息源201(例如,Web浏览器)发送消息204的动作。消息204包括交互ID 214、消息ID 224、存活时间(TTL)值234和数据244。交互ID 214将消息204标识为对应于消息源201和消息目的地202之间的某个指定交互。消息ID 224标识消息204在作为指定交互(对应于交互ID 214)的一部分所交换的消息序列中的位置。数据244是一部分要传输到目的地202处的某个模块(例如,消息处理器实例236)的数据(例如,应用程序数据)。TTL值234指示源201将试图传送消息204的时间长度。
基于TTL值234,消息源201可设置计时器持续时间241的计时器239。
消息目的地202(例如,Web服务器)可接收消息204。一收到消息204,消息目的地202可向消息处理器实例236传输数据244,消息处理器实例236进而处理数据244。可更新交互高速缓存237以指示消息204已被处理。例如,可更新交互高速缓存237以指示已为交互ID 214所标识的交互处理了具有消息ID 224的消息。基于TTL值234,计时器249可设置计时器持续时间251。计时器持续时间251在计时器持续时间241之后的某时到期(例如,至少再过消息204的消息等待时间)。
消息目的地202可发送包括交互ID 214和消息ID 224的ACK消息208以指示消息204已被处理。但是,消息源201可能没有收到ACK消息208(例如,由于连接消息源201和消息目的地202的网络上的通信错误)。因此,当重新发送间隔到期,消息源201可向消息目的地202发送消息204的一个额外副本。如TTL值235所示,消息源201可为消息204重新计算TTL值,令其为到计时器239到期的所剩时间。
消息目的地202可在处理消息204的较早版本以后接收消息204的额外副本。消息目的地202可从交互ID 214和消息ID 224标识消息的额外副本。消息目的地202可检查交互高速缓存237并判定具有消息ID 224并对应于交互ID 214所标识的指定交互的消息(即,消息204)是否先前被处理过。由此,消息目的地可基于指示具有该消息ID 224的消息先前已被处理过的交互高速缓存237,弃置消息204的额外副本。
消息流程200还可在TTL到期之后收到消息的第二副本时确保至多一次传送。例如,TTL值234可替换地使计时器239设置计时器持续时间242,并使计时器249设置计时器持续时间252。计时器持续时间252在计时器持续时间242之后的某个时间到期(例如,至少再过消息204的消息等待时间)。
因此,如图2中所示,消息目的地202可在计时器持续时间252到期之后接收消息204的额外副本。但是,消息目的地202可在将交互ID 214和消息ID 224从存储器刷新掉之前等待一些时间。因此,当收到消息204的额外副本时,交互高速缓存237仍然包括交互ID 214和消息ID 224,即使消息持续时间252已经到期。因此,消息目的地202可基于指示具有消息ID 224的消息先前已经被处理过的交互高速缓存237而拒收消息204的额外副本。由此,在交互高速缓存维护消息ID时确保了至多一次传送。
图3示出便于在消息ID被从消息目的地的交互高速缓存中被刷新掉时可靠地处理消息的第二个示例性消息流程。消息流程300在对应消息偏移量已从存储器刷新掉之后收到消息的第二副本时确保至多一次传送。
如消息流程300中所示,消息源301和消息目的地302交换电子消息。可能源301是计算机系统102、103、104和106中的一个,消息目的地302是计算机系统107。消息源301和消息目的地302可具有以同步的时钟频率303前进的时钟。因此,消息源301和消息目的地302处的时间值的相对变化一致的可能性极高。例如,如果在某段时间之后,消息源301处的时钟前进了8分24秒,则在同一段时间之后消息目的地302处的对应时钟也前进了8分24秒的可能性极高。
消息源301(例如,Web浏览器)发送消息304。消息304包括交互ID 314、消息ID 324、存活时间(TTL)值334和数据344。交互ID 314将消息304标识成对应于具有消息目的地302的指定交互。消息ID 342标识消息304在作为指定交互(对应于交互ID 314)的一部分所交换的消息序列中的消息序列位置。数据344是一部分要传送到消息目的地302处的某个模块(例如,到消息处理器实例336)的数据(例如,应用程序数据)。TTL值334指示消息源301将试图传送消息304的时间长度。
基于TTL值334,消息源301可设置计时器持续时间341的计时器339。
消息目的地302(例如,Web服务器)可接收消息304。一收到消息304,消息目的地302可向消息处理器实例336传送数据344,消息处理器实例336进而处理数据344。可更新交互高速缓存337以指示消息304已被处理。例如,可更新交互缓存337以指示已为交互ID 314所标识的交互处理了具有消息ID 324的消息。基于TTL值334,计时器349可设置计时器持续时间351。计时器持续时间351在计时器持续时间341之后的某个时间到期(例如,至少再过消息304的消息等待时间)。
消息目的地302可发送包括交互ID 314和消息ID 324的ACK消息308以指示消息304已被处理。但是,消息源301可能没有收到ACK消息308(例如,由于连接消息源301和消息目的地302的网络上的通信错误)。因此,当重新发送间隔到期,消息源301可向消息目的地302发送消息304的额外副本。消息目的地302从消息源301接收消息304的额外副本。如TTL值335所示,消息源301可为消息304重新计算TTL值,令其为计时器339到期所剩的时间。
计时器持续时间351到期之后,消息ID 324(及还可能有交互ID 314)被从交互高速缓存337刷新掉。如消息流程300中所示,消息304的额外副本在计时器持续时间341到期之前从消息源301发送,并在计时器持续时间351到期之后在消息目的地302收到。在消息ID 324(及还可能有交互ID 314)从交互高速缓存337中被移除之后,消息目的地302还收到消息304的额外副本。因此,当收到消息目的地302的额外副本时,交互高速缓存337不包括消息304的跟踪信息。
由此,消息目的地302可向消息源301发送包括交互ID 314的REQACKACK306。REQACKACK 306是对交互ID 314所标识的交互的进度的指示的请求。此外,在发送了消息304的额外副本之后的某个时间,计时器持续时间(341或其等效时间)到期,且消息源301更新交互高速缓存327以指示消息104不再需要确认。例如,可更新交互高缓存速缓存327以指示对于交互ID 314所标识的交互,具有消息ID 324的消息不再需要确认。因此,响应于REQACKACK 306,消息源301向消息目的地302发送包括交互ID 314和消息偏移量324的ACKACK 307。ACKACK307指示交互ID 324所标识的交互已经进展至具有消息ID 324的消息可被弃置(即,不需要确认)的程度。因此,消息目的地302弃置消息304的额外副本。
一般而言,消息目的地302被配置成在不终止参与某个交互的情况下,从存储器移除涉及该交互的跟踪信息(即,遗忘跟踪信息)。当消息目的地302收到对应于没有包括在交互高速缓存337中的交互的消息,消息目的地302向适当的消息源(例如,消息源301)发送REQACKACK。消息源通过向消息目的地302返回包括该交互有关跟踪信息的对应ACKACK来响应。因此,适当的消息源可用适当的跟踪信息更新消息目的地。由此,即使在交互高速缓存已被刷新时,仍可确保至多一次传送。
图4示出便于在消息目的地遭受无意的存储丢失时可靠地处理消息的第三个示例性消息流程。消息流程400在无意的存储丢失后收到消息的第二副本时确保至多一次传送。
如消息流程400中所示,消息源401和消息目的地402交换电子消息。可能消息源401是计算机系统102、103、104和106中的一个,消息目的地402是计算机系统107。源401和目的地402可具有以同步的时钟频率403前进的时钟。因此,消息源401和消息目的地402处的时间值的相对改变一致的可能性极高。例如,如果在某段时间之后,消息源401处的时钟前进了8分24秒,则在同一段时间以后消息目的地402处的对应时钟也前进了8分24秒的可能性极高。
消息源401(例如,Web浏览器)发送消息404。消息404包括交互ID 414、消息ID 424、数据444,并可选择性地包括(如虚线所示)实例ID 452。交互ID 414将消息404标识为对应于与消息目的地402的指定交互。消息ID 424标识消息404在作为指定交互(对应于交互ID 314)的一部分所交换的消息序列中的消息序列位置。数据344是要传输到消息目的地402处的某个模块(例如,到消息处理器实例451)的数据(例如,应用程序数据)。实例ID 452是向消息源指示为先前某个时间的消息处理器实例451的当前实例ID的实例ID(基于建立的预定条件)。
消息目的地402(例如,Web浏览器)收到对应于实例ID 452的消息404。已检测到消息404中的实例ID和消息处理实例451的当前实例ID(例如,实例ID452)相匹配时,消息目的地402即对跟踪信息进行其它检查。在适当时候,消息目的地402向消息处理器实例451传送数据444,消息处理器实例451进而处理数据444。可更新交互高速缓存437以指示消息404已被处理。例如,可更新交互高速缓存437以指示已为交互ID 414所标识的交互处理了具有消息ID 424的消息。
在处理消息404之后,消息目的地402可能遭受无意的存储丢失(包括交互高速缓存437的内容)。因此,消息目的地402检测到(例如,在重新启动序列期间)消息目的地402所用的存储器内容无意地丢失了。因此,消息目的地402可将消息处理器实例451重新初始化成具有和在先实例ID 452不同的更新实例ID 462。
因为消息源401没有收到对消息404的确认,消息源401可试图重新发送消息404的额外副本(例如,当重新发送间隔到期时)。如图所示,消息404的额外副本选择性地包括实例ID 452。消息目的地402将消息404的额外副本中所包括的实例ID(实例ID 452)与消息处理器实例的当前实例ID(实例ID 462)对比。消息目的地402拒收该消息(使对应于交互ID 414的交互失败),因为消息404的额外副本对应于实例ID 452而不是实例ID 462。
当实例ID没有包括在消息404中时,消息目的地402可选择性地发送REQACKACK来请求对应于交互ID 414的交互的进度。消息源401可用包括交互ID 414、消息ID 424和实例ID 452的ACKACK 407来响应。从ACKACK 407,消息目的地402可判定应拒收消息404的额外副本(对应于交互ID 414的交互将失败)。此外,REQACKACK 406可选择性地包括实例ID 462。因此,消息源401可在新的交互的开始学习消息处理器实例451的实例ID。即,当REQACKACK包含目的地实例ID时,源可检测到目的地已经重新启动。因此,当目的地遭受无意的存储丢失时,确保了至多一次传送。
一般而言,应当理解在确认(ACK和ACKACK)中可包括多个消息偏移量ID。例如,确认可包括交互中某个范围的消息偏移量(例如,19-23)、交互中消息偏移量的列表(例如,1、4、7)、或交互中的消息偏移量的范围和列表的组合(例如,3、7、14-19、22、24-26)。还应理解,可将ACK和REQACKACK定义为消息头(诸如在SOAP处理模型中),从而可将其附到从目的地到源的任何消息流中。类似地,可将ACKACK定义为消息头,从而可将其附到从消息源到目的地的任何消息流中。
此外,因为ACKACK消息向消息目的地指示不需要确认的消息(或者因为收到了对应的ACK,或者因为这些消息已到期),所以ACKACK消息可用于消除确认范围之间的空隙。即,ACKACK的使用可使消息目的地将确认范围和列表合并成单个范围。例如,消息源可能收到确认1-10、13-15和17-20范围的消息的ACK消息。接着,消息ID 11和12在消息源处到期。因此,响应于在消息ID 11和12到期之后收到的REQACKACK,已发送的ACKACK可指示消息ID 1-15和17-20不再需要确认。因此,ACKACK可限制确认的大小,从而防止对于长期存在的交互,确认的大小不停地增长。
本发明的实施例还可在例如TTL值为无限且不使用实例ID时用于恰好一次传送。
此外,应当理解,消息流程200、300和400在任何给定时间,通过网络在多个计算机系统之间实施。例如,计算机系统102、103、104和106(以及连到网络101的其它计算机系统)的每一个可作为实现与计算机系统107的消息流程200、300和400的部件(可能同时地)交换消息。计算机系统102、103、104和106(以及连到网络101的其它计算机系统)的每一个可适当地在同一时间或不同时间实现消息流程200、300、400。此外,计算机系统102、103、104和106(以及连到网络101的其它计算机系统)的每一个可实现多个与计算机系统107的消息流程200、300、400。可能消息流程200、300和400的每个实例对应于不同的交互ID。
图5示出本发明的原理的合适的操作环境。图5和以下描述旨在提供可实现本发明的合适计算环境的简单、一般的描述。尽管不是必需,将在诸如计算机系统所执行的程序模块等计算机可执行指令的通用上下文中描述本发明。一般而言,程序模块包括执行特定任务或实现特定抽象数据结构的例程、程序、对象、组件、数据结构等等。计算机可执行指令、相关联的数据结构、和程序模块表示用于执行本文所揭示的方法的动作的程序代码手段的例子。
参考图5,用于实现本发明的示例性系统包括计算机系统520形式的通用计算设备,它包括处理单元521、系统存储器522和将包括系统存储器522在内的各个系统组件耦合到处理单元521的系统总线523。处理单元521可执行设计成包括本发明的特征在内的计算机系统520的特征的计算机可执行指令。系统总线523可以是若干种总线结构中的任何一种,包括存储器总线或存储器控制器、外围总线、使用各种总线体系结构中的任何一种的局部总线。系统存储器包括只读存储器(“ROM”)524和随机存取存储器(“RAM”)525。包含在诸如启动期间帮助在计算机系统520内部各元件之间传输信息的基本例程的基本输入/输出系统(“BIOS”)526可存储在ROM 524中。
计算机系统520还可包括读或写硬磁盘539的硬磁盘驱动器527、读或写可移动磁盘529的磁盘驱动器528、以及读或写诸如CD-ROM或其它光介质等可移动光盘531的光盘驱动器530。硬磁盘驱动器527、磁盘驱动器528以及光盘驱动器530分别由硬盘驱动器接口532、磁盘驱动器接口533以及光盘驱动器接口534连接到系统总线523。这些驱动器和相关的计算机可读介质为计算机系统520提供了计算机可执行指令、数据结构、程序模块及其它数据的非易失性存储。尽管本文所描述的示例环境使用硬磁盘539、可移动磁盘529和可移动光盘531,还可使用用于储存数据的其它类型的计算机可读介质,包括磁带盒、闪存卡、数字多功能盘、贝努利盒式磁带、RAM、ROM等等。
包含一个或多个程序模块的程序代码手段,包括操作系统535、一个或多个应用程序536、其它程序模块537以及程序数据538,可存储于硬盘539、磁盘529、光盘531、ROM 524或RAM 525中。用户可以通过键盘540、定位设备542或诸如话筒、操纵杆、游戏垫、扫描仪等其它输入设备(未图示),来将命令和信息输入到计算机系统520。这些及其它输入设备可通过耦合到系统总线523的输入/输出接口546连接到处理单元521。输入/输出接口546逻辑上代表各种不同的接口中的任意一种,诸如串行端口接口、PS/2接口、并行端口接口、通用串行总线(“USB”)接口、或电气与电子工程师协会(“IEEE”)1394接口(即,火线接口),或者甚至可逻辑上代表不同接口的组合。
监视器547或其它显示设备通过视频接口548也连接到系统总线523。诸如扬声器和打印机等其它外围设备(未图示)也可连接至计算机系统420。
计算机系统520可连接到各种网络,诸如办公室范围或企业范围的计算机网络、家庭网络、内联网和/或因特网。计算机系统520可通过此类网络与诸如远程计算机系统、远程应用程序和/或远程数据库等外部源交换数据。
计算机系统520包括网络接口553,通过此接口计算机系统520从外部源接收数据,和/或发送数据到外部源。如图5中所示,网络接口553便于通过链路551与远程计算机系统583交换数据。网络接口553逻辑上可以表示一个或多个软件和/或硬件模块,诸如网络接口卡和对应的网络驱动程序接口规范(“NDIS”)栈。链路551表示网络的一部分(例,以太网段),远程计算机系统583表示该网络的一个节点。
类似地,计算机系统520包括输入/输出接口546,通过该接口计算机系统520从外部源接收数据和/或向外部源发送数据。输入/输出接口546经由链路559耦合到调制解调器554(例如,标准调制解调器、电缆调制解调器或数字用户线(“DSL”)调制解调器),通过调制解调器计算机系统520从外部源接收数据和/或向外部源发送数据。如图5中所示,输入/输出接口546和调制解调器554便于通过链路552与远程计算机系统593交换数据。链路552表示网络的一部分,远程计算机系统593表示该网络的一个节点。
尽管图5表示本发明的一个合适的操作环境,然而本发明的原理可在能够实现本发明原理的任何系统(若有必要,可进行适当修改)中使用。图5中所示的环境只是示例性的,决非代表众多的可在其中实现本发明原理的环境的即使一小部分。
根据本发明,包括消息处理器示例和时钟以及包括交互ID、消息ID、TTL值、实例ID、计数、数据和交互高速缓存在内的相关联数据,可存储在与计算机系统520相关联的任意计算机可读介质中,并可从这些介质被访问。例如,部分此类模块和部分相关联的程序数据可包括在操作系统535、应用程序536、程序模块537和/或程序数据538中,以在系统存储器522中存储。
当诸如磁硬盘539等大容量存储设备耦合至计算机系统520,此类模块和相关联的程序数据也可存储在该大容量存储设备中。在联网环境中,相对于计算机系统520所描绘的程序模块或其部分,可存储在远程存储设备中,诸如与远程计算机系统583和/或远程计算机系统593相关联的系统存储器和/或大容量存储设备。可在如前所述的分布式环境下执行此类模块。
本发明能以其它具体形式实现而不会偏离其精神和本质特征。在任何方面所述的实施例均仅被视为示例性的,而非限制性的。因而,本发明范围由所附权利要求书而非之前的描述所指示。落入权利要求书的等效技术方案的意义和范围内的所有改变将被包含在它们的范围中。