适应随机发生的事件延迟的可变性时序表的制作方法

文档序号:12071207阅读:203来源:国知局
适应随机发生的事件延迟的可变性时序表的制作方法与工艺

本申请要求第62/028,999号美国申请的2014年7月25日优先权日的权益。

技术领域

本公开涉及事件处理,并且特别地涉及响应于事件来更新变量。



背景技术:

典型的计算机系统接收事件并响应于这些事件更新状态。

状态可以由表示各种实体的帐户余额(account balance)的一组状态变量组成。在这种情况下,事件可以是由一个实体进行的取款(withdrawal)或转帐(transfer)。响应于事件,可能需要通过更新一个或多个状态变量来改变状态。

在许多情况下,状态是确定性的。这意味着如果在某个时间之前的所有事件是已知的,并且所有这些事件以正确的顺序处理,则状态将是已知的。

遗憾的是,不能保证事件将以正确的顺序到达。结果,计算机认为状态是什么的记录状态将不一定总是匹配实际状态,记录状态是计算机在已经以正确的顺序接收到相关事件的情况下将记录的状态。

在复杂事件处理(Complex Event Processing,CEP)系统中,例如,处理事件流,而同时基于结果采取动作。用于CEP系统的一组工作数据可以包括基于接收到的事件数据(例如,诸如数据库请求、天气数据或交通数据的事件数据)的不同的相应流来操作的不同状态变量。各个事件的原始序列的顺序可能对要执行的处理具有影响。在一些情况下,如果事件的处理不按顺序发生,则由状态变量反映的状态可能是不正确的。

校正状态的过程并不那么简单,特别是在多核或多节点环境中。在许多情况下,更新状态将涉及更新工作存储器中的多个状态变量。这增加了在彼此依赖以向前进展的两个不同更新计算之间发生死锁的风险。为了减轻这种死锁风险,一些系统使用一种形式的并发控制(例如,使用锁定和两阶段提2的消极并发控制,或者没有锁定但是具有非本地验证过程的积极并发控制)。此外,整个系统应当足够弹性以至少能够承受节点或核的故障,并且在这样的故障之后恢复状态。

事件处理的常规方法涉及合并复杂且耗时的分布式算法的容错分布式数据库。构建这样的系统并使其通常难以在高峰值服务水平下执行良好(例如,具有低等待时间)。例如,使其以亚毫秒响应性在每秒百万次事件的水平执行是一个至少无法企及的前景。



技术实现要素:

一方面,一般来说,一种用于使计算系统处理来自事件序列的多个事件的方法,所述事件序列独立于通过输入设备或端口接收这些事件的顺序来定义所述多个事件的正确顺序,包括:定义第一变量,为所述第一变量定义与接收到的事件相关联的对所述第一变量的操作的第一时序表,接收属于所述第一变量的第一事件,对所述第一变量执行第一操作,其中所述第一操作导致所述第一时序表的第一次更新,在接收到所述第一事件之后,接收属于所述第一变量的延迟事件,对所述第一变量执行第二操作,其中所述第二操作导致所述第一时序表的第二次更新,以及确定所述第一次更新是有效的还是无效的,其中所述延迟事件在所述序列中位于所述第一事件之前,其中所述第一次更新基于所述第一事件,以及其中所述第二次更新基于所述延迟事件。

在一些实施例中,确定所述第一次更新是有效的还是无效的包括:确定所述第一次更新是有效的。在这些实施例中有些实施例,其中确定所述第一次更新是有效的包括:确定所述第一次更新是在所述第一次更新之前插入写操作。有些实施例,其中确定所述第一次更新是有效的包括:确定所述延迟事件导致在所述第一次更新之前插入读取操作。有些实施例,其中确定所述第一次更新是有效的包括:确定所述延迟事件需要在所述第一次更新之前插入更新操作。

在所述方法的一些实施例中,确定所述第一次更新是有效的包括:确定所述第一次更新不受所述第二次更新的影响。

在一些实施例中,其中确定所述第一次更新是有效还是无效的包括:确定所述第一次更新受所述第二次更新的影响,并且响应于确定所述第一次更新是无效的而撤销所述第一次更新。

在其它实施例中,确定所述第一次更新是有效的还是无效的包括:确定所述第一次更新受所述第二次更新影响,使得所述第一次更新是无效的。在这些实施例中有些实施例,其中确定所述第一次更新受所述第二次更新影响包括:确定所述延迟事件需要在对应于所述第一次更新的时序表条目之前插入指示包括写入所述第一变量的操作的时序表条目。有些实施例,其中确定所述第一次更新受所述第二次更新的影响包括:确定所述延迟事件需要更新位于对应于所述第一次更新的时序表条目之前、指示对所述第一变量的操作的现有时序表条目。

在一些情况下,所述事件序列的所述正确顺序是部分排序的,并且所述方法的实施例包括使所述事件序列被完全排序。

在替代实施例中,接收所述第一事件包括:从一组完全排序的事件接收所述事件。

在所述方法的实施例中,一些实施例还包括:检测所述第一时序表中的数据丢失(例如,存储在经历故障的设备或节点上的第一时序表的一部分),在所述第一时序表中检索指示所述第一变量的有效值的第一检查点值,基于所述检查点值,在事件列表中检索事件子集,所述事件列表包括所述第一事件,重新处理所述事件子集,从而重建在所述数据丢失中丢失的所述数据,以及修改所述第一时序表以包括在所述数据丢失中丢失的所述数据。

在另一些实施例中,所述第一时序表包括对应于由多个事件导致的操作的多个条目,所述多个事件位于与对应于所述延迟事件的延迟事件操作相对应的条目之后。这些实施例中包括有些实施例,其中执行使所述第一时序表进行第二次更新的第二操作包括识别阻止所述多个条目中的无效的传播的屏障操作,以及仅修改所述多个操作当中条目位于对应于所述延迟事件操作的条目与所述屏障操作的条目之间的那些操作。在这些实施例中有些实施例,其中识别屏障操作包括:将写操作识别为屏障操作。

