专利名称:路由针对双工应用的请求的制作方法
路由针对双工应用的请求
背景技术:
I.背景和相关技术计算机系统和相关技术影响社会的许多方面。的确,计算机系统处理信息的能力已转变了人们生活和工作的方式。计算机系统现在通常执行在计算机系统出现以前手动执行的许多任务(例如,文字处理、日程安排和会计等)。最近,计算机系统彼此耦合并耦合到其他电子设备以形成计算机系统和其他电子设备可以在其上传输电子数据的有线和无线计算机网络。因此,许多计算任务的执行分布在多个不同的计算机系统和/或多个不同的计算环境中。在诸如因特网之类的许多网络上,超文本传输协议(“HTTP”)是用于交换电子数据的流行通信介质。大量网络连接的个人计算机例如具有通用库和诸如web浏览器之类的客 户端程序以用于执行HTTP应用。因此,网络和系统管理员通常以远大于大多数其他协议的程度在带有极少或没有过滤限制的情况下允许HTTP通信量。该近乎全球的兼容性与增加的访问的组合使HTTP极大地实现了两个系统之间的连接建立和信息交换。然而,HTTP被束缚于特定的请求一回复消息交换模式,该模式将消息交换的发起限制在一方,并且仅仅允许由另一方对任何给定消息进行一次回复。频繁地,有限制条件被施加到同时的HTTP连接的数目以及在应用开发者控制之外使用HTTP连接的长度。存在需要以不受限制的双向方式交换消息的许多常见应用模式,其中有时在消息交换之间存在长的间隙并且在客户端与服务器之间存在不平衡的交换次数。为了围绕HTTP的各种限制展开工作,一些技术依靠客户端作出到服务器的周期性后台“轮询”HTTP连接。然后,服务器可以使用这些连接的HTTP响应将数据传送回该客户端。由于轮询在应用的后台进行,因此这些技术创建了服务器将消息异步地发送给客户端的这一能力的功能等价物。然而,当实现服务器侧逻辑来处理基于轮询的HTTP消息模式时,服务器可能由于大量同时连接的客户端可能生成的HTTP轮询的数目和频率而耗尽物理资源。因此,尽管轮询技术允许双向连通性,但是轮询技术还生成了比常规请求/回复模式显著更多的同时连接。尽管可以一定程度地增加单独的计算机系统处的资源以进行补偿,但是能够对单个服务器的硬件规范进行的改进是有限的。因此,当客户端负载显著增加时,该客户端负载将需要使用网络负载平衡器在多个服务器间分布。
发明内容
本发明延及用于路由针对双工应用的请求的方法、系统和计算机程序产品。在一些实施例中,消息被存储以供指定的服务实例进行访问。双工服务组件从双工客户端组件接收消息。该消息是从与双工客户端组件进行双工通信的客户端发送的,并且使用请求/回复协议从该双工客户端组件路由到双工服务组件。该消息具有与该双工客户端组件相对应的会话ID并且具有与该客户端相对应的终端ID。双工服务组件确定该消息的所指定的服务实例在该双工服务组件处不可用。双工服务组件响应于该确定将该消息存储在读取数据存储中。因此,通过访问读取数据存储使该消息对另一双工服务组件处的所指定的服务例程可用。该消息按照会话ID和端点ID与其他消息编组在一起,使得来自相同客户端的消息在读取数据存储内被编组在一起。第二双工服务组件处的所指定的服务实例使用双工通信来从该客户端访问该消息。所指定的服务实例基于消息具有分别与该双工客户端组件和该客户端相对应的会话ID和端点ID来访问该消息。在其他实施例中,一个或多个应用消息被递送给客户端。双工服务组件从双工客户端组件接收轮询消息。该双工服务组件是一个或多个双工服务组件之一。轮询消息包括被分配给双工客户端组件的会话ID并且请求针对与双工客户端组件进行双工通信的一个 或多个客户端的应用消息。该轮询消息使用请求/回复协议从双工客户端组件路由到双工服务组件。双工服务组件在写入数据存储中检查具有被分配给双工客户端组件的会话ID的任何应用消息。双工服务组件在写入数据存储中对具有被分配给双工客户端组件的会话ID的至少一个应用消息进行定位。所述至少一个消息是由第一服务实例使用双工通信写入到写入数据存储中的。在第一双工服务组件处可用的第一服务实例还被包括在所述一个或多个双工服务组件中。双工服务组件使用请求/回复协议将应用消息发送给双工客户端组件。提供本发明内容以便以简化的形式介绍将在以下的具体实施方式
中进一步描述的一些概念。本发明内容并非旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。本发明的附加特征和优点将在以下描述中叙述,且其一部分根据本描述将是显而易见的,或可通过对本发明的实践来获知。本发明的特征和优点可通过在所附权利要求书中特别指出的工具和组合来实现和获得。本发明的这些和其他特征将通过以下描述和所附权利要求书变得更加显而易见,或可通过对下文中所述的本发明的实践来领会。
为了描述可获得本发明的上述和其他优点和特征的方式,将通过参考附图中示出的本发明的具体实施例来呈现以上简要描述的本发明的更具体描述。可以理解,这些附图仅描述本发明的典型实施例,从而不被认为是对其范围的限制,本发明将通过使用附图用附加特征和细节来描述和说明,在附图中图IA和IB示出了促进客户端与所指定的服务实例之间的消息路由的示例性计算机架构。图2示出用于存储消息以供所指定的服务实例访问的示例性方法的流程图。图3示出了用于将应用消息递送给客户端的示例性方法的流程图。图4示出了用于在客户端与所指定的服务实例之间路由消息的示例性消息流模式。
具体实施例方式本发明延及用于路由针对双工应用的请求的方法、系统和计算机程序产品。在一些实施例中,消息被存储以供指定的服务实例进行访问。双工服务组件从双工客户端组件接收消息。该消息是从与双工客户端组件进行双工通信的客户端发送的,并且使用请求/回复协议从该双工客户端组件路由到双工服务组件。该消息具有与该双工客户端组件相对应的会话ID并且具有与该客户端相对应的端点ID。双工服务组件确定该消息的所指定的服务实例在该双工服务组件处不可用。双工服务组件响应于该确定将该消息存储在读取数据存储中。因此,通过访问读取数据存储使该消息对另一双工服务组件处的所指定的服务例程可用。该消息按照会话ID和端点ID与其他消息编组在一起,使得来自相同客户端的消息在读取数据存储内被编组在一起。第二双工服务组件处的所指定的服务实例使用双工通信来从该客户端访问该消息。所指定的服务实例基于消息具有分别与该双工客户端组件和该客户端相对应的会话ID和端点ID来访问该消息。在其他实施例中,一个或多个应用消息被递送给客户端。双工服务组件从双工客户端组件接收轮询消息。该双工服务组件是一个或多个双工服务组件之一。轮询消息包括 被分配给双工客户端组件的会话ID并且请求针对与双工客户端组件进行双工通信的一个或多个客户端的应用消息。该轮询消息使用请求/回复协议从双工客户端组件路由到双工服务组件。双工服务组件在写入数据存储中检查具有被分配给双工客户端组件的会话ID的任何应用消息。双工服务组件在写入数据存储中对具有被分配给双工客户端组件的会话ID的至少一个应用消息进行定位。所述至少一个消息是由第一服务实例使用双工通信写入到写入数据存储中的。在第一双工服务组件处可用的第一服务实例还被包括在所述一个或多个双工服务组件中。双工服务组件使用请求/回复协议将应用消息发送给双工客户端组件。本发明的各实施例可包括或利用专用或通用计算机,该专用或通用计算机包括诸如例如一个或多个处理器和系统存储器等计算机硬件,如以下更详细讨论的。本发明范围内的各实施例还包括用于承载或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。承载计算机可执行指令的计算机可读介质是传输介质。由此,作为示例而非限制,本发明的各实施例可包括至少两种显著不同的计算机可读介质计算机存储介质和传输介质。计算机存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储、磁盘存储或其他磁存储设备、或可用于存储计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的任何其他介质。“网络”被定义为允许在计算机系统和/或模块和/或其他电子设备之间传输电子数据的一个或多个数据链路。当信息通过网络或另一个通信连接(硬连线、无线、或者硬连线或无线的组合)传输或提供给计算机时,该计算机将该连接适当地视为传输介质。传输介质可包括可用于携带计算机可执行指令或数据结构形式的所需程序代码装置且可由通用或专用计算机访问的网络和/或数据链路。上述的组合也应被包括在计算机可读介质的范围内。此外,在到达各种计算机系统组件之后,计算机可执行指令或数据结构形式的程序代码装置可从传输介质自动传输到计算机存储介质(或反之亦然)。例如,通过网络或数据链路接收到的计算机可执行指令或数据结构可被缓存在网络接口模块(例如,“NIC”)内的RAM中,然后最终被传输到计算机系统RAM和/或计算机系统处的较不易失性的计算机存储介质。因而,应当理解,计算机存储介质可被包括在还利用(或甚至主要利用)传输介质的计算机系统组件中。计算机可执行指令例如包括,当在处理器处执行时使通用计算机、专用计算机、或专用处理设备执行某一功能或某组功能的指令和数据。计算机可执行指令可以是例如二进制代码、诸如汇编语言之类的中间格式指令、或甚至源代码。尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权利要求书中定义的主题不必限于上述特征或动作。相反,上述特征和动作是作为实现权利要求的示例形式而公开的。本领域的技术人员将理解,本发明可以在具有许多类型的计算机系统配置的网络计算环境中实践,这些计算机系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器的或可编程消费电子设备、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机等等。本发明也可在其中通过 网络链接(或者通过硬连线数据链路、无线数据链路,或者通过硬连线和无线数据链路的组合)的本地和远程计算机系统两者都执行任务的分布式系统环境中实施。在分布式系统环境中,程序模块可位于本地和远程存储器存储设备中。在该说明书和下面的权利要求书中,“双工通信介质”被定义成所连接的两方之间的通信介质,该通信介质允许所述各方之间的双向通信并且其中任一方可以独立地发起通过该通信介质的到另一方的通信。双工通信介质被定义为包括半双工通信介质(在一次中,一方发送并且另一方接收)和全双工通信介质(双方都被允许同时发送和接收)二者。在该说明书和在下面的权利要求书中,“请求/回复通信介质”被定义成所连接的两方之间的通信介质,该通信介质允许所述各方之间的配对(可能精确配对)的通信。请求者(例如客户端)将请求消息发送给回复者系统(例如服务器),该回复者系统接收并处理该请求,最终作为响应返回消息。请求/回复可以以同步或异步方式实现。超文本传输协议(“HTTP”)是请求/回复通信介质的示例。图IA和IB示出了促进客户端与所指定的服务实例之间的消息路由的示例性计算机架构100。如所描绘那样,计算机架构100包括客户端101、102、103、104和106、双工客户端组件111和112、消息分发组件113、机器121和131、读取数据存储144和写入数据存储146。所描绘的计算机架构100中的组件和机器中的每一个都通过诸如例如局域网(“LAN”)、广域网(“WAN”)或甚至因特网之类的网络(或作其一部分)彼此连接。因此,所描绘的组件和机器中的每个以及任何其他连接的计算机系统及其组件都可以创建消息相关数据并通过网络交换消息相关数据(例如,网际协议(“IP”)数据报和利用IP数据报的其他更高层协议,诸如传输控制协议(“ TCP ”)、超文本传输协议(“HTTP ”)、简单邮件传输协议(“SMTP”)等)。计算机架构100内的不同组件可以通过包括双工通信介质和请求/回复通信介质在内的不同类型的通信介质彼此连接。例如,双工通信介质114将客户端101、102和103连接到双工客户端组件111并且将所连接的客户端104和106连接到双工客户端组件112。双工通信介质114可以包括网络通信介质以及系统总线通信介质。请求/回复通信介质116 (例如HTTP)将双工客户端组件111和112连接到机器121和131 (并且因此分别连接到双工服务组件122和132)。在机器121内,双工通信介质(未示出)将双工服务组件实例122连接到服务实例141A和142A。类似地,在机器131内,双工通信介质(未示出)将双工服务组件实例132连接到服务实例142B。不同的通信介质可以位于不同网路的部分上。例如,双工通信介质114可以位于处于一个或多个不同公司的控制下的公司LAN或WAN上。请求/回复通信介质116例如可以位于公共WAN上,比如因特网。机器121和131处的双工通信可以位于处于一个或多个不同服务提供者的控制下的服务提供者LAN或WAN上。因此,客户端101、102、103、104和106可以是不时地向机器121和131处的服务实例发送请求的计算机系统。客户端101、102、103、104和106以及计算机架构100中的省略号标识的其他客户端中的每个(在此有时称为“客户端”)都可以处于相同或不同实体的控制下。客户端例如是客户端应用,比如web浏览器或web服务组件。一般而言,双工通信介质114将客户端连接到相应的双工客户端组件,这些双工客户端组件中的每个都处于相同或不同实体的控制 下。因此,客户端可以通过双工通信介质114将消息发送到双工客户端组件(例如111和112)以及从其接收消息。包括双工客户端组件111和双工客户端组件112在内的每个双工客户端组件都被配置为通过双工通信介质114从客户端接收消息或向客户端发送消息。所述双工客户端组件的每个还被配置为通过请求/回复通信介质116向双工服务组件实例(例如122和132)发送请求、以及通过请求/回复通信介质116从双工服务组件接收相应的回复。因此,双工客户端组件一般还被配置为合适地在双工通信与请求/回复通信之间转换。类似于客户端,双工客户端组件还可以处于相同或不同实体的控制下。在一些实施例中,一个或多个客户端和双工客户端组件处于相同实体的控制下。例如,客户端101、102和103以及双工客户端组件111可以处于相同第一实体的控制下。例如,双工客户端组件111可以在web浏览器进程中被托管,并且客户端101、102和103可以是该web浏览器所显示的网页中托管的控件。类似地,客户端104和106以及双工客户端组件112可以处于相同的第二实体(其不同于第一实体)的控制下。可替代地,双工客户端组件可以处于一个实体的控制下,该实体被配置为处理针对一个或多个不同的其他实体的客户端的消息。例如,客户端101、102和103以及双工客户端组件111每个都可以处于不同实体的控制下。消息分发组件113提供了用于将消息从双工客户端组件分发给双工服务组件实例的机制。消息分发组件113例如可以包括负载平衡器、域名系统(“DNS”)解析组件、路由器等等。消息分发组件113可以使用在没有任何会话亲和力的情况下分发消息的算法(例如循环)。因此,消息分发组件113可以将不同消息从相同客户端分发给不同的双工客户端服务实例。例如,消息分发组件113可以将第一消息从客户端101路由到双工服务组件实例122并且将第二消息从客户端101路由到双工服务组件实例132 (或者到其他某个机器处的双工服务组件实例)。因此,消息分发组件113可以将消息从不同客户端分发给相同的双工服务组件实例。例如,消息分发组件113可以将来自客户端103的消息和来自客户端106的消息路由到双工服务组件实例132。一般而言,双工服务组件实例被配置为通过请求/回复通信介质从双工客户端组件接收请求、以及通过请求/回复通信介质将回复发送给双工客户端组件。例如,双工服务实例122和132可以通过请求/回复通信介质116从客户端101、102、103、104和106中的任何客户端接收请求并向其发送回复。双工服务组件实例还被配置为通过双工通信介质从服务实例接收消息以及向其发送消息。例如,双工服务组件实例122可以在机器121处通过双工通信从服务实例141A和142A (以及机器121处的其他服务实例)接收消息以及向其发送消息。例如,双工服务组件实例132可以在机器131处通过双工通信从服务实例142B(以及机器131处的其他服务实例)接收消息以及向其发送消息。因此,双工服务组件实例一般还被配置为合适地在双工通信与请求/回复通信之间转换。一般而言,服务实例是在机器处运行的服务的实例。例如,(服务141的)服务实例141A在机器121处运行。服务的不同服务实例还可以在不同机器处运行。例如,(服务142的)服务实例142A和142B分别在机器121和131处运行。不同的服务实例可以处于相同或不同实体的控制下。服务实例可以例如是服务应用,比如web服务器或web服务组件。服务实例与机器之间的双工通信介质也可以处于相同或不同实体的控制下。因此,月艮 务实例141AU42A和142B (以及机器121和131处的任何其他服务实例、以及其他机器处的服务实例)可以通过双工通信介质向相应的双工服务组件发送消息并从其接收消息。当交换消息时,双工客户端组件可以附加标识出双工客户端组件的会话ID。例如,当发送消息151时,双工客户端组件111可以将会话ID 161附加到消息151。会话ID 161可以将双工客户端组件111标识为消息151的发送者。双工服务组件实例和服务实例可以使用会话ID来为所接收的消息标识出起源双工客户端组件。例如,双工服务组件实例122可以使用会话ID 161将双工客户端组件111标识为消息151的发送者。当双工客户端组件发送消息时,双工客户端组件还附加标识出客户端的端点ID。例如,当发送消息152时,双工客户端组件111还可以将端点ID 163附加到消息152。端点ID 163可以将客户端102标识为将消息152发送给双工客户端组件111的客户端。在一些实施例中,双工客户端组件在发送前批量处理消息。例如,双工客户端组件111可以在批次154中批量处理消息151、152等等。然后,双工客户端组件111可以将包括消息151、152等等的批次154发送给双工服务组件实例。相对于单独地发送消息而言,发送批次节省了资源。端点ID可以与消息一起行进,并且被传输给任何相应的响应消息以供返回给双工客户端组件。短时参考图1B,双工服务组件132可以将消息154与会话ID 161和端点ID 163 一起发送给双工客户端组件111。当双工客户端组件111接收消息156时,双工客户端组件111使用端点ID 163来确定消息156将被递送给客户端102。在一些实施例中,双工服务组件实例在发送前一并批量处理针对相同双工客户端的消息。双工服务组件实例可以包括读取逻辑和写入逻辑,所述逻辑有助于将传入请求消息路由到合适的服务实例以及将传出回复消息路由到合适的双工客户端组件。例如,回到图1A,双工服务实例122包括读取逻辑123和写入逻辑124。类似地,双工服务实例132包括读取逻辑133和写入逻辑134。一般而言,读取数据存储144被配置为保持请求(应用)消息,直到负责的服务实例请求该请求(应用)消息。读取数据存储144可以是某种类型的持久性存储,从而允许更持久地保存请求(应用)消息,直到被负责的服务实例请求。读取数据存储144可以由双工服务组件实例和服务实例全局地访问。因此,一个机器处的双工服务组件实例可以在读取数据存储144中存储请求(应用)消息以使该请求(应用)消息对其他机器处的服务实例可用。因此,当双工服务组件实例接收到应用消息(或者应用消息的批次)时,读取逻辑可以分析所述消息(或每个单独的消息)以确定相同机器处的服务实例是否负责该消息。该分析可以包括确定相同机器处的服务实例是否正在处理针对所附加的相同会话ID的其他消息。当相同机器处的服务实例正在处理针对所附加的相同会话ID的其他消息时,读取逻辑可以将该消息路由到该服务实例。另一方面,当相同机器处的服务实例未正在处理针对所附加的相同会话ID的其他消息时,读取逻辑可以将该消息路由到读取数据存储144。当服务实例负责会话ID时,该服务实例可以(例如不时地或者响应于接收到针对该会话ID的其他消息)在读取数据存储144中查询具有所附加的会话ID的消息。因此,在一个机器处的双工组件服务实例处接收的消息可被存储在读取数据存储144处并且随后由另一机器处的负责的服务实例访问。 一般而言,读取数据存储146被配置为保持从服务实例接收到的回复(应用)消息,直到从双工客户端组件接收到针对回复(应用)消息的请求(轮询)。读取数据存储146可以是某种类型的持久性存储,从而允许更持久地保存回复(应用)消息,直到(例如响应于轮询消息)被返回给合适的双工客户端组件。读取数据存储146可以由双工服务组件实例和服务实例全局地访问。因此,一个机器处的服务实例可以在读取数据存储146中存储回复(应用)消息以使该回复(应用)消息对其他机器处的双工服务组件实例可用。图2示出用于存储消息以供所指定的服务实例访问的示例性方法200的流程图。方法200将参考图IA所描绘的组件和数据来描述。方法200包括双工服务组件从双工客户端组件接收消息的动作,该消息是从与双工客户端组件进行双工通信的客户端发送的,该消息已经使用请求/回复协议从双工客户端组件路由到双工服务组件,该消息具有对应于双工客户端组件的会话ID并且具有对应于客户端的端点ID (动作201)。例如,双工服务组件实例122可以从双工客户端组件111接收消息152。如图IA中所示,消息152通过双工通信介质114从客户端102发送给双工客户端组件111。消息152是通过请求/回复通信介质116 (例如HTTP)从双工客户端组件111路由到双工服务组件实例122的。消息分发组件113可以将消息152路由到双工服务组件实例122而不考虑会话亲和力。因此,消息152同样可以已经被路由到双工服务组件实例132或其他某个双工服务组件实例(例如其处于其他某个机器处)。消息152包括对应于双工客户端组件111的会话ID 161以及对应于客户端102的端点ID 163。如所描绘的那样,消息152可以与其他消息(例如消息151)—起被包括在批次154中。批次154中的每个消息都可以包括会话ID 161和与同双工客户端组件111进行双工通信的客户端相对应的端点ID。因此,可能的是,双工服务组件实例122接收批次154并且随后从批次154内访问各个消息。来自其他双工客户端组件和客户端的其他请求(应用)消息还可以按会话ID和端点ID被编组,并且被存储在读取数据存储144中以供所指定的服务实例访问。当所指定的服务实例在接收到请求(应用)消息的双工服务组件实例处不可用时,可以编组和存储来自其他双工客户端组件和客户端的消息。例如,当所指定的服务实例在相同机器处不可用于处理该请求(应用)消息时,针对双工客户端组件112和所连接的客户端(例如104和106)的请求(应用)消息还可被存储在写入数据存储146中。方法200包括双工服务组件确定针对该消息的所指定的服务实例在该双工服务组件处不可用的动作(动作202)。例如,读取逻辑123可以确定针对消息152的所指定的服务实例在机器121处不可用。对不可用性的确定可以包括确定负责与会话ID和/或端点ID的组合相对应的消息的服务实例在双工服务组件处不可用。例如,读取逻辑123可以确定负责与会话ID 161和端点ID163的组合相对应的消息的服务实例在机器121处不可用。读取逻辑123还可以确定针对消息的所指定的服务实 例在机器121处可用。例如,读取逻辑123可以确定服务实例141A是针对消息151的所指定的服务实例。对可用性的确定可以包括确定负责与会话ID和/或端点ID的组合相对应的消息的服务实例在双工服务组件处可用。例如,读取逻辑123可以确定服务实例141A负责与会话ID 161和端点ID 162的组合相对应的消息。方法200包括双工服务组件响应于该确定将消息存储在读取数据存储中以便使该消息对另一双工服务组件处的所指定的服务实例可用的动作,该消息按照会话ID和端点ID与其他消息编组在一起,使得来自相同客户端的消息在读取数据存储内被编组在一起(动作203)。例如,响应于确定针对消息152的所指定的服务实例在机器121处不可用,读取逻辑123可以将消息152 (与会话ID 161和端点ID 163—起)存储在读取数据存储144中。在读取数据存储144内,消息152与具有会话ID 161和端点ID 162的其他消息(即来自客户端102的其他消息)编组在一起。将消息152存储在读取数据存储144中使消息152对另一双工服务组件实例处(即在机器131处)的服务实例可用。方法200包括第二双工服务组件处的所指定的服务实例使用双工通信来从客户端访问该消息的动作,所述所指定的服务实例基于消息具有分别与该双工客户端组件和该客户端相对应的会话ID和端点ID来访问该消息(动作204)。例如,服务实例142B可以使用双工通信从读取数据存储144访问消息152 (连同会话ID 161和端点ID 163)。也就是说,服务实例142B基于被指定给从双工客户端组件111和客户端102的组合发送的进程应用消息来访问消息152。在处理消息152以后,可能的是,服务实例142B已经具有要返回给客户端102的结果。服务实例142B可以将消息中的结果存储在写入数据存储146中。例如,服务实例142B可以使用双工通信把包含处理消息152的结果(连同会话ID 161和端点ID 163)的消息156存储在写入数据存储146。响应于针对双工客户端组件111的回复(应用)消息的请求(轮询)消息,双工服务组件实例处的写入逻辑可以访问消息156并且将消息156返回给双工客户端组件111。其他服务实例也可以使用双工通信将消息存储在写入数据存储146中。例如,响应于处理来自客户端103的请求(应用)消息,服务实例142A可以将消息157与会话ID 161和端点ID 164—起存储。端点ID 164可以是双工客户端组件111向客户端103分配的端点ID。供返回给其他双工客户端组件和客户端的其他回复(应用)消息也可以按照会话ID和端点ID被编组在一起并且存储在写入存储146中。例如,针对双工客户端组件112和客户端(例如104和106)的回复(应用)消息也可被存储在写入数据存储146中。图3示出了用于将应用消息递送给客户端的示例性方法300的流程图。方法300将参考图IB所描绘的组件和数据来描述。方法300包括双工服务组件从双工客户端组件接收轮询消息的动作,该轮询消息请求针对与该双工客户端组件进行双工通信的一个或多个客户端的应用消息,该轮询消息已经使用请求/回复协议从该双工客户端组件路由到该双工服务组件,该轮询消息包括被分配给该双工客户端组件的会话ID (动作301)。例如,双工组件实例132可以从双工客户端组件111 一并接收轮询消息158和会话ID 161。因此,轮询消息158请求针对与双工客户端组件111进行双工通信的客户端(包括101、102和103)的回复(应用)消息。轮询消息158是通过请求/回复通信介质116 (例如HTTP)从双工客户端组件111路由到双工服务组件实例132的。消息分发组件113可以将轮询消息158路由到双工服务组件实例132而不考虑会话亲和力。
方法300包括双工服务组件在写入数据存储中检查具有被分配给双工客户端组件的会话ID的任何应用消息的动作(动作302)。例如,双工组件实例132可以在数据存储146中检查按照会话ID 161被编组在一起的任何回复(应用)消息。方法300包括双工服务组件在写入数据存储中定位具有被分配给双工客户端组件的会话ID的至少一个应用消息的动作,所述至少一个消息已经由第一服务实例使用双工通信写入到写入数据存储中,所述第一服务实例在第一双工服务组件处可用(动作303)。例如,在检查写入数据存储146以后,双工服务组件实例132可以定位具有会话ID 161的至少一个消息157,所述消息157已经由服务实例142A使用双工通信写入到写入数据存储146中。双工组件服务组件实例132还可以定位消息156,该消息156已经由服务实例142B使用双工通信写入到写入数据存储146中。方法300包括双工服务组件使用请求/回复协议将应用消息发送给双工客户端组件的动作(动作304)。例如,写入逻辑134可以使用请求/回复通信介质116 (例如HTTP)将消息157与端点ID 164—起发送给双工客户端组件111。写入逻辑134还可以使用请求/回复通信介质116将消息156与端点ID 163 一起发送给双工客户端组件111。在一些实施例中,消息156和157与供递送给双工客户端组件111的其他消息一起被批处理。然后,写入逻辑134将该批次的消息发送给双工客户端组件111。写入逻辑134可以在返回消息156和157中包括或不包括会话ID 161,因为其已经从轮询消息158中得知了会话ID 161。在接收到(例如批次)一个或多个消息,双工客户端组件111可以使用端点ID来将各个消息递送给合适的客户端。例如,基于会话ID 163和164,双工客户端组件111可以分别将消息156和157递送给客户端102和103。图4示出了用于在客户端与所指定的服务实例之间路由消息的示例性消息流模式400。箭头411表示客户端401建立轮询,该轮询基于在没有会话亲和力的情况下(可能随机地)路由消息的算法被路由到双工服务实例402A。该轮询允许双工服务实例402A在任何时候在写入数据存储406中查询并且递送针对客户端401的消息。箭头412表示客户端401发送请求(应用)消息A,该请求(应用)消息A也基于在没有会话亲和力的情况下(可能随机地)路由消息的算法被路由到双工服务实例402A。箭头413表示双工服务实例402A将消息A写入到读取数据存储404中。双工服务实例402A可以响应于所指定的服务实例(例如403)在与双工服务实例402A相同的机器处不可用而将消息A写入到读取数据存储404。箭头414表示服务实例403 (针对客户端401的所指定的服务实例)检查读取数据存储404并且定位消息A。服务实例403读取触发服务实例403的激活的消息A,该服务实例执行一些处理。箭头415表示服务实例403 (在消息A的处理期间)选择通过将消息B存储在写入数据存储406中将消息B发送给客户端401。箭头416表示客户端401发送请求(应用)消息C,该请求(应用)消息C也基于在没有会话亲和力的情况下(可能随机地)路由消息的算法被路由到双工服务实例402B。箭头417表示双工服务实例402B将消息C写入到读取数据存储404中。双工服务实例402B可以响应于所指定的服务实例(例如403)在与双工服务实例402B相同的机器处不可用而将消息C写入到读取数据存储404。箭头418表示服务实例403仍然为活动的,检查读取数据存储404并且定位消息C。服务实例403从读取数据存储404读取消息C并且继续处理。箭头419表示服务实例 403完成处理并且通过在写入数据存储406中存储消息D和E将消息D和E发送给客户端401。箭头420表示双工服务实例402A基于一些传输特有的逻辑判定从写入数据存储406中访问消息B和D以及将消息B和D发送给客户端401。双工服务实例402A能够发送消息B和D,因为其仍然具有以箭头411表示的轮询。箭头421表示双工服务实例402A响应于以箭头411表示的轮询将消息B和D发送给客户端401。箭头422表示双工服务实例402B从客户端401接收随后的轮询。随后的轮询基于在没有会话亲和力的情况下(可能随机地)路由消息的算法被路由到双工服务实例402B。该轮询允许双工服务实例402B在任何时候在写入数据存储406中查询并且递送针对客户端401的消息。箭头423表示双工服务实例402B基于一些传输特有的逻辑判定将剩余的消息、消息E从写入数据存储406中发送给客户端401。双工服务实例402B能够发送消息E,因为双工客户端402B仍然具有以箭头422表示的轮询。箭头423表示双工服务实例402B响应于以箭头422表示的轮询将消息E发送给客户端401。因此,本发明的实施例提供了用于基于轮询机制的双工消息模式的多机器缩放能力机制。客户端请求和轮询可以由不感知会话的负载平衡器分发给运行在机器群集内的服务实例。去往和来自给定客户端的消息可以由群集服务实例中的任何服务实例来访问,这允许服务实例之间的容量横向扩展和无缝的故障转移。实施例包括通过非本机双工通信介质对复用双工通信的支持,其中客户端和服务期系统通过不感知会话的负载平衡被分开。协调的入站消息存储(例如读取数据存储144)被用于使应用请求对特定服务实例亲和。协调的出站消息存储(例如写入数据存储146)被用于将应用响应从运行该应用的机器路由到轮询所到达的机器。另外,服务实例的寿命同入站或出站消息存储去耦合,从而允许客户端一服务器对话可能跨越服务的许多实例。本发明可具体化为其它具体形式而不背离其精神或本质特征。所描述的实施例在所有方面都应被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非前述描述指示。落入权利要求书的等效方案的含义和范围内的所有改变被权利要求书的范围所涵盖。
权利要求
1.一种在计算机架构处用于存储消息以供所指定的服务实例访问的方法,所述计算机架构包括一个或多个双工客户端组件、多个双工服务组件以及读取数据存储,所述一个或多个双工客户端组件包括双工客户端组件,所述多个双工服务组件包括双工服务组件和第二双工服务组件,所述一个或多个双工客户端组件中的每个都使用双工通信与一个或多个客户端通信,所述多个双工服务组件中的每个都使用双工通信与一个或多个服务实例通信,来自所述一个或多个客户端双工组件的消息在没有任何固有的会话亲和力的情况下在所述多个双工服务组件间分发,所述读取数据存储能够由所述多个双工服务客户端中的任何双工服务客户端处的服务实例全局地访问,该方法包括 所述双工服务组件从所述双工客户端组件接收消息的动作,所述消息是从与所述双工客户端组件进行双工通信的客户端发送的,所述消息已经使用请求/回复协议从所述双工客户端组件路由到所述双工服务组件,所述消息具有对应于所述双工客户端组件的会话ID并且具有对应于所述客户端的端点ID ; 所述双工服务组件确定针对所述消息的所指定的服务实例在所述双工服务组件处不可用的动作; 所述双工服务组件响应于该确定将所述消息存储在所述读取数据存储中以便使所述消息对另一双工服务组件处的所指定的服务实例可用的动作,所述消息按照会话ID和端点ID与其他消息编组在一起,使得来自相同客户端的消息在所述读取数据存储内被编组在一起;以及 第二双工服务组件处的所指定的服务实例使用双工通信来访问所述客户端的所述消息的动作,所述所指定的服务实例基于消息具有分别与所述双工客户端组件和所述客户端相对应的会话ID和端点ID来访问所述消息。
2.如权利要求I所述的方法,其特征在于,还包括 所述双工服务组件从所述双工客户端组件接收第二消息的动作,第二消息是从与所述双工客户端组件进行双工通信的第二客户端发送的,第二消息已经使用请求/回复协议从所述双工客户端组件路由到所述双工服务组件,所述消息具有对应于所述双工客户端组件的会话ID并且具有对应于第二客户端的第二端点ID ;
3.如权利要求2所述的方法,其特征在于,所述双工服务组件从所述双工客户端组件接收消息的动作以及所述双工服务组件从所述双工客户端组件接收第二消息的动作包括所述双工服务组件从所述双工客户端组件接收消息的批次的动作,所述消息的批次包括包括所述消息和第二消息在内的多个单独的消息,所述多个单独的消息是从与所述双工客户端组件进行双工通信的包括所述客户端和第二客户端在内的一个或多个客户端发送的,包括所述消息在内的所述多个消息中的每个消息都具有对应于所述双工客户端组件的会话ID0
4.如权利要求3所述的方法,其特征在于,还包括 所述双工服务组件将所述消息的批次分解成多个单独的消息的动作。
5.如权利要求4所述的方法,其特征在于,所述双工服务组件确定针对所述消息的所指定的服务实例在所述双工服务组件处不可用的动作包括所述双工服务组件确定针对所述多个单独的消息中的至少一些单独的消息的所指定的服务实例在所述双工服务组件处不可用的动作。
6.如权利要求5所述的方法,其特征在于,所述双工服务组件将所述消息存储在所述读取数据存储中的动作包括所述双工服务组件响应于该确定将所述一个或多个单独的消息中的至少一些单独的消息存储在所述读取数据存储中,以便使所述一个或多个单独的消息中的所述至少一些单独的消息对其他双工服务组件处的所指定的服务实例可用,所述单独的消息按照会话ID和端点ID被编组,使得来自相同客户端的消息在所述读取数据存储中被编组在一起。
7.如权利要求2所述的方法,其特征在于,还包括 所述双工服务组件确定针对第二消息的所指定的服务实例在所述双工服务组件处可用的动作;以及 所述双工服务组件响应于该确定将第二消息提供给所述双工服务组件处的所指定的服务实例而不将第二消息存储在所述读取数据存储的动作。
8.如权利要求I所述的方法,其特征在于,所述计算机架构包括写入数据存储并且还包括 第二双工服务组件处的所指定的服务实例在第二双工服务组件处的所指定的服务实例访问所述消息以后处理所述消息的动作;以及 所指定的服务实例在处理所述消息期间生成回复消息以返回给所述客户端的动作,所述回复消息具有所述会话ID和端点ID ;以及 所指定的服务实例将所述回复消息存储在所述写入数据存储中,所述回复消息与具有所述会话ID的其他消息编组在一起,使得针对所述双工客户端组件的消息在所述写入数据存储中被编组在一起。
9.如权利要求8所述的方法,其特征在于,还包括 第三双工服务组件在所述写入数据存储中查询具有所述会话ID的消息的动作,第三双工服务组件响应于来自所述双工客户端组件的所接收到的轮询消息查询所述写入数据存储,所述所接收到轮询消息具有所述会话ID ; 所述写入数据存储把按照所述会话ID被编组在一起的一个或多个消息返回给第三双工服务组件,所述一个或多个消息包括所述回复消息;以及 第三双工服务组件响应于所述轮询将按照所述会话ID被编组在一起的所述一个或多个消息发送给所述双工客户端组件。
10.如权利要求9所述的方法,其特征在于,第一双工服务组件和第三双工服务组件是同一双工服务组件。
11.如权利要求9所述的方法,其特征在于,还包括在第三双工服务组件在所述写入数据存储中查询消息的动作以后将具有所述会话ID的一个或多个消息写入到所述写入数据存储中的动作,并且其中发送按照所述会话ID被编组在一起的所述一个或多个消息的动作包括发送所述一个或多个消息至少之一的动作。
12.—种在计算机架构处用于将应用消息递送给客户端的方法,所述计算机架构包括一个或多个双工客户端组件、多个双工服务组件以及写入数据存储,所述一个或多个双工客户端组件包括双工客户端组件,所述多个双工服务组件至少包括双工服务组件和第一双工服务组件,所述一个或多个双工客户端组件中的每个都使用双工通信与一个或多个客户端通信,所述多个双工服务组件中的每个都使用双工通信与一个或多个服务实例通信,来自所述一个或多个双工客户端组件的消息在没有任何固有的会话亲和力的情况下在所述多个双工服务组件间分发,所述写入数据存储能够由所述多个双工服务客户端中的任何双工服务客户端处的服务实例全局地访问,该方法包括 所述双工服务组件从所述双工客户端组件接收轮询消息的动作,所述轮询消息请求针对与所述双工客户端组件进行双工通信的一个或多个客户端的应用消息,所述轮询消息已经使用请求/回复协议从所述双工客户端组件路由到所述双工服务组件,所述轮询消息包括被分配给所述双工客户端组件的会话ID ; 所述双工服务组件在所述写入数据存储中检查具有被分配给所述双工客户端组件的会话ID的任何应用消息的动作; 所述双工服务组件在所述写入数据存储中定位具有被分配给所述双工客户端组件的会话ID的至少一个应用消息的动作,所述至少一个消息已经由第一服务实例使用双工通信写入到所述写入数据存储中,所述第一服务实例在第一双工服务组件处可用;以及 所述双工服务组件使用所述请求/回复协议将所述应用消息发送给双工客户端组件的动作。
13.如权利要求12所述的方法,其特征在于,所述双工服务组件在所述写入数据存储中定位具有被分配给所述双工客户端组件的会话ID的至少一个应用消息的动作包括所述双工服务组件在所述写入数据存储中定位具有被分配给所述双工客户端组件的会话ID的多个应用消息的动作。
14.如权利要求12所述的方法,其特征在于,所述双工服务组件和第一双工服务组件是同一双工服务组件。
15.一种网络计算机系统,所述网络计算机系统包括 一个或多个处理器; 多个双工客户端组件,每个双工客户端组件都与一个或多个客户端进行双工通信;多个双工服务组件,每个双工服务组件都与一个或多个服务实例进行双工通信;消息分发组件,所述消息分发组件使用请求/回复通信在没有任何会话亲和力的情况下在所述多个双工客户端组件与所述多个双工服务组件之间路由消息; 读取数据存储,所述读取数据存储用于在所指定的服务实例在原先接收到来自客户端的请求应用消息的双工服务组件处不可用时持久地存储所述请求应用消息,所述读取数据存储能够由所述多个双工服务客户端中的任何双工服务客户端处的一个或多个服务实例全局地访问,使得另一不同的双工服务组件处的所指定的服务实例能够从所述读取数据存储访问请求应用消息; 写入数据存储,所述写入数据存储用于持久地存储针对客户端的回复应用消息,所述回复应用消息是从处理请求应用消息的服务实例中生成的,所述写入数据存储能够由所述多个双工服务组件全局地访问,使得所述多个双工服务组件中的任何双工服务组件都能够响应于从客户端接收到的轮询消息将回复应用消息返回给所述客户端。
全文摘要
本发明延及用于路由针对双工应用的请求的方法、系统和计算机程序产品。本发明的实施例提供了用于基于轮询机制的双工消息模式的多机器缩放能力机制。客户端请求和轮询可以由不感知会话的负载平衡器分发给运行在机器群集内的服务实例。去往和来自给定客户端的消息可以由群集服务实例中的任何服务实例来访问,这允许服务实例之间的容量横向扩展和无缝的故障转移。协调的入站消息存储被用于使应用请求对特定服务实例亲和。协调的出站消息存储被用于将应用响应从运行该应用的机器路由到轮询请求所到达的机器。另外,服务实例的寿命同入站或出站消息存储去耦合,从而允许客户端-服务器对话可能跨越服务的许多实例。
文档编号G06F9/06GK102792264SQ201180012930
公开日2012年11月21日 申请日期2011年3月4日 优先权日2010年3月10日
发明者J·M·科尔, N·A·艾伦, T·扬丘克, Y·格奥尔吉维 申请人:微软公司