具有并行持久性的消息代理系统的制作方法

文档序号:13080253阅读:160来源:国知局
具有并行持久性的消息代理系统的制作方法与工艺
相关申请的交叉引用本申请要求下述申请的权益:2014年12月1日提交的美国临时申请no.62/086,111;以及2015年11月30日提交的美国申请no.14/954,731;每一个申请以其全文通过引用并入本文。本文描述的主题总体上涉及消息代理计算机系统,并且具体涉及具有并行持久性的主/从消息代理计算机系统。
背景技术
:消息速度和可靠性是针对消息传递应用的关键性能要求。例如,金融市场在速度方面竞争,并且高速贸易能力已经变成针对最大金融服务公司和一些投资基金的性能区分因素。存在针对将它们的全球操作相联系的高效、高吞吐量、低等待时间且更安全的方法的需求。当前解决方案一般利用要求共享数据库/文件系统的主/从代理架构。然而,共享数据库/文件系统远远不是理想的,这是由于其变成单个故障点,使得如果共享数据库/文件系统发生故障,则整个系统停掉——并且数据(例如,代理业务订单)可能潜在地丢失。附图说明图1是图示了根据一个实施例的适于实现消息代理系统的联网计算环境的高级框图。图2是图示了根据一个实施例的代理内的模块的详细视图的高级框图。图3是图示了根据一个实施例的在发生故障的主代理的情况下确定最后稳定消息事件时的不确定性的时间图表。图4a-c是根据一个实施例的使用消息代理系统以处理消息的方法的交互图。图5是图示了根据一个实施例的用于从从代理转变到主代理的方法的流程图。图6a是根据一个实施例的处理消息的消息代理系统的复制流和复制事件储存组件的类图。图6b是根据一个实施例的处理消息的消息代理系统的长期储存组件的类图。图6c是根据一个实施例的处理消息的消息代理系统的事件储存器和消息代理之间的接口。图7是根据一个实施例的适于在图1中描绘的联网环境中使用的计算系统的组件的高级框图。具体实施方式被配置为使用不分享任何事物的架构的主/从消息代理计算机系统的消息代理计算机系统结合高可靠性而提供了低等待时间的消息传递。消息代理计算机系统包括至少三个代理,其中之一被配置为主代理并且其他代理被配置为从代理。消息代理系统包括多个事件储存器。客户端生产者计算机系统向主代理发送用于处理的消息。主代理响应于接收到这样的消息而生成消息事件,并与从代理和事件储存器并行地分发消息事件。事件储存器中的每一个将消息事件存储在持久性储存器中,并向主代理通知消息事件已经被持久存留。因为消息事件持久存留在法定数的事件储存器上,所以主代理将消息视为稳定化的,主代理不需要从从代理获得确认。法定数的事件储存器是至少两个事件储存器。在一些实施例中,法定数可以是事件储存器的大多数。在从代理持久存留消息传递事件之后,其分别通知事件储存器。由于主代理直到消息传递事件被稳定化才采取动作,因此在故障转移的情况下,新主代理能够在不损失数据的情况下重构旧主代理的代理状态。在故障转移(例如,主代理终止操作或针对服务而停掉)的情况下,从代理被配置成从从代理的池中选取新主代理。新选取的主代理能够从事件储存器恢复任何稳定化消息事件。新选取的主代理从事件储存器检索其没有记录的消息事件,并使用消息事件流来识别最大邻接消息事件(mcm)。基于mcm,新主代理使用mcm来识别同步点,该同步点是与mcm相关联的元数据中的反向指针所指向的序列号。新主代理然后重新发布具有高于同步点序列号的序列号的任何消息事件,并将消息代理中的代理状态更新成对应于mcm。随着不同从代理在不同时间处接收到消息事件,从代理可以具有不同代理状态(理想地,它们将是相同的——并反映主代理的代理状态)。重新发布的消息事件包括指示存在新主代理的元数据。从代理被配置成丢弃来自旧主代理的具有比同步点晚的同步号的消息事件。相应地,新主代理能够以不导致稳定化数据的损失的方式在故障之前完全恢复旧主代理的代理状态。各幅图(各图)和以下描述仅作为说明而描述其中消息代理系统被应用于计算机网络的某些实施例。本领域技术人员将从以下描述中认识到,消息代理系统可以被应用于相互关联的元件的其他基于计算机的表示,并且,在不脱离本文描述的原理的情况下,可以采用本文说明的结构和方法的可替换实施例。现在将参照若干实施例,其示例在附图中图示。应当注意,在可实践的任何地方,类似或相似的附图标记都可以被用在各幅图中并可以指示类似或相似的功能。图1是图示了用于促进消息代理计算机系统100的环境的实施例的框图。该环境包括生产者客户端110、消费者客户端120、事件储存器130a、130b和130c、以及从代理140b和140c,每一个通过网络110耦合到主代理140a。这里,图示了仅一个生产者客户端110和消费者客户端120,但在实践中,将存在这些实体中的每一个的许多实例,典型地为数千个或更多实例,从而要求用于在它们之间递送消息的高速且可靠的机制。此外,尽管图示了仅两个从代理和三个事件储存器,但一些实施例包括附加的从代理和/或事件储存器。如本领域技术人员领会和理解的那样,系统和方法以及本文描述的方法固有地且必要地使用在电编码信号上操作的物理有形计算机系统而执行;本文描述的方法和操作在任何情况下都不可以由人类(或人类的组)或通过智力步骤执行。因此,术语“主代理”、“从代理”、“消息代理”、“客户端”和“消息储存器”应被理解为指代物理计算机系统,而不是人类或智力过程。网络105在生产者客户端110、消费者客户端120、事件储存器130a、130b和130c、从代理140b和140c、主代理140a之间提供通信基础设施。网络105典型地是因特网,但可以是任何网络,包括但不限于局域网(lan)、城域网(man)、广域网(wan)、移动有线或无线网、专用网或虚拟专用网。生产者客户端110是执行计算机程序模块(例如,客户端应用)的计算设备,该计算机程序模块将消息传达给主代理140a。消息是数字数据。消息可以是例如代理业务订单、银行交易、温度读数、可由消息代理系统100复制和持久存留的某其他数据、或其某种组合。生产者客户端110可以例如是在耦合到主代理140a的台式计算机上运行的定制应用,该台式计算机正在企业级服务器上运行。在其他实施例中,生产者客户端110是企业的网络服务器,该网络服务器响应于从访问该网络服务器的用户接收到的指令、使用个人计算机、智能电话等上的浏览器应用来生成消息。在一些实施例中,生产者客户端110可以是超级消息传递排队应用和/或java消息传递服务应用。生产者客户端110将消息(例如,股票的销售订单)提供给主代理140a。在一些实施例中,生产者客户端110可以使用从theapachesoftwarefoundation™可得的openwire协议和/或高级消息排队协议(amqp)来与主代理140a通信。消费者客户端120是执行计算机程序模块(例如,客户端应用)的计算设备,该计算机程序模块将消息传达给主代理140a。在一些实施例中,消费者客户端120是企业中的后端服务器,其处理其从主代理140a接收到的消息。在一些实施例中,消费者客户端120可以与调节器或将消息发送到调节器的计算设备相关联。在一些实施例中,消费者客户端120可以是超级消息传递接收器应用和/或java消费者应用。在一些实施例中,消费者客户端120可以使用amqp和/或openwire协议来与主代理140a通信。如针对与主代理计算机系统(例如,与amqp或openwire协议)的互操作而配置的那样,客户端110、120的操作和功能扩展超出一般计算机系统的基本一般功能。事件储存器130a、130b、130c是数据储存器,其每一个都包括一个或多个非瞬变计算机可读介质且被配置成存储从主代理140a接收到的消息事件。一旦事件储存器130a、130b、130c已经存储(也被称作持久存留)消息事件,事件储存器130a、130b、130c就向主代理140a通知使用稳定性通知成功地持久存留了消息事件。在其中代理正在从从代理转变到主代理的实施例中,事件储存器130a、130b、130c还将同步信息提供给新选取的主代理。同步信息包括消息的序列信息,该序列信息包括已在该多个事件储存器130a、130b、130c中的每一个上持久存留的消息事件的最高序列号。事件储存器130a、130b、130c还可以将一个或多个所存储的消息事件提供给新选取的主代理。代理140a、140b、140c包括一个主代理,并且其余代理是从代理。在该示例中,代理140a是主代理,并且代理140b和140c是从代理。然而,任何代理具有充当主代理或从代理的能力。此外,在主代理140a发生故障的情况下,其余从代理140b、140c之一被从代理选择为新主代理。下面关于图4进一步详细描述主选取过程。如本文描述的操作和功能所配置的那样,代理140提供了扩展超出一般计算机系统的基本一般功能的特征和功能。例如,传统一般计算机系统不作为其指令集、操作系统软件、实用软件或其他应用的一部分而提供用于在现有主代理的故障转移的情况下从多个从代理中选取新主代理的功能。代理140a、140b和140c中的每一个分别包括持久性储存器142a、142b和142c。持久性储存器142a、142b、142c包括一个或多个非瞬变计算机可读介质,且被配置成存储消息事件。由持久性储存器142a、142b、142c存储的数据包括描述关联代理140的代理状态的信息。例如,持久性储存器142将包括描述主代理140a的代理状态的信息,持久性储存器142b将包括描述从代理142b的代理状态的信息,等等。代理状态是已在该代理处持久存留的消息事件流的表示——且实际上描述每一个消息事件的净状态。如上所指示,主代理140a生成消息事件。消息事件可以是许多不同类型(例如,入队、指派、消费、交易事件、管理事件(诸如创建或删除目的地队列)等)之一。主代理140a可以响应于接收到来自客户端生产者110、消费者生产者120的消息、来自事件储存器130a、130b、130c中的至少两个的针对特定消息事件的稳定化通知等,生成消息事件。主代理140a将所生成的消息事件分发给从代理140b、140c和事件储存器130a、130b、130c。消息事件(还可以被称作复制事件)是连同由主代理140a添加的附加元数据一起从生产者客户端110接收到的消息。元数据包括以下数据字段:最后稳定序列号、最后稳定时期、以及序列号。时期和序列号字段表示唯一消息事件标识符。每当新主代理被选取时,时期递增,并且每当新消息事件被该主代理发布时,序列号递增(且在改变时期时重置到0)。“最后稳定”字段指示对主代理来说在其发送“新”消息事件时已知的最后稳定消息事件。例如,假定(时期0,序列号17)处的消息事件是由主代理140a发布的入队消息事件,指示生产者客户端110正在试图将持久性消息添加到代理中的队列。紧接在将该消息事件分发给事件储存器130a、130b、130c和从代理140b、140c之后,主代理140a不具有指示该消息事件在任何地方是否稳定的任何信息。然而,一旦事件储存器130a、130b、130c将稳定性通知发送回到主代理140a,代理140a就将指示(时期0,序列号17)处的消息事件(在盘上)稳定的信息存储在事件储存器130a、130b、130c中的一个或多个处。当其发布其下一个消息事件(时期0序列号18)时,主代理140a会在该下一个消息事件中将最后稳定时期和最后稳定序列号分别设置成0和17,以指示直到(且包括)时期0序列号17的先前事件现在稳定。主代理140a是消息传递系统中的被配置成对消息事件的元数据进行处理且响应于这样的元数据而选择性地实施动作的仅有实体。这简化且减少了可在下述消息传递系统中出现的状态的该数目:在该消息传递系统中,利用处理逻辑将每一个实体配置成选择性地对消息元数据实施动作。在一个实施例中,由主代理140a进行的每次确定是通过下述操作来作出的:等待至少两个不同事件储存器130a、130b或130c指示已经对事件进行稳定化。一旦至少两个不同消息储存器130a、130b或130c已经指示消息事件被稳定化,主代理140a就被配置成对消息事件采取外部动作并在持久性储存器142a中更新其代理状态。附加地,主代理140a向从代理140b、140c和事件储存器130a、130b、130c分发描述最后消息传递事件的信息,该主代理140a已经通过周期性地发送出稳定性事件来确定该最后消息传递事件为经过稳定化的,该稳定性事件标识已被稳定化的最后消息传递事件的序列号和时期号。在恒定活动的状态中,主代理140a不需要发送出周期性稳定性事件,这是因为其将包括该信息作为每一个传出消息事件的一部分。相应地,从代理140b、140c可以将存储器中保持的消息事件安全地应用于其盘持久性层(即,持久性储存器),并且从代理可以利用该信息以在故障转移过程期间变成主代理时标识清洁切换点。主代理140a和从代理140b、140c中的每一个维持代理状态。如上所讨论,代理状态是已在该代理处持久存留的消息事件流的表示——且实际上描述每一个消息事件的净状态。例如对于特定消息,入队消息事件、后跟有指派消息事件、后跟有消费消息事件可能导致对于该消息而言总体上为空的代理状态。相比而言,对于第二消息,可能已经生成仅入队消息事件,使得代理状态示出作为与第二消息相关联的当前状态的入队事件。图2是图示了图1中描绘的代理140a、140b和140c(在该章节中被称作代理140)内的模块的详细视图的高级框图。代理140的一些实施例具有与这里描述的那些模块不同的模块。类似地,可以以与这里描述的方式不同的方式在模块之间分发功能。代理140由包括持久性储存器142、持久性模块220、主选取模块230和恢复模块240的模块组成。持久性储存器142包括一个或多个非瞬变计算机可读介质,且被配置成在持久存留消息事件时存储代理140所使用的数据。持久性储存器142所存储的数据包括描述代理状态的信息。持久性储存器142的附加功能包括:基于代理状态来存储消息传递事件;周期性地将消息传递事件的流上滚到表示该时间处的快照的状态中,并且然后将该快照存储到持久性储存器;在应用新消息传递事件之前检索消息传递事件的快照;应用来自快照的复制事件或存储在存储器中的事件;以及其他这样的功能。持久性模块220在作为主代理140a或者从代理140b或140c的操作期间控制代理140的操作。在一个实施例中,持久性模块220可以执行针对主代理的功能。针对主代理的功能包括:生成交易事件,诸如添加、指派或消费消息事件或者添加或删除目的地事件。随着消息事件被生成,主代理持久性模块220将复制事件消息并行地发送到从代理和事件储存器。一旦复制事件消息被发送出,持久性模块220就等待来自事件储存器的稳定性通知。稳定性通知是来自从代理或事件储存器的关于已经在其储存器中持久存留消息事件的确保。在从法定数(即,预定义数目)的事件储存器(例如,2个事件储存器)接收到稳定性通知时,持久性模块220确定消息事件已经被持久存留,并将其传达给消息事件的生产者客户端110。形成法定数的数目是可配置的,即,其可以被设置成3个、4个或任何其他数目的事件储存器。对于主代理的持久性模块220所生成的每个消息事件,其将与先前稳定化的消息事件相关联的信息应用于消息事件的元数据。附加地,主代理的持久性模块220周期性地生成包括与最后稳定消息事件相关联的信息的稳定性消息事件。持久性模块220进一步将消息事件发送到消费者客户端120,并等待来自消费者客户端120的关于其已经消费消息的肯定应答。持久性模块220然后生成其向从代理和事件储存器分发的移除消息事件。在接收到针对移除消息事件的稳定性通知时,主代理的持久性模块220从主代理140a的内部存储器中移除消息事件。在一个实施例中,持久性模块220可以执行针对从代理的功能。在从主代理接收到消息事件时,从代理140b或140c的持久性模块220将其保持在内部存储器中。所接收到的消息事件包括元数据,该元数据包含与对主代理来说已知的最后稳定事件相关联的信息。持久性模块220提取包括在元数据中的信息,以检索指向最后稳定消息事件号的反向指针。从代理的持久性模块220将反向指针连同当前消息事件(也被称为当前消息事件流的快照)一起应用于持久性储存器142。在从代理破损或必须被重启的情况下,该从代理可能领先于或落后于其他代理且因而具有不一致状态。从代理的持久性模块220有助于当从代理经由复制流协议再次出现回来时实现代理状态的一致性。例如,在从代理在任何其他代理或事件储存器之前接收到复制消息事件的仅部分的情况下,不在从主代理接收到与消息的快照相关的附加信息之前应用消息事件。如果从代理停掉达较小时间段,则从代理处的消息事件流几乎与由主代理分发的复制消息事件流同步。持久性模块220可以从事件储存器之一恢复丢失的消息事件,从而导致从代理与传出的复制消息事件流一致。在从代理停掉达较长时间段的情况下,从代理远远落后于当前复制消息事件流,恢复模块240被用于通过从代理入位过程来恢复从代理的状态。恢复模块240可以在主代理的故障转移的情况下恢复在先主代理的代理状态,或者在从代理的故障转移或重启的情况下恢复从代理的代理状态。在主代理的故障转移情况下,下面详细描述的主选取模块230将从代理之一选取为新主代理。一旦新主代理被选取,恢复模块240就帮助将从代理状态转变到在先主代理的代理状态。恢复模块240确定复制流切换点,即,来自复制流的定义主代理将其标记为稳定(即,主代理接收到针对复制流中的所确定的消息事件的法定数的稳定性通知)的最后事件的序列号。由于主代理已经发生故障,因此主代理需要被重启或被修复。这使从主代理检索最后稳定消息事件不方便且耗时。基于复制流协议,主代理关于每一个消息事件生成与最后稳定消息事件相关联的信息。当主代理发生故障时,消息事件可以在飞行中。基于飞行中的消息事件,下面描述确定最后稳定消息事件的实施例。图3是图示了根据一个实施例的在发生故障的主代理的情况下确定最后稳定消息事件时的不确定性的时间图表。在图3的示例实施例的情况1中,事件储存器ump3是具有所有飞行中的消息的仅有事件储存器。如果主代理和事件储存器ump3同时发生故障,则不存在用于确定ms是最后稳定消息310的方式,在上面的情况中,最后良好点315是mx。在示例实施例的情况2中,事件储存器ump2具有一些飞行中的消息,其所具有的最后消息(消息mk)反向指向最后稳定消息310ms。事件储存器ump3具有所有飞行中的消息。如果主代理和事件储存器ump3同时发生故障,则消息mk是事件储存器ump守护进程之间的最后可用消息,并且其反向指向最后稳定消息ms。消息[ms+1,mk]的状态将不是已知的。最后良好点是ms。从上面的示例实施例注意到,在确定最后稳定消息时存在不确定性。已知良好点后的消息事件可以被稳定化或可以不被稳定化。为了克服消息事件的状态的不确定性,如果存在间隙(即,没有事件储存器具有特定消息事件),则在已知良好点后可被稳定化或可不被稳定化的消息事件的范围来自直到间隙前的最后消息的已知良好点的下一个消息事件。因此,为了恢复消息事件流,观察最大邻接消息(mcm),即,在遇到序列号间隙前观察到的最高序列号的消息。同步点进一步被确定为mcm的反向指针。同步点是流切换点。新主代理将利用针对所选取的主代理而确定的新时期号重新发布从同步点直到mcm的所有消息事件。另外,新主代理将在直到mcm的持久性储存器上更新其快照,并将其代理存储器状态重构为与mcm一致。一旦代理状态被恢复,主代理就可以开始生成消息事件并重新开始主代理的角色。在另一实施例中,恢复模块240在从代理的故障转移或重启的情况下恢复从代理的代理状态。像不具有持久性或代理状态的新从代理那样对待破损的从代理。来自未破损的现有从代理的盘快照被拷贝过去到新的或破损的从代理。不具有状态的新代理将接收实况流且将暂时中止对其盘快照的周期性更新。现有代理将继续接收复制流,且还将暂时中止对其盘快照的周期性更新。现有代理然后将试图将整个盘快照发送到新代理。如果传输成功,则所有两个从代理均将具有相同的盘快照,且均将开始将来自存储器的它们的“经缓存的”事件应用于盘快照,且最终均将赶上实况流。主选取模块230确定故障转移发生,并将从代理140b、140c之一选取为新主代理。在一些实施例中,主代理以周期性间隔将心跳信号发送到主选取模块230,例如,每毫秒发送心跳。周期性间隔是预定义的且是可配置的。主选取模块230经由缺少心跳信号达预定义超时间隔(例如,如果未接收到信号达一秒)而检测到主代理的故障。主选取模块230进一步跟踪可被选取为主代理的有资格从代理的列表。在检测到主代理时,主选取模块230从所跟踪的有资格代理列表中选取新主代理。在一些实施例中,主选取模块230利用raft协议以从所跟踪的列表中选取新主代理。在主选取模块230选取新主代理的时间中,暂时的代理状态由恢复模块240创建,恢复模块240可以帮助从代理恢复发生故障的主代理的消息事件,并恢复发生故障的主代理的代理状态以将其应用于新选取的主代理。图4a-c是根据一个实施例的使用消息代理系统以处理消息的方法的交互图。在各种实施例中,该方法可以包括与结合图4a-c描述的那些步骤相比不同和/或附加的步骤。附加地,在一些实施例中,可以按与结合图4a-c描述的次序不同的次序执行步骤。生产者客户端110将消息402发送到主代理140a。主代理140a基于所接收到的消息来生成入队事件。所生成的入队事件包括元数据,该元数据包括最后稳定消息事件的序列号、与发送了最后稳定消息事件的主代理140a相关联的时期号、入队事件的序列号(例如,序列号1)和与主代理140a相关联的时期号。主代理140a将入队事件并行地分发404给从代理140b、140c以及消息传递源130a、130b和130c。在一些实施例中,可以以串行方式或者并行和串行分发的某种组合来进行入队事件的分发。主代理140a将入队事件保持406在存储器中。类似地,一旦从代理140b、140c接收到所分发的入队事件,它们就还将入队事件保持408、410在存储器中。事件储存器130a、130b、130c接收入队事件,并将入队事件存储412、414、416在它们相应的永久存储器中。一旦事件储存器将入队事件存储在永久存储器中,其就向主代理140a发送已经持久存留入队事件的通知418。因此,取决于消息储存器130a、130b或130c是否能够成功地持久存留入队事件,主代理140a可能未接收到通知418、接收到通知418中的一个、一些或全部。一旦主代理140a已经接收到至少两个通知418,主代理140a就确定入队事件被稳定化,并且因此,其将入队事件存储420在其长期储存器(即,持久性储存器142)中。响应于确定入队事件被稳定化,主代理140a向生产者客户端110发送消息被持久存留422的通知。主代理140a生成指派事件。所生成的指派事件包括元数据,该元数据包括最后稳定消息事件(入队事件)的序列号、与发送了最后稳定消息事件的主代理(主代理140a)相关联的时期号、指派事件的序列号(例如,序列号2)和与主代理140a相关联的时期号。主代理140a将指派事件并行地分发424给从代理140b、140c以及消息传递源130a、130b和130c。主代理140a将指派事件保持426在存储器中。一旦从代理140b、140c接收到所分发的指派事件,它们就更新428、430它们相应的代理状态。具体地,每一个从代理140b、140c持久存留(例如,向持久性储存器142移动)被保持在它们相应的存储器中的入队事件,且然后将指派事件保持在它们相应的存储器中。一旦从代理140b、140c持久存留入队事件,从代理140b、140c就将持久存留的事件的肯定应答432发送到所有事件储存器130a、130b、130c。事件储存器130a、130b、130c存储肯定应答432。事件储存器130a、130b、130c接收指派事件,并将指派事件存储434、436、438在它们相应的永久存储器中。一旦事件储存器将指派事件存储在永久存储器中,其就向主代理140a发送指派事件已经被持久存留的通知440。一旦主代理140a已经接收到至少两个通知440,主代理140a就确定指派事件被稳定化,且因而将指派事件存储442在其长期储存器中。在可替换实施例中,主代理140a可以利用指派事件简单地盖写442长期储存器中的入队事件。响应于确定指派事件被稳定化,主代理140a将消息发送444到消费者客户端120(例如,对其从主代理140a接收到的订单进行处理的企业中的后端服务器)。消费者客户端120发送其已接收到消息的肯定应答446。主代理140a生成消费事件。所生成的消费事件包括元数据,该元数据包括最后稳定消息事件(指派事件)的序列号(例如,序列号2)、与发送了最后稳定消息事件的主代理(主代理140a)相关联的时期号、指派事件的序列号(例如,序列号3)和与主代理140a相关联的时期号。主代理140a将消费事件并行地分发448给从代理140b、140c以及消息传递源130a、130b和130c。主代理140a将消费事件保持450在存储器中。一旦从代理140b、140c接收到所分发的消费事件,它们就更新452、454它们相应的代理状态。具体地,每一个从代理140b、140c持久存留被保持在它们相应的存储器中的指派事件,且然后将消费事件保持在它们相应的存储器中。在可替换实施例中,从代理140b、140c可以利用指派事件简单地盖写长期储存器中的入队事件。一旦从代理140b、140c持久存留指派事件,从代理140b、140c就将持久存留的事件的肯定应答456发送到所有事件储存器130a、130b、130c。事件储存器130a、130b、130c存储肯定应答356。事件储存器130a、130b、130c接收消费事件,并将消费事件存储458、460、462存储在它们相应的永久存储器中。一旦事件储存器将消费事件存储在永久存储器中,它就向主代理140a发送消费事件已经被持久存留的通知464。一旦主代理140a已经接收到至少两个通知464,主代理140a就将消费事件视为被稳定化,并将消费事件存储466在其长期储存器中。在可替换实施例中,主代理140a可以简单地从存储器中删除消费事件并从长期储存器中移除466入队事件和/或指派事件。注意,在处理流程中的该点处,主代理已经移除经稳定化的消费消息事件,但是从代理140b、140c仍然将消费消息事件保持在存储器中。在高活动的时段中,由主代理140a生成且被分发给从代理140b、140c的下一消息事件将使它们更新它们相应的代理状态。然而,如果在消息事件之间存在延迟,则主代理140a可以生成稳定性事件468并将稳定性事件468分发给从代理140b、140c以及事件储存器130a、130b、130c。稳定性消息包括元数据,该元数据包括最后稳定消息事件(消费事件)的序列号(例如,序列号3)、与发送了最后稳定消息事件的主代理(主代理140a)相关联的时期号、稳定性事件的序列号(例如,序列号4)和与主代理140a相关联的时期号。主代理140a将稳定性事件并行地分发468给从代理140b、140c以及消息传递源130a、130b和130c。一旦从代理140b、140c接收到所分发的稳定性事件,它们就更新它们相应的代理状态。具体地,每一个从代理140b、140c持久存留被保持在它们相应的存储器中的消费事件。在可替换实施例中,从代理140b、140c可以简单地从存储器中移除消费事件并从长期储存器中移除入队事件和指派事件。从代理140b、140c还可以利用消费事件简单地盖写入队事件和/或指派事件。一旦从代理140b、140c持久存留470、472消费事件,从代理140b、140c就将持久存留的事件的肯定应答474发送到所有事件储存器130a、130b、130c。事件储存器130a、130b、130c存储肯定应答474。图5是图示了根据一个实施例的用于从从代理转变到主代理的方法的流程图。在一个实施例中,图5的过程由代理140执行。在其他实施例中,其他实体可以执行该过程的步骤中的一些或全部。同样地,实施例可以包括不同和/或附加步骤,或者可以按不同次序执行步骤。代理140接收505从从代理到主代理的代理状态改变的通知。例如,前一主代理140a可能已经发生故障,并且在自最后通信起已经过去具体时间之后,从代理140b、140c使用它们相应的主选取模块240将从代理之一(例如,140b)选取为新主代理——在该部分中被称作代理140。时期号递增以指示新代理140时期已经被启动。代理140识别510基本值,该基本值是消息传递代理上的持久性储存器中的消息事件的最高序列号。例如,序列信息可以指示{509}是处于代理140的持久性储存器142中的消息的序列号的最高值。代理140从多个事件储存器130a、130b、130c检索515序列信息。序列信息描述了已在该多个事件储存器130a、130b、130c中的每一个上持久存留的消息事件的最高序列号。例如,最高序列号可以是分别用于事件储存器130a、130b和130c的值{510,512,514}。代理140基于基本值和序列信息来确定520要检索的消息事件集合。具有低于基本值的序列号的消息已经由代理140跟踪。如果基本值等于在序列信息中描述的最高序列号,则代理140是最新的。然而,典型地是下述这种情况:在旧主代理140a离线之前,存在尚必须被稳定化的一些消息被发送出。相应地,代理140的代理状态同样稍稍落后于旧主代理140a的代理状态。通过使用来自各种消息储存器的序列信息,新的所选取的代理140能够恢复更旧的主代理140a的状态。继续以上示例,序列信息包括分别用于事件储存器130a、130b和130c的值{510,512,514},并且基本值是{509}。相应地,代理确定其应当从事件储存器130a、130b和130c中的一个或多个检索消息事件{510-514},这是由于该消息集合覆盖了从序列号{509}处的基本值消息到序列号{514}处的最高稳定化消息的整个消息集合。例如,表1图示了哪些消息事件存储在相应事件储存器130a、130b和130c中的每一个中。表1中的单元值指示与消息事件相关联的反向指针和序列号,该反向指针指向最后稳定化消息事件。例如,“509(507)”表示序列号{507}和指向序列号{507}的反向指针,当事件储存器130a、130b和130c存储了与序列号509相关联的消息事件时,该反向指针与最后稳定化消息事件相关联。事件储存器序列号(反向指针)序列号(反向指针)序列号(反向指针)序列号(反向指针)序列号(反向指针)序列号(反向指针)130a509(507)510(508)130b509(507)510(508)511(509)512(510)130c509(507)510(508)511(509)512(510)513(512)514(512)表1:消息的示例分配——序列号中无间隙。代理140从该多个事件储存器中的一个或多个检索525消息事件集合。在一些实施例中,代理140以循环方式检索消息事件集合,使得代理140从特定事件储存器检索一个消息,从不同的事件储存器检索下一消息事件,且从不同的事件储存器检索下一消息事件,等等,从而减小任何一个储存器上的负载。如果所请求的消息事件具有比存储在事件储存器上的消息事件中的任一个的序列号高的序列号,则代理140不从消息代理130请求消息事件。继续以上示例,代理140将仅从事件储存器130c请求消息事件{513}和{514},这是由于事件储存器130a和130b仅分别具有最多{510}和{511}的消息事件,从而在事件储存器130a、130b和130c之间分发负载。在该示例中,所检索的消息集合可以包括具有序列号{511-514}的消息事件。注意,与序列号509相关联的消息事件不需要被请求,这是由于基本号是509——相应地,代理140的代理状态已经被更新到与序列号509相关联的消息传递事件。在可替换事件中,可以从单个储存器(例如,消息储存器130c)检索所有消息事件。代理140至少部分地基于所检索的消息事件集合来组装530消息事件流。代理140通过按所接收到的集合中的消息事件相应的序列号对这些消息事件进行排序来创建消息事件流。例如,可以将可能的消息事件流排序为{510,511,512,513,514}。对消息事件进行排序以标识序列号中的任何间隙。注意,在一些实例中,如果所请求的消息集合中的一个或多个丢失,则在从多个消息储存器130a、130b、130c接收到的序列号中可能存在间隙。例如,包括间隙的可能消息事件流可以是{510,512,513,514},其丢失消息传递事件{511}。如果例如一个或多个消息储存器未能从主代理140接收到消息事件,则间隙可能出现。代理140使用消息事件流来识别535最大邻接消息事件(mcm)。mcm是代理140可在遇到序列号中的间隙之前恢复的具有最高序列号的稳定化消息事件。在不存在间隙的情况下,mcm简单地是消息事件流中具有最高序列号的稳定化消息事件。例如,假定不存在间隙,则与序列号{512}相关联的消息事件是mcm,这是由于其为也被稳定化(存储在至少两个事件储存器上)的具有最高序列号的消息事件。可替换地,如果消息事件流包括了间隙——例如,如表1中描绘的相同流——除了不存在针对序列号{511}的条目,则mcm将是与序列号{510}相关联的消息事件,这是由于其为在序列号中出现间隙之前的最高稳定化消息。代理140使用mcm来识别540同步点。mcm包括元数据,该元数据包括指向最后稳定消息的反向指针(即,最后稳定消息的序列号)。消息传递事件的同步号由mcm的反向指针所指向。继续其中mcm具有序列号{512}的以上示例,代理140将检索与该消息相关联的元数据中的标识最后稳定消息(例如,具有序列号{510}的消息事件)的反向指针。相应地,同步点将是序列号{510}。代理140重新发布545具有高于同步点序列号的序列号的任何消息事件。代理140通过下述操作来重新发布消息事件:使用新时期号和新同步号重新生成具有高于同步点序列号的序列号的消息事件;以及然后将重新生成的消息事件分发给所有从代理和所有事件储存器130a、130b、130c。例如,假定同步点是具有序列号{503}的消息,则代理140会将具有序列号{504,506,507}的消息事件重新发布给所有事件储存器130a、130b、130c和其余从代理140c。从代理(例如,140c)响应于接收到具有不同时期号的重新发布的消息事件,丢弃同步点后的所有消息事件并忽视来自在先主代理的任何未来消息。并行地,代理140将其代理状态更新550直到mcm。在此时,所有代理140a、140b和140c以及所有消息储存器130a、130b和130被完全同步。即使不存在一个共享中央消息储存库,也实现了这一点。图6a是根据一个实施例的处理消息的消息代理系统的复制流和复制事件储存器组件的类图。复制流事件储存器组件包括umpersistenceadapter(um持久性适配器)类605、replicatingmessagestore(复制消息储存器)类610、replicationstream(复制流)类615和replicatingtransactionstore(复制交易储存器)类620。umpersistenceadapter605实现replicatingmessagestore610和replicatingtransactionstore620,以确保首先使用ump接口来复制被写入到盘的持久性数据消息以在没有集中式储存库的情况下支持主/从消息代理系统。随着生产者或消费者客户端与主代理交互以发送消息事件,activemq代理将调用replicatingmessagestore的方法(即,addmessage(添加消息)、removemessage(移除消息)等)。replicationstream类615方法被umpersistenceadapter605的所有replicatingmessagestore620使用。例如,来自代理的“addmessage”命令将在replicatingmessagestore620中创建addmessagereplicationevent(添加消息复制事件),并且事件被发送到replicationstream615类的“复制”方法。replicationstream615中的复制方法会将来自源的消息事件分发给系统中的从代理和该多个事件储存器。因此,replicationstream类615用于发送/接收在主代理中出现的经复制的事件。主代理通过标准事件储存器接口(诸如“创建新队列目的地”或“移除现有队列目的地”)来执行被复制到从代理的各种管理事件。将通过复制流协议来对由主代理作出的决定进行定序和复制。实际盘持久性由于从replicationstream615接收到复制事件而发生。长期储存器接口被实现以允许不同实现方式将数据写入到盘。图6b图示了根据一个实施例的处理消息的消息代理系统的长期储存器组件的示例类图。长期储存器组件包括replicationstreamlongtermstorage(复制流长期储存器)类635、persistenceadapterbasedlongtermstorage(基于持久性适配器的长期储存器)类640和longtermstoragereplicationstreamlistener(长期储存器复制流监听器)645类。一旦复制事件消息被发送到每一个从代理,从代理处的接收器就将消息事件发送到replicationstreamlisterner(复制流监听器)645。replicationstreamlistener之一(即,longtermstoragereplicationstreamlistener645)将取得每一个消息事件并将其传递到长期储存器持久性适配器,即,persistenceadapterbasedlongtermstorage640。persistenceadapterbasedlongtermstorage640类将使用addmessage方法来执行消息事件到长期储存器的实际持久存留。图6c是根据一个实施例的处理消息的消息代理系统的消息代理和事件储存器之间的接口650的示例。如图6c中所示,消息传递队列复制接口被持久性适配器以及其他消息传递和事件储存器组件用于执行与复制流协议相关的方法。例如,republishreplicationevent(重新发布复制事件)方法655被复制流在将从代理转变到主代理的情况下使用,以便一旦同步点被确定就重新发布消息事件。类似地,复制接口中描述的其他方法被消息传递系统组件之一在执行复制流协议时使用。图7是图示了用于实现图1中所示的实体的示例计算机700的高级框图。所图示的是耦合到芯片集710的至少一个处理器705。还耦合到芯片集710的是存储器715、储存设备720、键盘725、图形适配器730、指点设备735和网络适配器740。显示器745耦合到图形适配器530。在一个实施例中,芯片集710的功能由存储器控制器中枢750和i/o控制器中枢755提供。在另一实施例中,存储器715直接耦合到处理器705而不是芯片集710。储存设备720是任何非瞬变计算机可读储存介质,诸如硬盘驱动器、致密盘只读存储器(cd-rom)、dvd或固态存储器设备。存储器715保持处理器705所使用的指令和数据。指点设备735可以是鼠标、轨迹球或其他类型的指点设备,且结合键盘725而使用以将数据输入到计算机700中。图形适配器730在显示器745上显示图像和其他信息。网络适配器740将计算机700耦合到网络(例如,图1的网络105)。如本领域中已知的那样,计算机700可以具有与图7中所示的组件相比不同和/或其他的组件。附加地,计算机700可以缺少某些所图示的组件。例如,计算机700可以缺少键盘725、指点设备735、图形适配器730和/或显示器745。作为另一示例,被配置成显示体育场视图可视化的计算机700可以是具有触摸屏界面的平板或智能电话,且因而缺少键盘725和指点设备735。此外,储存设备720可以是本地的和/或对计算机700来说远程的。如本领域中已知的那样,计算机700被适配成执行用于提供本文描述的功能的计算机程序模块。如本文所使用,术语“模块”指代被用于提供指定功能的计算机程序逻辑。因此,可以以硬件、固件和/或软件实现模块。在一个实施例中,程序模块存储在储存设备720上、被加载到存储器715中以及由处理器705执行。本文描述的物理组件的实施例可以包括与这里描述的模块相比其他和/或不同的模块。附加地,在其他实施例中,归于模块的功能可以由其他或不同模块执行。此外,出于清楚和方便的目的,该描述偶尔省略术语“模块”。附加配置考虑以上描述的一些部分在算术过程或操作方面描述了实施例。这些算术描述和表示普遍被数据处理领域技术人员使用以将他们的工作的实质有效地传达给该领域其他技术人员。这些操作在功能上、计算上或逻辑上描述时被理解为由计算机程序实现,该计算机程序包括供处理器或等效的电路、微代码等等执行的指令。此外,将功能操作的这些布置称作模块有时也已证明是方便的,而不失一般性。所描述的操作及其关联模块可以以软件、固件、硬件或其任何组合体现。如本文所使用,对“一个实施例”或“实施例”的任何引用意味着:结合该实施例描述的特定元件、特征、结构或特性被包括在至少一个实施例中。短语“在一个实施例中”在说明书中各处的出现不必然全部指代相同实施例。可以使用表述“耦合”和“连接”连同其派生词来描述一些实施例。应当理解,这些术语不意图作为彼此的同义词。例如,可以使用术语“连接”来描述一些实施例,以指示两个或更多个元件彼此直接物理或电气接触。在另一示例中,可以使用术语“耦合”来描述一些实施例,以指示两个或更多个元件直接物理或电气接触。然而,术语“耦合”还可以意味着:两个或更多个元件不彼此直接接触,但仍彼此协作或交互。实施例在该上下文中不受限制。如本文所使用,术语“包含”、“包含有”、“包括”、“包括有”、“具有”、“具有着”或其任何其他变形意图覆盖非排他的包括。例如,包含元件列表的过程、方法、物件或设备不必然限于仅那些元件,而是可以包括未明确列出或者对这样的过程、方法、物件或设备来说固有的其他元件。另外,除非明确地相反声明,“或”指代包括性的或,且不指代排他性的或。例如,条件a或b被以下各项中的任何一个满足:a为真(或存在)且b为假(或不存在);a为假(或不存在)且b为真(或存在);以及a和b均为真(或存在)。附加地,“一”或“一个”的使用被采用以描述本文的实施例的元件和组件。这仅是为了方便且为了给出本公开的一般意义而进行的。该描述应当被解读成包括一个或至少一个,并且单数也包括复数,除非明显以其他方式意指。在阅读本公开后,本领域技术人员将领会用于消息代理系统的另外附加可替换结构和功能设计。因此,尽管已经说明和描述了特定实施例和应用,但应当理解,所描述的主题不限于本文公开的精确构造和组件,并且,可以在本文公开的方法和设备的布置、操作和细节中作出对本领域技术人员来说将显而易见的各种修改、改变和变形。本发明的范围不应仅受所附权利要求限制。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1