在替代实施例中,确定所述第一次更新是否是有效的包括:识别对于正确执行所述第一次更新必须发生的对所述第一时序表的访问,检查所述第一时序表,以及基于所述检查,确定是否发生了所述访问。在这些实施例中有些实施例还包括:维护第一信息和第二信息,其中所述第一信息标识对所述第一时序表的访问,其中所述第二信息标识处理所述第一事件所需的访问范围,以及确定所述第一信息在所述访问范围内。

在其它实施例中,所述计算系统包括通过网络通信的多个节点,并且所述方法还包括使所述计算系统执行以下步骤:将所述第一变量和所述第一时序表存储在第一节点处;将第二变量和对所述第二变量的操作的第二时序表存储在第二节点处;以及通过对所述第一变量和所述第二变量执行操作来处理所述事件序列的至少一些事件,以及响应于处理所述多个事件来更新所述第一时序表和所述第二时序表。

其它实施例包括上述实施例中任何实施例的可兼容组合。

在另一方面,本发明具有一种以非暂时形式存储在计算机可读介质上的软件,用于使计算系统处理来自事件序列的多个事件,所述事件序列独立于通过输入设备或端口接收这些事件的顺序来定义所述多个事件的正确顺序,所述软件包括用于使计算系统执行上述方法中的任一种的指令。

在另一方面,本发明具有一种用于处理来自事件序列的多个事件的计算系统,所述事件序列独立于通过输入设备或端口接收这些事件的顺序来定义所述多个事件的正确顺序,所述计算系统包括:输入设备或端口,被配置为接收所述多个事件;以及至少一个处理器,被配置为参与所述事件序列的处理,所述处理包括上述方法中的任何一种。

在另一个方面,本发明具有一种用于处理来自事件序列的多个事件的计算系统,所述事件序列独立于通过输入设备或端口接收这些事件的顺序来定义所述多个事件的正确顺序,所述计算系统包括:用于接收所述事件的装置,以及用于执行上述任何步骤中的任何一个的装置。

各个方面可以具有一个或多个以下优点。

本文描述的技术基于向所有计算添加显式时间维度,但仍可将该时间维度与执行计算的顺序解耦。结果是逐渐建立表示响应事件和随后的状态改变而执行的操作的条目(称为“帧”)的时序表的系统。由于响应于接收到的事件更新时序表,所以时序表最终收敛到确定的最终状态。最终,一旦接收到所有事件并且从这些事件产生的所有计算已经完成,则时序表将收敛到唯一的时序表。例如,所述系统可以基于事件可以被延迟的延迟间隔的已知限制来确定事件序列已经完成。如果存在没有附加事件将到达的点,则系统收敛到确定的最终状态。但是它可以通过遵循不一定是确定的路径来这样做。

在一些实施例中,可以免除对昂贵的(在计算时间和/或资源方面)并发控制过程的需要。例如,不需要像两阶段提交的过程。另外,不需要需要远程节点之间的通信的非本地验证过程。相反,可以仅使用本地处理来实现验证。另外,描述了恢复过程,其中可以在节点故障之后恢复正确的本地状态,而不必必须重新处理所有存储的事件。还可以执行延迟事件之后的本地状态的更新,而不必重新处理其顺序在延迟事件之后的所有存储的事件。

附图说明

图1示出事件处理装置;

图2示出组成事件的附加字段;

图3示出了时序表的缩写和扩展表示;

图4A-图4B示出了时序表上的重要和不重要的操作的示例;

图5示出了当事件以正确的顺序到达时执行方法的步骤;

图6示出当事件不按顺序到达时执行方法的步骤;

图7示出了与图5类似的更复杂的示例;

图8示出了与图6中类似的更复杂的示例;

图9示出了为什么实现不需要锁存器;

图10示出了时序表的重建;

图11示出了生成计数器的使用;

图12示出了用于图11中描述的活动的时序表的可能状态;

图13示出了用于图11中描述的活动的事件帧的可能状态;以及

图14示出了基于图12和图13中的状态的回归的示例。

具体实施方式

参考图1,事件接收器12具有到网络14的连接。各种事件源16、18、20也连接到网络14。尽管仅示出了一个事件接收器12,但是可以提供多于一个这样的机器。通常,每个事件接收器12可以根据需要通过在网络14上交换消息来不仅存取其自己的本地存储的数据,而且还可以存取由另一事件接收器存储的数据。在一些实施例中,多节点计算系统包括各种节点,每个节点被配置为包括一个或多个事件接收器和/或一个或多个事件源。在一些实施例中,每个事件接收器在网络14中的其自身节点上实现,在物理上或地理上与每个其它节点分离,但是在通过网络14的某个路径上通信。

代理时间戳

每个事件源16、18、20产生事件。网络14例如通过在网络14上发送(或广播)事件数据将这些事件从事件源16、18、20传输到事件接收器12。当在事件接收器12处接收到事件数据时,它可以被识别为表示将由事件处理器处理的事件。例如,事件处理器可以响应于事件执行计算,这可以涉及对表示工作状态的一个或多个变量执行操作,如下面更详细描述的。

事件是经过排序的。在一些示例中,排序是按时间的,其中每个事件发生在特定时间点。发生的时间可以以各种方式表示。例如,事件的发生时间可以对应于包括在事件数据中的时间戳的值。如果没有两个事件发生在完全相同的时间,则所得到的事件序列是完全排序的。

实际上,即使两个事件的实际发生时间存在一些小的差异,也可以将两个事件标记为同时发生。可能出现的一种常见方式是如果两个事件与测量时间的粒度相比更靠近在一起。在这种情况下,序列将是部分排序的。

对于事件接收器12来实现本文所描述的方法,事件序列必须是完全排序的,而不是仅仅是部分排序的。将部分排序序列转换为完全排序序列的一种方法是提供用作决胜者的代理时间戳。

分配代理时间戳的一种方法是维护一组计数器,其中每一个计数器对应于一事件源16、18、20。然后将每个计数器初始化为唯一的种子。在一些示例中,种子是小于事件源的数量的正整数。例如,对于三个事件源,种子可以是“1”或“2”。

当事件源16生成一新事件时,它将其计数器增加事件源的数量。然后,事件源16使用代理时间戳来标记事件,代理时间戳包括事件的原始时间戳,其中附加到该时间戳的计数器的值递增。只有这样,事件源16才将新事件发送到事件接收器12。该过程确保事件接收器12仅接收一组完全排序的事件。为了简化说明,在本公开的其余部分中,将假设代理时间戳仅是这种计数器的整数值,而没有显式地示出原始时间戳值(其仍然保证完全排序的事件序列)。

在其它示例中,代替时间排序,事件可以与确定事件的完全排序序列的某种其它类型的定量度量相关联,或者可以使用决胜者将事件的部分排序序列转换为完全排序的序列。

保存事件

在事件接收器12处接收到事件并且给出了代理时间戳之后,它被保留并使其持久。这可以以多种方式进行。例如,事件可以被写入持久性存储介质,诸如硬盘驱动器(或其它非易失性存储介质)。或者,事件可以被发送到另一个完全独立的事件处理装置。

事件持久性允许重新处理事件,无论是与事件处理相关还是为了便于在数据丢失的情况下恢复。事件接收器12不进行事件处理,直到使得事件持久。

延迟事件和处理顺序

在从事件源16、18、20到事件接收器12的行程期间,事件可能被延迟。这可能是由于各种原因,诸如网络拥塞、传播延迟或由于损坏或分组丢失导致的事件数据的重传。作为事件延迟的结果,事件不一定以与事件实际发生的顺序(例如,根据它们的代理时间戳的顺序)一致的顺序到达事件接收器12。

数据结构

事件接收器12具有存储器22,存储器22中存储有事件列表24、一组第一变量26A和第二变量26B(一般性地为26)以及一组对应的第一时序表28A和第二时序表28B(通常为28)。虽然显示了两种变量和两个时序表,但这仅用于说明。本文描述的方法适用于一个或多个变量和一个或多个对应的时序表。

变量26的值定义事件接收器12的工作状态。事件处理器30使得事件接收器12能够在事件到达时改变工作状态。例如,事件处理器30可以使用规则处理引擎来基于输入事件数据评估一组规则,并且响应于满足某些规则条件来触发某些规则。触发的规则可以执行相应的动作。

因此,对于每个输入事件,事件处理器30执行动作,其可以涉及对变量26的操作。这些动作被绑定到对应于所述事件的任何时间点(根据其代理时间戳)。然而,因为响应于事件的到达而执行动作,并且因为事件不一定以正确的顺序到达,所以动作也不会以正确的顺序执行。事实上,以与它们相关联的基础事件的时间顺序不一致的顺序执行动作是相当普遍的。结果,每个变量的状态有时将与它们按顺序到达的状态不一致。

每个时序表28与对应的变量26相关联。时序表28包括影响变量的一组事件的记录,以及由事件的发生导致的动作。这些动作包括规则调用和以对应于时序表28的变量26执行的特定操作的形式的状态变化。

当事件到达时,事件处理器30通过例如添加新帧来更新所接收的每个新事件的时序表28而递增地建立时序表28,如下面更详细描述的。然而,时序表28不是不变的。当延迟事件到达并且被无序处理时,可以修改时序表28。

事件的解剖

如图2所示,每个事件具有代理时间戳64和主体66。代理时间戳64确保事件序列是完全排序的。主体66指定与事件相关联地执行什么任务。此外,每个事件还具有状态字段68和访问变量字段70。

事件的状态字段68指示事件是未决、有效还是无效。每个事件开始为未决。它保持未决直到与该事件相关联的所有任务完成。然后,事件变为有效。如果在该事件时间之前的延迟事件到达,则有效事件可以变为无效。当事件变为无效时,必须产生事件处理器30以重新处理它。

事件的访问变量字段70列出了在处理该事件时曾被访问的所有变量。它最初为空白,在事件处理或重新处理后得到更新。

在接收到事件时,事件接收器12产生用于该事件的事件处理器30。事件处理器在事件列表24中创建一个条目并将其标记为“未决”。然后,事件处理器30使用由事件处理器30确定的操作来访问一个或多个变量(例如,读取、写入操作,或者读取且写入变量26的值)。当它这样做时,它累积被访问变量的列表,并且当它终止时,将该列表存储在访问变量字段70中。

在完成时,事件处理器30检查事件的状态字段68。如果状态字段68仍然设置为“未决”,则事件处理器30将其设置为“有效”。然而,可能的是,当事件处理器30正忙于执行其事件处理时,延迟的事件到达。这意味着事件接收器12产生用于该延迟事件的事件处理器,然后其可以将状态字段从“未决”设置为“无效”。如果发生这种情况,则事件处理器30将其设置回“未决”并重新处理该事件。

当事件处理器30重新处理事件时,它首先接收所有被访问变量的列表。当它在重新处理期间访问变量时,它使用被访问变量的列表来识别正被重新访问的那些变量。当它重新访问一个被访问变量时,它将该被访问变量标记为有效。由于事件处理器知道所有变量,并且知道所有曾被访问的变量,因此它可以容易地确定哪些变量未被访问。然后,继续删除与这些变量相关联的帧,如下面更详细描述的。

时序表的解剖

时序表被表示为时间键控帧54(图3)的序列,其中每个时间键控帧对应于一事件。图3示出了缩略格式50和扩展格式52两种形式的典型时序表。扩展格式52明确示出了帧54的每个字段。缩略格式50省略了某些字段,但通过适当地使用删除线和星号合并了这些字段的信息。为了表示的紧凑性,本公开通常使用缩略格式50,其还在值字段报头中标识变量的名称,对于该变量,时序表列出操作序列和该变量的结果值。

所示的时序表52示出了五个帧,每个帧具有四个字段。响应于接收到事件,事件处理器30添加帧54。该新帧54具有时间字段56、类型字段58、值字段60和有效性字段62。

时间字段56存储代理时间戳。在缩略格式中,空白表示时间的开始。时序表中的“下游”方向是时间戳的增加值的方向。“上游”方向与下游方向相反。

类型字段58指示帧的类型,其对应于响应于与该帧相关联的事件而对变量执行的操作的类型。基本上有两种类型的帧:读取帧和写入帧。写入帧被细分为两种类型:盲写帧和读写帧。

当作为接收到的事件的结果,读取对应于时序表的变量的值但不进行写入时,添加“读取”帧。所示的时序表示出两个读取帧,一个在t=20处,另一个在t=40处。在缩略格式中,星号表示读取帧。

当作为接收到的事件的结果,对应于时序表的变量的值已被读取并且该变量的新值已被写入时序表时,添加“读写”帧。通常,写入的值取决于读取的值。所示的时序表具有两个读写帧,一个在t=30处,另一个在t=50处。这些在缩略格式中用上方没有条形的写入值表示。为了表示的紧凑性,扩展格式将读写帧称为“更新”。

当作为接收到的事件的结果,时序表中的值已被重写但是没有被读取时,添加“盲写”帧。所示的时序表只有两个盲写。一个是在t=0时的初始化,另一个是在t=10时。在缩略格式中,盲写由在盲写的值上方的实线表示。为了表示的紧凑性,在扩展格式中,盲写被称为“重写”。

读取、读写和盲写之间的区别是重要的,因为它们将最终用于确定产生帧的事件是否将需要响应于接收到延迟事件而被重新处理。

值字段60包括在添加帧54时的变量的最新值。该值字段60仅在类型字段58指示帧54是盲写帧或读写帧时使用。

最后,有效性字段62指示帧54是否有效。帧开始时为有效。但是当新事件到达时,它可以被赋予无效。在缩略格式中,有效和无效值由有无删除线来指示。

响应于事件,事件处理器30通过对包含其帧的时序表(其不同于对变量执行的“操作”)执行操作来更新时序表(其不同于对变量执行的“更新”)。一般来说,在时序表上有四种操作:“附加”,“插入”,“修改”和“删除”。

“插入”操作在时序表的最后一帧之前添加一帧。“附加”操作类似于插入,不同之处在于它将帧插入到时序表的最后一帧之后。“修改”改变帧中的内容。并且“删除”完全从时序表中删除帧。

重要的和不重要的操作

更新时序表28的特定操作是“重要的”或“不重要的”。“重要的”操作将导致对在时序表的稍后点可见的值的修改或改变。更具体地,“重要的”操作将影响在时间上在延迟事件之后的动作的结果,导致由这些动作造成的随后状态改变可能需要被取消。

图4A-图4B示出了如何确定在时序表中的帧的插入是重要的插入还是不重要的插入的一些示例。通常,如果插入操作调用位于其下游的问题值,则插入操作是重要的。

在图4A所示的操作110中,事件引起了附加操作,其导致在t=35处具有值$300的附加帧。此操作不重要,因为在t=35之后没有可能受影响的下游值。一般来说,附加操作不可能是重要的(即,将总是不重要的),因为其根据定义位于最后一帧之后。

在操作112中,延迟的事件导致在t=8处插入了读取帧。此操作不重要,因为读取不能影响时序表中的值。一般来说,读操作总是不重要的,因为它不会改变被读取的值。

盲写或读写有时可能是重要的,因为它有时可能导致后续帧无效。

在操作114中,t=17处的延迟事件导致了读写操作,从而导致读写帧的插入。在t=20处生成下游读取帧时,延迟的事件尚未到达。因此,事件处理器将读取值$2.25。但是由于在t=17处的延迟事件,现在这是不正确的。结果,在t=20处的下游读取帧必须被无效。这种无效以后将通过在t=20处重新处理事件来纠正。

类似地,在t=30处的下游读写帧被无效,因为它涉及读操作。因为延迟事件在添加该读写帧时还没有到达,所以读写帧基于读取现在已知不正确的值。因此,它也必须标记为无效。

通常,读写帧将使涉及读取的所有下游帧无效,无论是作为读取操作还是读写操作的结果。然而,不需要读取的盲写操作将不会被无效。

并非所有读写操作都将触发无效传播。在操作116中,延迟的事件导致在t=10处的盲写帧之前在t=9处插入读写帧。然而,这不会使盲写帧无效。这是因为盲写帧不涉及读取任何内容。因此,在盲写中写入的值不可能受到时序表中的上游值的影响。盲写的下游涉及读取的任何帧也将不是无效的,因为这样的读取将读取盲写帧中的值。因此,盲写帧用作阻止下行无效传播的一种屏障帧。

因此,插入读写操作导致无效从其插入点向下游传播。这种无效传播直到时序表的终点或直到达到屏障帧(例如盲写帧)。因此,屏障帧用作阻止无效传播通过它的屏障。这限制了响应延迟事件所需的重新处理的程度。只有在盲写之前发生的那些事件将需要重新处理,而非必须重新处理在插入读写帧之后发生的所有事件。

读写帧不总是使得涉及读取的下游帧无效。例如,在配置118中,延迟事件导致在t=10处的盲写之后在t=13处直接插入读写帧。但是这个读写帧不会触发下行无效传播,因为在t=13处的读写帧中的值与在t=10处的盲写帧中的值相同。因此,在t=13处的读写帧实际上没有差别。作为在t=13处插入读写帧的结果,由任何下游读取操作或读-写操作读取的值不会改变。

图4A-图4B还示出了如何确定时序表中的帧的修改是重要的还是不重要的一些示例。与插入操作一样,修改操作有时(但不总是)使得下游帧无效。

在操作120中,延迟事件使得在t=15处的帧被修改为具有新值$2.30。这开始下游无效传播。无效传播继续,直到它达到屏障帧或时序表的终点。其原因与关于读写帧所讨论的相同。

另一方面,在操作122中,延迟事件使得在t=15处的帧被修改了。但是在t=15处帧的修改值与其原始值相同。这显然不能影响任何下游。因此,这种修改是不重要的。

图4A-图4B还示出了如何确定来自时序表的帧的删除是重要的还是不重要的一些示例。与插入操作和修改操作类似,删除操作有时(但不总是)使得下游帧无效。

首先,如操作124所示,删除读取帧永远不是重要的。毕竟,如果插入一个读取帧不造成差别,删除相同的读取帧造成差别将看起来奇怪。

另一方面,如果删除一个盲写帧或一个读写帧改变了值则将是重要的,如操作126所示,但是如果它不改变值,则不是重要的,如操作128所示。

操作130示出了用作防止无效向下游传播的屏障帧的盲写帧。在所示的示例中,延迟事件在t=10处引起了对帧的修改。通常,由于上面结合操作120讨论的原因,这种修改将是重要的。然而,在t=15处的紧接的后续帧是盲写帧。这会立即阻止下游的无效传播。因此,没有帧被导致无效。

在一些实施例中,不是所有潜在的无效帧都会被标记。这是因为在一些情况下,帧是否无效取决于一个或多个无效帧的正确值。

例如,在操作132中,在t=15处插入读写帧。如预期的,在t=20处的读取被标记为无效。由于在t=30处的读写帧取决于在t=20处读取的帧,所以它也被标记为无效。由于在t=35处的读取帧也在t=15处的重要的插入的下游,所以可以预期它也被标记为无效。事实上,在一个实施例中,情况将是这样。

然而,也可能的是,当t=30处的事件最终被重新处理时,t=30处的值最终将被$2.75代替。这意味着它不会改变。在这种情况下,读取帧t=35将不是无效的。

因为存在在t=35处的读取帧最终有效的可能性,所以它仍然被标记为有效。在t=30处的事件被重新处理之前,不知道它是否真的有效。如果在t=30处重新处理事件时,发现在t=35处的读取帧已经变得无效,则此时也只有在此时,t=35处的读取帧才被标记为无效。

前述方法,其中有效帧的有效性面对其上游的重要操作保持未解决,通过避免不必要的事件重新处理来减少计算负荷。因此,这样的帧也是屏障帧,与盲帧是屏障帧类似。两者之间的区别在于,未解决的有效性的帧形成有条件屏障,而由盲写帧形成的屏障形成无条件屏障。

除了t=30处的帧是盲写帧而不是读写帧之外,操作134类似于操作132。在这种情况下,t=30处的帧是无条件屏障帧,而不是如操作132中的情况那样是有条件屏障帧。

在本文所述的方法中,随着计算进行,在时序表28中取消状态改变的概率接近零。结果,时序表28收敛到其确定性的最终状态。

示例1:没有事件延迟情况下累积最大值

图5示出了在事件列表32没有事件延迟的情况下执行该方法的步骤。所示的过程涉及跟踪由两个变量“AAA”和“BBB”中的每一个获得的最大值。这些变量可以表示例如股票价格。

事件列表32F示出了六个事件,每个事件对应于两个变量之一的值。

在接收到第一事件时,事件处理器30更新事件列表32A以指示第一变量的值。事件处理器30还初始化第一变量的第一时序表34A并输入适当的值。

在接收到第二事件时,事件处理器30更新事件列表32B以指示第二变量的值。事件处理器30还初始化第二变量的第二时序表36B并输入适当的值。

在接收到第三事件时,事件处理器30更新事件列表32C。由于事件涉及第二变量,所以第一时序表34C不变。事件处理器30在第二时序表36C处窥探。这种窥探行为记录在第二时序表36C中。在第二时序表36C的图示中的星号表示这个窥探行为的记录。然而,由于在第三事件中接收的值低于在第二时序表36C中已有的值,因此不必对第二时序表36C进行改变。

在接收到第四事件时,事件处理器30更新事件列表32D。由于事件涉及第二变量,所以第一时序表34D不变。事件处理器30在第二时序表36D处窥探,并且发现这次第二变量的最大值已经改变。结果,它更新第二时序表36D。

在接收到第五事件时,事件处理器30更新事件列表32E。由于事件涉及第一变量,所以第二时序表36E不变。事件处理器30在第一时序表34E处窥探并发现第一变量的最大值已经改变。因此,事件处理器更新第一时序表34E。

在接收到第六事件时,事件处理器30更新事件列表32F。由于事件涉及第一变量,所以第二时序表36F不变。事件处理器30窥探第一时序表34F。这种窥探行为记录在第一时序表34F中。在第一个时序表34F的图示中的星号表示这个窥探行为的记录。然而,由于在第六事件中接收的值低于第一时序表34F中已经存在的值,因此不必对第一时序表34F进行改变。

显然,第一时序表34F和第二时序表36F已经收敛到预期给定事件36F的完成列表的状态。

示例2:有事件延迟情况下累积最大值

图6考虑事件列表36F中所示的事件以错误的顺序到达的情况。

在接收到第一事件时,事件处理器30更新事件列表38A以指示第一变量的值。事件处理器30还初始化第一变量的第一时序表40A并输入适当的值。

在接收到第二事件时,事件处理器30更新事件列表38B以指示第二变量的值。事件处理器30还初始化第二变量的第二时序表42B并输入适当的值。

然而,作为事件延迟的结果,到达的下一个事件不是第三事件,而是第四事件。在接收到第四事件时,事件处理器30更新事件列表38C以指示第二变量的值。事件处理器30还更新第二时序表42C。由于事件不涉及第一变量,所以事件处理器30没有改变第一时序表40C。

然后,第三事件终于到达。在接收到它时,事件处理器30通过将第三事件插入正确的位置来更新事件列表38D。由于第三事件仅涉及第二变量,所以可以不改变第一时序表40D。

事件处理器30在第二时序表42D处窥探。事件处理器30然后通过记录该窥探更新第二时序表42D,如星号所示。基于由操作引起的更新性质,事件处理器30现在必须将该操作分类为重要的或不重要的。

为了这样做,事件处理器通过窥探第二时序表42D观察到,第三事件中的第二变量的值不够高,不能改变任何内容。结果,操作被认为是不重要的,并且事件处理器30也没有改变第二时序表42D中第二变量的值。

同样,作为事件延迟的结果,到达的下一个事件是第六事件,而不是第五事件。事件处理器相应地更新事件列表38E,更新第一时序表40E,并且没有改变第二时序表42E。然而,实际上,第一时序表现在是不正确的,因为在延迟的第五事件中反映较高的值。

最后,第五事件到达。事件处理器30通过在正确的位置插入第五事件来更新事件列表38F。由于第五事件不影响第二时序表42F,所以事件处理器30仅关注第一时序表40F。

具体地,事件处理器30通过将第五事件插入第一时序表中的正确位置来更新第一时序表。然后它检查以查看由与该第五事件相关联的操作引起的更新是否足以将操作分类为重要的。

在这样做时,事件处理器30窥探第一时序表40F中的第五事件之后的事件的值。它发现处理第六事件的事件处理器依赖于由于更新变得不正确的值。因此,基于其引起的更新,认为在第一时序表40F上的这个操作是重要的。

响应于确定操作是重要的,第五事件的事件处理器30将由第六事件的事件处理器30执行的动作标记为无效。这由在第一时序表40F和事件列表38F中已被标记删除线的条目示出。

因为发生了重要的操作,所以事件处理器重新运行所有受影响事件的事件处理器。在这种情况下,唯一受影响的事件是第六事件。

然后,第六事件的事件处理器30重新处理第六事件。在这样做时,它在事件列表38G中的第六事件的条目上写入,并且窥探第一时序表40G。第一个时序表40G中的星号表示已经记录了该窥探。然后事件处理器30识别出由于第六事件的值小于当前最大值,因此不需要对第一时序表40G进行更新。

显然,图5和图6中的时序表设法收敛到相同的最终值。然而,图6中的时序表的中间状态包括至少一个不正确的状态,而在图5中,时序表总是处于正确的状态。因此,图5和图6中从初始状态到最终状态的路径不同。

在事件到达时,事件处理系统产生事件处理器30以处理该事件。事件处理器访问变量和这些变量的时序表。这些变量是共享的,并且可以被其它事件接收器12访问。在这样做时,它构建帧和其它数据结构,用于结合确定什么事件需要重新处理。然后,事件处理器30终止。

示例3:清算付款:没有事件延迟

图7示出了另一个示例,其中存在三个账户X、Y和Z,每个账户与一银行客户相关联,以及收集透支费用的第四账户OD。在此示例中,如果客户的余额少于定义的上限,则透支额从该客户的帐户中扣除$10,并记入银行的透支帐户。

这种情况特别容易发生可能由延迟事件引起的麻烦。例如,通常通过存放大额支票来补充耗尽的帐户,然后立即开始支付票据。这开始了一场比赛。如果票据要赢得比赛,即如果票据在支票清算之前被处理,则会有一连串透支费用。

在过去,这种情况很少发生,因为票据通常是邮寄的,有效地阻碍了比赛者之一。然而,在现代交易处理中,许多票据是以电子方式支付的,有效地去除了这种内置的障碍。

在图17中,没有延迟事件。该过程开始于将钱从帐户Z转移到帐户X(步骤42A),从而将X的余额从$10增加到$20。因此,当X向Y支付$15债务(步骤42B)时,X的$20余额就足够了,并且没有发生透支。

示例4:清算付款:事件延迟

图7以相同的初始状态44A开始。然而,表达从帐户Z转帐到帐户X的事件延迟了(步骤44B)。因此,当处理从帐户X到帐户Y的$15转帐时,帐户X只有$10。因此,透支费记入帐户OD(步骤44C)。

延迟的事件最终到达(步骤44D)。第一步是通过从账户Z借记$10(步骤44E)并记入账户X$10来更新账户Z和X(步骤44F)。对帐户X的更新会使早期事件无效。请注意,Y帐户中的值不会被无效。

作为被导致无效的结果,必须重新处理较早的事件。这导致校正帐户X的值(步骤44G)和帐户OD中的透支的删除(步骤44H)。

再次,四个时序表已经收敛到正确的状态。

示例5:异步处理

在处理事件的过程中,可能需要更新几个变量。有利的是,至少在常规方法中,事件处理操作是原子的。这通常需要在要更新的所有变量上获得锁存器(或“闭锁”)。这是时间上昂贵的操作。此外,它会造成死锁的可能性。

本文描述的方法免除了在事件处理操作中对原子性的需要。无需获得多个锁存器,而是以全局异步方式更新变量。有时,生成的变量值配置可能不正确。然而,该方法的性质使得从长远来看,变量值的配置将收敛到正确的状态。可以获得时序表上的锁存器以使得得到对时序表(例如,插入和删除帧)的操作的原子集合,这样的时序表上的这种简短的本地锁存器比变量本身上的锁存器便宜,其可以在多个节点之间共享。

如图8所示,第一事件72A和第二事件72B几乎同时到达,作为其结果,第一事件处理器和第二事件处理器同时执行。第一事件72A要求将$10从帐户Z转移到帐户X。这需要两个操作:对帐户Z的借记和对帐户X的记入。

第一事件处理器负责通过更新帐户Z的时序表88来执行从帐户Z的借记(步骤74)。然而,在它有机会对帐户X执行相应记入之前,第二事件处理器步骤开始处理第二事件72B。这导致帐户X的时序表84的更新,显示从帐户X借记$15。这触发帐户X中的透支(步骤76)。这还导致本应转入X帐户的10美元的明显消失。

第二事件处理器完全不知道其中断第一事件处理器的事实,第二事件处理器通过更新帐户OD的时序表90来完成处理第二事件72B,从而记入银行的透支帐户(步骤78)。

最后,第一事件处理器完成处理第一事件72A。这将丢失的$10恢复到帐户X,并且还使由第二事件处理器执行的处理无效(步骤80)。

第二事件72B的无效触发生成事件处理器以重新处理第二事件72B。这导致余额的校正,以及从透支时序表删除帧(步骤82)。结果,时序表84、86、88、90收敛到了正确的状态,而不使用锁存器。

示例6:时序表重建

由于潜在的频繁事件及其相关联的操作,时序表通常存储在相对快速的存储器(例如,内存或其它易失性存储器)中。然而,这使得时序表在硬件故障的情况下易发生数据丢失。本文描述的方法提供了重建由于硬件故障可能已经丢失的全部或部分时序表的简单方式。为了启用该特征,事件接收器12将检查点写入持久性存储器(例如,磁盘或其它非易失性存储器)。检查点标识与时序表和最近事件相对应的变量的值(在该事件期间该变量的值是有效的)。利用该检查点和事件列表,可以重建完整的时序表。假设事件列表本身在持久存储器中进行维护要廉价得多,这是因为事件不会被修改,因此每个事件仅需要被存储一次。

图10从要恢复的时序表92开始(步骤94)。作为一些故障的结果,时序表92的一部分已经丢失(步骤96)。仅留下检查点值98。

恢复的第一步是识别需要处理的事件。在这种情况下,这导致第一事件102和第二事件104的无效(步骤100)。

作为无效的结果,产生第一事件处理器和第二事件处理器以重新处理对应的第一事件102和第二事件104。因此导致第一事件102的重新处理(步骤106)和第二事件104的重新处理(步骤108)。

重建方法不需要重新处理所有事件,而只需要重建丢失的时序表94所需的那些事件。

实施例7:部分时序表重建

在一些情况下,时序表会以某种方式损坏,使得难以确定事件是否已被正确处理。在这种情况下,无法判断事件是否应该重新处理。保守的选择是重新处理所有事件,如前面的示例所述。然而,这在计算上有所浪费。

在替代实施例中,每个帧还包括与对包含该帧的时序表的每次数据访问相关联的生成计数。在该实施例中,每次时序表访问都伴随着改变被访问的帧的生成计数。特定帧的生成计数和导致访问该帧的事件的代理时间戳的组合定义了唯一的访问元组。当处理一事件时,事件处理器在开始时存储起始生成计数和结束生成计数。这些可用于稍后确定是否必须重新处理事件。

使用生成计数的过程在图11中示出。

在图11所示的步骤136中,要处理的事件是四个时序表的初始化。处理此事件需要访问四个时序表中的每一个。每次访问与生成计数相关联。如图所示,每个时序表都具有与该事件相关联的唯一生成计数g。初始化步骤以生成计数的值1开始,并以生成计数的值4结束。

在步骤138中,要处理的事件是从X时序表转移$15到Y时序表。处理从具有起始生成计数s=1的事件帧开始。这是在处理此事件期间将分配的生成计数的第一个值。结束生成计数e被留空,直到事件被完全处理。

处理事件的下一步骤是将读取插入帧附加到X时序表,以反映扣除$15和$10透支费(步骤139)。这需要对X时序表的数据访问。为了指示该数据访问,事件处理器用生成计数g=1来标记X时序表。

事件处理继续步骤140,其中将读写帧附加到Y时序表。这需要访问Y时序表。此访问是在事件处理期间进行的第二次访问。结果,该读写帧被标记为g=2的生成计数。

事件处理需要再访问一个时序表--OD时序表。如步骤144所示,下一步骤是将读写帧附加到OD时序表。由于这将是在处理特定事件的过程中进行的第三次时序表访问,所以附加的读写帧用g=3的生成计数来标记。

这时,处理事件完成,并且剩下的只是将该事件的结束生成计数e更新为“3”。

然而,这种完成状态不会持续很长时间。在步骤146中,t=1处的延迟事件到达。此事件包括将$10从Z帐户转移到X帐户的指令。如果这个事件较早到达,即在t=2的事件之前,则透支将永远不会发生。现在该事件已经到达,透支必须撤消,并将其它一切数据校正正确。

如步骤146所示,在事件处理的结束处示出t=1处的事件。在t=1处处理事件需要两次访问。这导致在t=1处的事件帧中的起始生成计数和结束生成计数分别为s=1和e=2。作为事件在t=1处晚到达的结果,t=2处的事件现在是无效的。其状态现在被标记为“未决”,以表明在t=2处的事件的重新处理已经开始。

在预期另一次访问时,在t=2处的事件的事件帧的起始生成计数现在增加到s=4。它的结束生成计数e被删除,因为它在事件重新处理完成之前是未知的。

在步骤148中,完成在t=2处的事件的重新处理。事件的结束生成计数器被填充。并且时序表已经收敛到与所有已知事件一致的状态。

图12列出图11中的时序表经过的所有时序表状态。图12中的每一列表示一个节点。图13对所有事件帧都是相同的。图13中的每一列对应于一个事件。

从图11和图12的示例中可以看出,存在为了使事件有效而必须存在的若干条件。第一,事件帧应标记为有效。第二,事件帧的访问字段应与时序表中的访问匹配。第三,值帧均被标记为有效。最后,时序表中的生成计数应该与事件帧中指定的生成计数范围相匹配。如果不满足这些条件中的任何一个,则事件不可能有效。

假设存在分散的日志系统,并且对时序表或事件列表的任何改变被保存到日志中,使得在故障之后,可以将时序表和事件列表恢复到某个较早的状态。因为日志记录是分散的,并且因为不是所有的时序表都存储在同一节点中,所以在节点故障之后可能具有图11中的状态的任何组合。这个构思是确定哪些事件(如果有的话)需要重新处理。使用如下所述的生成计数器,可以确定事件的组合是否有效。这避免了不必要地重新处理事件的需要。

图14示出了如何使用事件帧和上述四个条件的示例,以确定时序表是否正确。

在示例150中,所有事件帧被标记为有效。但事实上,仔细检查,特别是对生成计数器的检查,显然t=2处的事件是无效的并且需要重新处理。特别地,在t=2处的事件的起始生成计数器和结束生成计数器定义闭合区间[4,5]。因此,时序表应该在区间[4,5]中显示生成计数器。但情况并非如此。X时序表具有1的生成计数器,其在该区间之外。

在示例152中,尽管所有事件被标记为有效,但是在t=1处的事件必须是无效的。这是因为事件帧指定事件的时序表应该在区间[1,2]中具有生成计数。实际上,仅有的生成计数为g=1。X时序表显然还没有被访问。在t=2处的事件也是无效的,因为事件列表要求对应时序表中的所有生成计数都在区间[4,5]中。然而,生成计数实际上在区间[1,5]中。因此,两个事件都需要重新处理。

通过检查事件帧的访问字段可以获得相同的结果。根据t=1的事件帧的访问字段,应当存在对Z时序表和X时序表的访问。根据时序表本身,只有Z时序表被访问。

在示例154中,t=1和t=2处的两个事件都是无效的。这是因为在t=1处的事件的事件帧中的访问字段表明应当存在对X时序表和Z时序表两者的访问。显然,没有发生对X时序表的访问。相同的推理适用于t=2处的事件。

在示例156中,t=1处的事件无效,因为根据t=1处的事件帧,生成计数应当全部在区间[1,2]中。然而,在对应的时序表中,生成计数在减少的范围[1,1]中。在t=2处的事件也是无效的,因为事件帧中的预测生成计数范围[4,5]与时序表中的不匹配。

上述事件处理方法可以例如使用执行合适的软件指令的可编程计算系统来实现,或者可以在诸如现场可编程门阵列(FPGA)或一些混合形式的合适的硬件中实现。例如,在编程方法中,软件可以包括在一个或多个编程或可编程计算系统(其可以是诸如分布式、客户端/服务器或网格的各种架构)上执行的一个或多个计算机程序中的过程,每个计算系统包括至少一个处理器,至少一个数据存储系统(包括易失性和/或非易失性存储器和/或存储元件),至少一个用户界面(用于使用至少一个输入设备或端口接收输入,并且用于使用至少一个输出设备或端口提供输出)。软件可以包括例如提供与数据流图的设计、配置和执行相关的服务的更大程序的一个或多个模块。程序的模块(例如,数据流图的元素)可以被实现为符合存储在数据仓库中的数据模型的数据结构或其他有组织的数据。

软件可以使用介质的物理特性(例如,表面凹坑和平台、磁畴或电荷等)以非瞬态形式存储一段时间(例如,诸如动态RAM等动态存储器装置的刷新周期之间的时间),例如被实施在易失性或非易失性存储介质或任何其它非暂时性介质。在准备加载指令时,软件可以提供在有形、非暂时性介质上,例如CD-ROM或其他计算机可读介质(例如,可由通用或专用计算系统或设备读取),或者通过网络的通信介质被递送(例如,被编码成传播信号)到其被执行的计算系统的有形、非暂时性介质。可以在专用计算机上或使用诸如协处理器或现场可编程门阵列(FPGA)或特定的专用集成电路(ASIC)的专用硬件来执行处理中的一些或全部。处理可以以分布式方式实现,其中由软件指定的计算的不同部分由不同的计算元件执行。每个这样的计算机程序优选地存储在或下载到可由通用或专用可编程计算机访问的存储设备的计算机可读存储介质(例如,固态存储器或介质,或磁介质或光介质)上,用于当计算机读取存储设备介质以执行本文所述的处理时,配置和操作计算机。本发明的系统还可以被认为可实现为配置有计算机程序的有形的、非暂时性介质,其中如此配置的介质使得计算机以特定和预定义的方式操作以执行本文描述的一个或多个处理步骤。

已经描述了本发明的多个实施例。然而,应当理解,前述描述旨在说明而不是限制本发明的范围,本发明的范围由所附权利要求的范围限定。因此,其他实施例也在所附权利要求的范围内。例如,在不脱离本发明的范围的情况下可以进行各种修改。另外,上述的一些步骤可以是与顺序无关的,并且因此可以以与所描述的顺序不同的顺序来执行。

已经描述了本发明及其优选实施例,要求保护的新的并由专利证书保护的权利要求如所附。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1