管理消息队列的制作方法

文档序号:6336127阅读:156来源:国知局
专利名称:管理消息队列的制作方法
管理消息队列本申请是申请日为2006年6月22日、申请号为200680023379. 1、发明名称为“管
理消息队列,,的申请的分案申请,其全部内容通过参考援弓I于此。
背景技术
本发明涉及管理消息队列。消息队列可用于提供适合于访问实体(例如服务器、操作系统、软件模块等)的异 步通信协议,以进行消息交换。存放于消息队列中的消息以队列数据结构的方式存储,直到 接收者(例如消息队列的订阅者(subscriber))取回(retrieve)它们。消息队列系统可以提供“持久性”以确保在系统发生故障的情况下消息不会丢失 (或能够恢复任何丢失的消息)。实现持久性的一种方法是例如在接收到一定数量的输入 消息或数据字节后,利用非易失性存储器来同步在易失性存储器中存储的消息。

发明内容
在总体方案中,本发明的特征在于提供一种用于将数据写入到多个队列的方法、 相应的软件和系统,其中数据的每一部分被写到相应的一个队列。该方法包括,无需同时锁 定多于一个队列,确定每一队列中是否有空间可用以写入数据的相应部分,如果有,则预留 (reserve)队列中的这些空间。该方法包括将数据的每一部分写入到相应的一个队列。该方案包括如下一个或多个特征。将数据的每一部分写入到相应的一个队列发生在预留队列中所有空间之后。该方法还包括在相应队列中写入一部分数据之后,释放为在该队列中写入将该部 分数据而预留的空间。确定每一队列中是否有空间可用,以及如果有则预留所述空间的步骤包括,对于 多个队列中的每一个锁定该队列;确定该队列中的空间是否可用;如果可用则预留该空 间;以及解锁该队列。被写入到相应的一个队列的所述数据的每一部分包括记录。该方法还包括在将所述记录写入到任何队列之前写入日志记录。该方法还包括在写入日志记录之前将每一队列同步至非易失性存储器。该方法还包括,在将除了所述记录之一之外的数据写入到第一队列之前,如果该 第一队列中已预留了空间,则锁定该第一队列,同时确定在将其它数据写入到该第一队列 之前,对于所述其它数据该第一队列中的额外空间是否可用。该方法还包括,在将除了所述记录之一之外的数据写入到第一队列之前,如果该 第一队列中还没有预留空间,则将所述数据写入到该第一队列而不需要锁定该第一队列。确定每一队列中是否有空间可用以写入所述数据的相应部分的步骤包括确保每 一队列中有足够空间可用于写入关于该队列的任何未完成事务的提交记录。该方法还包括在确定至少一个队列中没有预留足够的空间来写入关于该队列的 任何未完成事务的提交记录之后,中止向所述多个队列中的每一个写入相应的提交记录。
预留队列中的空间的步骤包括递增每一队列的相应计数。在另一总体方案中,本发明的特征在于一种方法及相应的软件和系统,包括在第 一数据结构中存储队列的多个消息,该第一数据结构与用于该队列的第二数据结构分开; 提交与所述消息有关的事务;以及从相邻存储位置(contiguous memory location)读取至 少一些所述消息。该方案包括如下一个或多个特征。该方法还包括在该第二数据结构中存储指向该第一数据结构的指针。从相邻存储位置读取至少一些所述消息的步骤包括从该第一数据结构中读取至 少一些所述消息。提交事务的步骤包括将所述消息从该第一数据结构移至该第二数据结构。从相邻存储位置读取至少一些所述消息的步骤包括从该第二数据结构中读取至 少一些所述消息。该第一数据结构被存储在易失性存储器中,以及该第二数据结构被存储在非易失 性存储器中。该方法还包括将所述消息从该第一数据结构移至第三数据结构;以及在该第二数 据结构中存储指向该第三数据结构的指针。从相邻存储位置读取至少一些所述消息的步骤包括从该第三数据结构中读取至 少一些所述消息。本发明的方案具有如下一个或多个优点。复合提交操作保证成功地将记录写入到多个队列中的每一个,而无需同时锁定多 于一个队列,从而提高了计算资源的利用。将大型写事务中的消息写入到分开的数据结构 避免了在读取其它消息时不得不浏览该大型写事务的记录。在将写事务中的消息添加到队 列之前,将它们写入到分开的数据结构或写缓冲器中,这降低了许多其它消息与该写事务 中的所述消息的交叉存取,从而提高了输入/输出(1/0)效率。从下面的描述和权利要求书中,本发明的其它特征和优点将变得清楚。


图IA为排队系统的示意图。图IB为队列数据结构的示意图。图2A至图2E为写缓冲器和队列数据结构的示意图。图3A和图3B为写缓冲器和两个队列数据结构的示意图。图4为队列数据结构和相应读数据结构的示意图。图5为队列数据结构和大型事务数据结构的示意图。图6为作为复合提交操作部分的队列数据结构的示意图。图7为复合提交操作的流程图。图8A为开启操作(open operation)的流程图。图8B和图8C分别为复合提交操作和相关写操作的流程图。图9A和图9B分别为复合提交操作和相关写操作的流程图。
具体实施例方式1.概况图IA示出排队系统100,其中一组受信的访问实体102A-102M均包括队列事务模 块104,队列事务模块104用于与队列管理器106直接进行相互作用。排队系统100还包括 一组不受信的访问实体108A-108N,不受信的访问实体108A-108N均包括通过远程程序调 用(RPC)管理器112与队列管理器106进行相互作用的远程队列事务模块110。排队系统100提供一种通过一个或多个消息队列在访问实体之间传递消息的机 制。访问实体为模块提供接口,以与排队系统100相互作用。例如分布式计算系统中的“发 布者”(publisher)计算模块能够将包括被处理的数据元(element)的消息传递到一个或 多个“订阅者”(subscriber)计算模块。队列管理器106与输入/输出(I/O)管理器114相互作用,输入/输出管理器114 为具有相应队列数据结构队列A-队列P的一组消息队列管理存储容量(memory storage), 在易失性存储器118(例如半导体随机存取存储器(RAM))中为每一组消息队列分配存储空 间(例如,一组磁盘页面),易失性存储器118是一种临时工作存储器,其对于读取和写入数 据提供相对较快的访问。I/O管理器114也管理非易失性存储器116 (例如磁盘系统),非 易失性存储器116是一种永久性存储器,其提供相对更持久的数据,以及与易失性存储器 相比,其对于读取和写入数据提供相对较慢的访问。任选地,可具有处理所有队列的I/O的 一个I/O管理器,或者存在并行运行的多个I/O管理器,其中每一 I/O管理器处理队列子集 的 I/O。队列数据结构存储包括“消息记录”(也简单地称作“消息”)和“控制记录”的记 录,其中消息记录包括被发送的消息数据,控制记录包括由排队系统100使用以管理队列 的信息。图IB示出含有一系列消息记录的示例性的队列数据结构队列M,每一消息记录包 括消息报头130和消息数据132。任选地,队列可将消息数据与消息报头130 —起存储,或 者可将指针134与消息报头130—起存储,其中指针134用于指定外部存储的消息数据136 的地址。在下文描述的“大型事务间接技术”中,任选地,记录可包括指向用于存储消息顺 序的大型事务数据结构122的指针138。排队系统100支持包括发布_订阅数据分布模型的各种数据分布模型。起到队列 “发布者”作用的访问实体(受信的或不受信的)在“写事务”中能将一条或多条消息添加 到队列(也称作“主题”)。起到队列“订阅者”作用的访问实体(受信的或不受信的)在 “读事务”中能从队列中读取一条或多条消息。多个发布者可向同一队列中添加消息,以及 多个订阅者可从同一队列中读取相同的消息。在队列的所有订阅者均已经读取消息之后, 队列管理器106将该消息从队列中移走。可选地,在点对点数据分布模型中,多个访问实 体可向队列添加消息,但是由一个访问实体从队列中读取每一消息。“复合事务(compound transaction)”包括与多于一个的队列的相互作用,在下文中对其进行详细描述。可以以与原子性(atomicity)、一致性、隔离性和持久性的“ACID”属性中的一个 或多个属性相一致的方式执行此处描述的写事务、读事务和复合事务。为启动写事务,发布者从队列管理器106获取事务识别符(ID),并将在写事务中 要被添加到队列的一条或多条消息传递给队列管理器106。所添加的消息与写事务的事务 ID有关,其中所述消息在该写事务中被添加到队列。队列管理器106将所述消息传递给I/0管理器114以使其写入到易失性存储器118,以及最终写入到非易失性存储器116。由队 列管理器106和I/O管理器114执行的功能的替代部分(alternative division)也可被使用。在发布者将在写事务中待添加的所有消息提供给队列管理器106后,发布者可请 求队列管理器106 “提交”或“回滚(roll back)”写事务。为了提交写事务,队列管理器 106将“提交记录”添加至非易失性存储器中的相应队列数据结构。提交记录表示提交的 写事务的消息(“提交消息”)能被传递给订阅者。在提交写事务之前,通过确保相关消息 从易失性存储器同步至非易失性存储器(如果相关消息还没有被同步)来使得相关消息持 久。如果已被回滚的写事务中的消息还没有被同步至非易失性存储器,则队列管理器 106将这些消息丢弃。如果消息已被同步至非易失性存储器,则将“回滚记录”写入到合适的 (appropriate)队列数据结构,以表示不提交该事务中的消息并且所述消息最终被丢弃。在 一些实施方式中,如果在预定时间量(例如1小时)后写事务没有被提交或回滚,则队列管 理器106可任意自动地回滚该事务,例如以避免为建立这些事务而浪费存储空间。为启动读事务,订阅者从队列管理器106获取事务ID并接收下一个或多个未读的 消息。I/O管理器114负责从合适的队列数据结构取回消息,而队列管理器106将所述消息 传递给订阅者。由于只有被提交的消息才被传递给订阅者以及已被提交的消息可与还没有 被提交的消息被交叉存取,所以消息可以按照或者不按照其被写入到队列数据结构的相同 顺序被传回。队列管理器106通过建立“读数据结构”来确定将队列中的哪些消息传递至 订阅者,下文将对其进行详细描述。在“复合事务”中,访问实体(access entity)可将与同一事务ID相关的所有消息 写入至多于一个的队列和/或从其读取。复合事务也可被提交或回滚。当复合事务被提交 时,在“复合提交”操作中,提交记录被添加至在复合事务中被写入消息的每一个队列。这 些“队列提交记录”用于以信号的方式告知相应的提交消息能被传递至订阅者。在写入这些“队列提交记录”之前,将包括被提交的复合事务的事务ID的“日志提 交记录”写入到日志数据结构124中。任选地,该日志提交记录也可包括其它信息,例如参 与复合事务的访问实体和所涉及的队列数据结构。复合提交操作作为原子操作被执行,所 述原子操作确保在事务中被写入的所有消息均被持久存储或者没有任何消息被持久存储 (例如,一旦发生故障则所有添加的消息将被回滚)。日志提交记录的写入是完成复合提交 操作的原子动作(atomic action)。如果在日志提交记录(journal commit record)被写 入之后但在所有的队列提交记录被写入之前出现故障,则排队系统100能够基于持久存储 的日志提交记录进行恢复并写入剩余的队列提交记录。为提高1/0效率,通过在与队列数据结构分开的数据结构中存储新的队列消 息,队列管理器106任选地使用各种技术来降低对来自不同事务的消息的交叉存取 (interleaving)。例如,排队系统100包括下文描述的用以降低这种消息交叉存取的两种 技术“写缓冲技术”和“大型事务间接技术”。在写缓冲技术中,1/0管理器114首先将未提交的队列消息临时存储在易失性存 储器118的写缓冲器120中。当提交与所述消息相关的写事务时,将所述消息从写缓冲器 120移至合适的队列数据结构。也可在写事务提交之前(例如写缓冲器120满了或在预定时间量过后)将所述消息从写缓冲器120移至合适的队列数据结构。可选地,写缓冲器120 可被存储在非易失性存储器116中并仍提供一些相同的功能(例如,降低来自不同事务的 消息的交叉存取)。在大型事务间接技术中,发布者将包括大量消息(例如大于10,000、100,000、 1,000,000等,其依赖于计算环境的特点)的写事务识别为“大型事务”。队列管理器106将 大型事务消息存储在大型事务数据结构(LTDS) 122中,并将指向LTDS 122的指针存储在队 列数据结构中。任选地,队列管理器106在写事务中检测到一定量的消息后可自动将写事 务实时(on thefly)转换为大型事务。写缓冲技术和大型事务间接技术均能增加将消息数 据存储在相邻存储位置的可能性,从而提高了 I/O效率。2.添加和读取消息当将用于任何特定写事务的消息存储至非易失性存储器118中的有序队列数据 结构时,I/O管理器114以将所述消息提供给队列管理器106的顺序保持所述消息。例如, 通过作为队列数据结构当前部分的磁盘页面的链接列表来确定在队列数据结构中存储的 消息的顺序。用于不同写事务的消息可在队列数据结构中被交叉存取。如果在先前启动的 写事务被提交之后启动新的写事务,则在队列数据结构中,与该新的写事务相关的所有消 息出现在先前写事务的所有消息之后。订阅者可启动读事务,在所述读事务中订阅者从队列请求一个或多个消息。由订 阅者接收到的消息可以来自一个写事务、来自一个写事务的子集或来自多个写事务。如下 文详细描述的,队列管理器106将来自所提交的写事务的消息传递给订阅者。在同一写事 务中写入的消息以该写事务的顺序提供给订阅者。将来自不同写事务的消息以写事务被提 交的顺序提供给订阅者。对于由不同订阅者向队列读取的相同的消息,由这些订阅者以相 同顺序查看(see)。就来自不同写事务的消息在队列数据结构中被交叉存取来说,降低了读事务的I/ 0效率。例如,直到已确定消息被提交,队列管理器106才向订阅者传递该消息。用于分开 (separate)消息和对应于该消息的提交记录的数据越多,所用的管理资源越多(例如,更 多的存储器或更多的读操作)。例如,如果添加消息与提交相关的写事务之间的时间量较 长,则与写事务相关的消息(尤其是写事务中的第一个消息)可能与该写事务的提交记录 相隔很远。在这段时间期间,所述消息可被存储在队列数据结构中,与其它消息(例如,与 其它写事务相关的消息)被交叉存取。此外,在该写事务中的消息可位于相隔很远的磁盘 页面上。在读事务中,队列管理器106可能必须浏览用于提交记录的队列数据结构,然后返 回并交换存储有该写事务的消息的所有页面。2. 1写缓冲图2A至图2E示出在上述写缓冲技术的示例执行期间写缓冲器120和队列数据结 构队列A的状态。写缓冲器120是队列记录(例如,消息记录和表示写事务开始的“开启 (open)”记录)的临时存储器。写缓冲器120保存所述记录直到相应的事务已提交或直到 写缓冲器120为“满”。队列管理器106可基于最大数据量、最多消息数或基于数据量和消 息数的结合来确定写缓冲器120何时为满。在这个实例中,为了举例说明,写缓冲器120保 存最多三条消息。写缓冲器120以有序的数据结构(例如,链接列表)被实施,所述有序数 据结构用于保存添加消息的顺序。写缓冲器120和队列数据结构队列A作为列表示出,其中消息被添加到列表底部的“报头”。参照图2A,队列数据结构队列A保存表示写事务Tl开始的“开启Tl”记录和表示事务T2开始的“开启T2”记录。写缓冲器120保存具有如下报头的消息:"Τ1 添加Ml”, "T2 添加Ml”和“Tl 添加M2”。每条消息的消息数据也与相应的消息报头一起存储在写缓 冲器120中。在该实例中,例如,由于Tl和T2由不同的发布者同时写入,所以关于写事务 Tl的两条消息与关于写事务T2的消息被交叉存取。参照图2B,在将事务Tl的消息Ml和M2(包括消息报头和相关消息数据)移至队 列A并确保所述消息已被同步至非易失性存储器后,队列管理器106执行写事务Tl的提交 操作。在完成所述消息的提交操作之后,提交记录“提交Tl”被写入到队列A。在将Tl消 息移至队列A之后,在写缓冲器中保留单个T2消息(由于T2还没有被提交)。参照图2C,发布者开启新的写事务T3并将具有报头“T3 添加Ml”和“T3 添加 M2”的两条消息添加至队列,所述消息均被存储在具有两个空存储槽(empty slot)的写缓 冲器120中。然后,在将具有报头“T2 添加Ml”的单个写事务T2的消息Ml移至队列A之 后,队列管理器106执行写事务T2的提交操作。然后,发布者开启新的写事务T4并将具有 报头“T4 添加Ml”的消息添加至写缓冲器120的最后剩余的存储槽中的队列。虽然与写 事务Tl和T2相关的消息最初是被交叉存取的,但是作为从写缓冲器120到队列A的转移 部分,它们已被解交叉存取并邻近地存储在队列数据结构队列A中。参照图2D,由于写缓冲器120是满的,所以当发布者添加第二条T4消息时,队列管 理器106将有关于T3的消息从写缓冲器120转移至队列A。这种转移为第二条T4消息在 写缓冲器120中空出了空间。因此,在提交之前可以将写事务中的消息从写缓冲器120中 移出。参照图2E,队列管理器106执行写事务T4的提交操作,接收新的T3消息并执行写 事务T3的提交操作。这个实例示出当写缓冲减少消息的交叉存取(或“瞬态碎片(temporal fragmentation) ”)时,由于写缓冲器120的添满,所以导致即使使用写缓冲仍然可能出现 一些瞬态碎片。可选地,当写缓冲器120添满时,一个或多个写事务能够被转换成大型事 务,释放了写缓冲器120中的空间而不会在队列数据结构中导致瞬态碎片。在一些实施方式中,每个队列具有其自己的写缓冲器。可选地,写缓冲器120可为 多个队列保存消息。在一个实例中,将三个写事务T1-T4的消息添加至两个队列。图3A示 出当写缓冲器120为满(在该实例中写缓冲器120保存10条消息)时写缓冲器120和队列 数据结构队列A和队列B的状态。图3B示出在添加了两个新消息(用于写事务Tl和T4) 之后写缓冲器120和队列数据结构队列A和队列B的状态。与最早期的事务Tl相关的消 息被移送至队列A,从而释放了写缓冲器120中的空间以用于新消息。2. 2读数据结构队列管理器106通过依次浏览队列中的消息记录并仅读取消息报头以确定每条 消息与哪个事务相关,来建立读数据结构。队列管理器106使用读数据结构来记录(keep track of)潜在的多个写事务。对于每个队列,队列管理器106为该队列的每个订阅者存储 读数据结构。图4示出对应于队列A的示例性读数据结构400。在该实例中,读数据结构400包 括先进先出(FIFO)子列表401-404的有序列表。每当队列管理器106遇到对应于新的写事务的消息时,新的FIFO子列表被添加到通过该写事务的事务ID识别的读数据结构400 中。队列管理器106以消息被浏览的顺序(即消息被添加到队列的顺序)将指向与对应的 写事务相关的每一消息的指针添加至每一 FIFO子列表。在浏览图4所示的队列数据结构队列A期间,队列管理器106为具有指向消息Ml 和M2的指针的写事务Tl生成第一 FIFO子列表401。直到确认消息已被提交(即,直到浏 览到相关事务的提交记录之后),队列管理器106才开始将所述消息传回给相应的订阅者 (响应读事务)。在得到Tl的提交记录之后,完成Tl的FIFO子列表401,并且队列管理器 106暂时停止建立读数据结构400、基于FIFO子列表401中的指针取回下一个消息并在订 阅者请求新消息时将该消息传递给订阅者。在所完成的FIFO子列表401中的所有消息已被 传递给订阅者后,队列管理器106开始再次浏览队列A以继续建立读数据结构400直到完 成下一个FIFO子列表402。队列管理器交替进行将来自完成的FIFO子列表的消息传递给 订阅者的操作与浏览队列数据结构以建立读数据结构的操作。在该实例中,由于T4的提交 记录出现在T3的提交记录之前,所以在T3的消息M1-M3之前将T4的消息Ml和M2传递给 订阅者。在可选实施方式中,在完成的FIFO子列表中的所有消息已被传递给订阅者之前, 队列管理器能从向订阅者传递消息改变为建立读数据结构。保持每个FIFO子列表直到相应的订阅者接收到该FIFO子列表中的所有消息后, 或者直到队列管理器106确定相应的写事务不会被提交(例如读到回滚记录后)。在提交 读事务后,将提交记录写入到表示订阅者已读取了哪些消息的日志数据结构124。在队列管 理器106结束读数据结构400的建立之后,为来自同一订阅者的相同队列的下一读事务保 留读数据结构400。2. 3大型事务间接技术参照图5,当队列管理器106开启(open)大型事务T2时,队列管理器106在非易 失性存储器116中配置大型事务数据结构(LTDS) 122。当大型事务的消息到达时,直接将它 们写入到作为邻近消息列表的LTDS 122。当大型事务被提交时,队列管理器106关闭LTDS 122,并将指向LTDS 122的指针存储在队列数据结构队列P中的间接消息500中。间接消 息500还包括大型事务T2的事务ID。当队列管理器106为队列P建立读数据结构时,Tl消息被浏览两次,一次是在将 指针写入到读数据结构的FIFO子列表时,一次是在读取消息以将其传回给订阅者时。如果 大型事务T2中的大量消息被存储在队列P中,则这两次浏览是徒劳的。取代上述方法,当 队列管理器106正在为队列P建立读数据结构并浏览单个间接消息500时,队列管理器106 将来自LTDS 122的消息直接传递至订阅者,而不需要T2的FIFO子列表。由于大型事务消 息自动表示为被提交,所以在将大型事务消息传回(pass back)给订阅者之前,不需要对它 们进行浏览。此外,也不需要浏览不同事务的“未交叉存取”消息的另一功能。在传回大型 事务T2的所有消息之后,队列管理器106返回至队列数据结构。大型事务可以是由发布者选择的选项或者可根据队列实时推出。3.复合提交在复合提交操作中,队列管理器106确保写入到多个队列的复合事务的所有添加 消息均被持久存储。部分复合提交操作包括将提交记录写入到这些队列。提供这样一种机 制是有用的,该机制在执行复合提交操作的同时允许一个或多个实体同时访问队列,而不允许访问实体干扰复合提交操作。通过将日志提交记录写入至日志数据结构124,队列管理器106指示复合事务的 消息已被持久存储(即,已被同步至非易失性存储器)。随后,队列管理器106将队列提交 记录写入至在复合事务中写入消息的每一队列(例如为了使得对队列浏览提交记录以建 立读数据结构)。由于队列数据结构具有有限的存储空间,因此对于复合提交操作有可能某 些队列没有剩余足够的空间以至于在超时时间段内(例如5秒)不能写入提交记录。即使 在复合提交操作开始时队列数据结构具有可用空间,但在队列提交记录被写入前,同时发 生的写操作能够用完所述空间。由于日志数据结构124表示消息已被提交,但是在队列中 不存在使得订阅者接收所述消息的相应提交记录,因此队列中缺少用于提交记录的空间是 个潜在问题。在用于管理复合提交操作的队列提交记录的一种方法中,通过在写入提交记录的 同时锁定每一队列以防止在提交操作期间用完空间,队列管理器106确保在每一队列中具 有足够的可用空间来提交记录。在第二种和第三种方法中,为了更有效地执行复合提交操 作,队列管理器106使用一种确保将提交记录成功写入到多个队列中的每一个而不用同时 锁定多个队列的方法。下文更详细地描述这三种方法中的每一个。参照图6,队列数据结构队列A和队列D包括用于具有事务ID Tl、T2和T3的复 合事务及具有事务ID T4的写事务的消息。复合事务Tl已被提交,并且Tl的提交记录已 被写入到队列A和队列D。事务T2、T3和T4还没有被提交。与用于复合事务Τ2的复合提 交操作相关的队列A和队列D的操作将在下文关于三种示例性方法中的每一种进行描述。3. 1第一种方法图7示出提交记录写操作700的流程图。队列管理器106锁定复合事务中包括的 每一个队列,如步骤702。在图6的实例中,队列管理器106锁定队列A和队列D (例如通过 设定锁定标志)。这种锁定可防止任何其它处理占用队列数据结构的可用空间。在步骤702锁定每一队列之后,队列管理器106检查每一队列中的可用存储空间, 如步骤704。在图6的实例中,队列数据结构队列A具有一块可用存储空间600,队列数据 结构队列B具有一块可用存储空间602。队列管理器106将每一队列中的可用空间量与将 要用于写入正提交的复合事务的提交记录所需的空间量进行比较。如果任何队列均没有为 提交记录预留足够可用的空间,则队列管理器106中止复合提交操作,如步骤706。队列管 理器106可稍后尝试复合提交操作,和/或尝试为一个或多个队列获取更多的存储空间。如果队列具有为提交记录预留的足够存储空间,则队列管理器106同步每一队列 以确保存储在易失性存储器中的任何消息均已被移至非易失性存储器中,如步骤708。在同 步每一队列之后,队列管理器106将提交记录写入到日志数据结构126,如步骤710。在写 入日志提交记录之后,队列管理器106将提交记录写入至每一队列,如步骤712。在将提交 记录写入到队列之后,队列管理器106解锁所述队列,如步骤714。日志提交记录的写入是限定复合提交操作可恢复的位置的原子动作。如果在步骤 710的队列管理器106写入日志提交记录之前,排队系统100在复合提交操作期间出现故 障,则中止对所有队列的提交操作(由于某些队列可能还没有被同步至非易失性存储器以 及还没有提交记录被写入到任何队列)。如果在步骤710的队列管理器106写入日志提交 记录之后,排队系统100在复合提交操作期间出现故障,则完成对所有队列的提交操作(由于每一队列已被同步至非易失性存储器以及从日志提交记录可恢复提交记录)。3. 2第二种方法在第二种方法中,队列管理器106将每个队列中的可用空间量与要用于写入正在 提交的复合写事务和任何未完成的事务(此处使用的“未完成的事务”包括复合事务和写 事务)的提交记录的空间量进行比较。队列数据结构队列A包括一块预留的存储空间604, 用于写入T2和未完成事务T3的提交记录。队列数据结构队列B包括一块预留的存储空间 606,用于写入T2和未完成事务T3及T4的提交记录。图8A示出在写事务开始时执行的“开启操作”800的流程图。对于每一队列queue_ i,队列管理器106记录未完成事务Ti的个数,对于未完成事务来说其提交记录还没有被写 入。在开启关于queue」的新事务和递增Ti之前,队列管理器106锁定队列(简单写事务 的单个队列或在复合事务中被添加消息的每一个队列),如步骤802,并检查队列以确保存 在用于“开启记录(open record)”和提交记录的空间,如步骤804。队列管理器106将当 前可用空间与下面给出的Dtl进行比较D0 = 1条开启记录的大小+1条提交记录的大小X (Ti+1)如果可用空间大于或等于Dtl,则队列管理器106解锁queuej,如步骤806,写入 “开启记录”,如步骤808,以及递增未完成事务Ti的数量,如步骤810。否则,如果可用空间 小于D。,则队列管理器106解锁queuej,如步骤812,并中止开启(open)操作800,如步骤 814。图8B和图8C分别示出提交记录写操作840和相关写操作850的流程图。队列 管理器106(或I/O管理器114)使用提交记录写操作840进行提交操作,并使用写操作 850(可能同时地)将除了提交记录之外的任何数据写入到队列。在这种方法中,由于在将 任何数据写入到队列数据结构之前,写操作850包括检查队列的可用空间,所以提交记录 写操作840不需要检查队列中的可用空间。如下文具体描述的,队列管理器106确保每一 队列queue」为该队列的Ti个未完成事务的每一个的提交记录预留足够的空间。因此,当 执行提交记录写操作840时,队列管理器106可安全地认为已经为每一提交记录预留了空 间。参照图8B,在提交记录写操作840中,队列管理器106首先同步每一队列,如步骤 842。在同步每一队列之后,队列管理器106写入日志提交记录,如步骤844。在写入日志提 交记录之后,队列管理器106将提交记录写入到每一队列,如步骤846。参见图8C,队列管理器106使用写操作850将数据写入到队列数据结构。队列管 理器106首先确定待写入的数据是否是提交记录,如步骤852。如果是,则队列管理器106 写入提交记录,如步骤854,并递减未完成事务Ti的数量,如步骤856。如果否,则队列管理 器106锁定队列,如步骤858,并检查该队列中的可用存储空间,如步骤860。队列管理器 106将当前可用空间与下面给出的0,进行比较Dw =待写入的数据的大小+1条提交记录的大小XTi其中数据的大小反映以合适单位(例如字节)表示的数据大小。如果可用空间大 于或等于Dw,则队列管理器106写入数据,如步骤862,并解锁队列,如步骤864。否则,如果 可用空间小于Dw,则队列管理器106解锁队列,如步骤866,并中止写操作850,如步骤868。 在该方法中,当检查存储空间时仅锁定单个队列,该队列是正被写入数据的队列。
3. 3第三种方法图9A和图9B示出提交记录写操作900和相关写操作950的流程图。在这种方法 中,队列管理器106在写事务开始时使用图8A中所示的“开启操作”800。提交记录写操作 900和写操作950均检查队列中的可用空间。此外,在该方法中每次仅锁定单个数列。对 于每个队列queue_i,队列管理器106记录未完成事务Ti的数量(利用开启操作800递增 Ti)。队列管理器106确保每一队列数据结构为Ti未完成事务的每一个的提交记录预留足 够空间。然而,在该方法中,当队列处于“预留模式”时,在将数据写入到队列之前,队列管 理器106仅锁定队列以检查空间。预留模式提供了一种用信号通知提交操作处于进行中而 不用同时锁定所有参与队列的方式。参照图9A,在提交记录写操作900中,首先,队列管理器106为提交记录写操作
900中包括的每一队列queue_i (即,i = 1......操作900中的队列数)执行一次循环
(loop) 902 (或等效控制结构)。循环902以能够说明同时被执行的多个复合提交操作的可 能性的方式开启queue」的预留模式。在该实例中,循环902递增queue」的预留模式计 数Ri,如步骤904。预留模式计数从初始值,例如Ri = 0开始,其中queue」不处于预留模 式。当Ri >0时,queue」处于预留模式。这使得队列的预留模式状态响应于队列已被置 于预留模式的次数。在递增预留模式计数之后,在循环902中,队列管理器106锁定queue_i,如步骤 906,并检查queue」中的可用存储空间,如步骤908。队列管理器106将当前可用空间与下 面给出的D。进行比较Dc = 1条提交记录的大小XTi如果可用空间大于或等于D。,则队列管理器106解锁queuej,如步骤910,并继续 进行操作。否则,如果可用空间小于D。,则队列管理器106解锁queuej,如步骤912,并中 止提交记录写操作900,如步骤914。在循环902之后,队列管理器106同步每一队列,如步骤916。在同步每一队列之 后,队列管理器106写入日志提交记录,如步骤918。在写入日志提交记录之后,队列管理器 106将提交记录写入每一队列,如步骤920。在将提交记录写入队列之后,队列管理器106 递减该队列的预留模式计数,如步骤922。参照图9B,队列管理器106使用写操作950将数据写入到队列数据结构。队列管 理器106首先确定待写入的数据是否是提交记录,如步骤952。如果是,则队列管理器106 写入该提交记录,如步骤954,并递减未完成事务Ti的个数,如步骤956。如果待写入的数 据不是提交记录,则队列管理器106确定队列是否处于预留模式(例如通过是否Ri > 0来 确定),如步骤958。如果队列不是处于预留模式,则队列管理器106写入数据,如步骤960。 如果队列处于预留模式,则队列管理器106锁定该队列,如步骤962,并检查该队列中的可 用存储空间,如步骤964。队列管理器106将当前可用空间与如上第二种方法中确定WDw 进行比较。如果可用空间大于或等于Dw,则队列管理器106写入数据,如步骤966,并解锁 队列,如步骤968。否则,如果可用空间小于Dw,则队列管理器106解锁队列,如步骤970,并 中止写操作950,如步骤972。3. 4其它方法其它方法也可能管理提交操作以保证成功将提交记录写入到多个队列中的每一个,而无需同时锁定多个队列。例如,在第三种方法的改型中,取代使用所有未完成事务Ti 的计数,队列管理器106使用处于预留模式Ri的队列的数量来计算D。和/或Dw。在一些方 法中,在写入日志提交记录之前,由于缺少用于队列提交记录的空间从而使得提交操作失 败。4.实施可使用在计算机上执行的软件来实施此处所述的队列管理功能。例如,所述软件 形成用于运行一个或多个程序化或可编程计算机系统(其可以是各种结构,例如分布式、 客户机/服务器或栅格(grid))的一个或多个计算机程序中的步骤,其中每一计算机系统 包括至少一个处理器、至少一个数据存储系统(包括易失性和非易失性存储器和/或存储 单元)、至少一个输入装置或端口、和至少一个输出装置或端口。所述软件可形成大程序的 一个或多个模块,例如用于提供与计算图的设计或结构相关的其它服务。此处描述的数据 结构可实施为在计算机可读介质中存储的数据结构,或与在数据仓库中存储的数据模型一 致的其它有组织的数据。可在介质(例如由通用或专用可编程计算机读取的CD-ROM)上提供所述软件,或 通过网络将所述软件发送(将其编码在传播信号中)至运行所述软件的计算机。可在专用 计算机上执行所有功能,或使用诸如协处理器的专用硬件执行所有功能。可以分布的方式 执行所述软件,其中由不同的计算机来执行软件规定的不同计算部分。优选地,将每一个这 种计算机程序存储或下载至由通用或专用可编程计算机可读取的存储介质或装置上(例 如,固态存储器或介质,或磁或光介质),用于在计算机系统读取所述存储介质或装置以执 行此处所述的步骤时配置和运行所述计算机。也可考虑将本发明的系统实施为配置有计算 机程序的计算机可读存储介质,其中这样配置的存储介质使计算机系统以特定和预定的方 式操作,从而执行此处所述的功能。应理解,前面的描述旨在举例说明而非限制本发明保护的范围,本发明的保护范 围由所附的权利要求限定。例如,可以不同的顺序执行上述的多个功能步骤而不会在实质 上影响总体处理。其它实施例也包括在权利要求的范围内。
权利要求
一种方法,包括在第一数据结构中存储第一事务的多个消息,该第一数据结构存储用于队列的消息并与存储用于该队列的消息的第二数据结构分开;在该第二数据结构中存储第二事务的至少一些消息;在与该第一事务相关的多个消息已经被存储到所述第一数据结构中并且与该第二事务相关的多个消息已经被存储到所述第二数据结构中之后,提交该第一事务和该第二事务;在该第一事务已经被提交之后,将一个用于定位所述多个消息在所述第一数据结构中存储的位置的消息存储到所述第二数据结构;以及从相邻存储位置读取所述多个消息,包括从所述第一数据结构读取该第一事务的多个消息,以及从所述第二数据结构读取该第二事务的多个消息。
2.如权利要求1所述的方法,其中,将用于定位所述多个消息在所述第一数据结构中 存储的位置的消息存储到所述第二数据结构包括在该第二数据结构中存储指向该第一数 据结构的指针。
3.如权利要求2所述的方法,其中从相邻存储位置读取与该第一事务相关的多个消息 的步骤包括从该第一数据结构中读取所述消息。
4.如权利要求1所述的方法,其中该第一数据结构被存储在易失性存储器中,以及该 第二数据结构被存储在非易失性存储器中。
5.如权利要求1所述的方法,还包括将与该第一事务相关的消息从该第一数据结构移至第三数据结构;以及 其中,将用于定位所述多个消息在所述第一数据结构中存储的位置的消息存储到所述 第二数据结构包括在该第二数据结构中存储指向该第三数据结构的指针。
6.如权利要求5所述的方法,其中从相邻存储位置读取与该第一事务相关的多个消息 的步骤包括从该第三数据结构中读取所述消息。
7.一种系统,包括用于在第一数据结构中存储第一事务的多个消息的装置,该第一数据结构存储用于队 列的消息并与存储用于该队列的消息的第二数据结构分开;用于在该第二数据结构中存储第二事务的至少一些消息的装置; 用于提交该第一事务和该第二事务的装置,用于在与该第一事务相关的多个消息已经 被存储到所述第一数据结构中并且与该第二事务相关的多个消息已经被存储到所述第二 数据结构中之后,提交该第一事务和该第二事务;用于将一个消息存储到所述第二数据结构的装置,用于在该第一事务已经被提交之 后,将用于定位所述多个消息在所述第一数据结构中存储的位置的所述一个消息存储到所 述第二数据结构;以及从相邻存储位置读取所述多个消息的装置,其中,包括从所述第一数据结构读取该第 一事务的多个消息,以及从所述第二数据结构读取该第二事务的多个消息。
全文摘要
一种方法、相应系统及软件,其被描述为用于向多个队列写入数据,所述数据的每一部分被写入到相应的一个队列。该方法包括,无需同时锁定多于一个队列,确定每一队列中是否有空间可用以写入所述数据的相应部分,如果有,则预留所述队列的所述空间。该方法包括将所述数据的每一部分写入到相应的一个队列。
文档编号G06F9/46GK101996098SQ201010548569
公开日2011年3月30日 申请日期2006年6月22日 优先权日2005年6月27日
发明者克雷格·W.·斯坦菲尔, 斯皮罗·米柴伊洛夫, 桑吉维·班纳吉 申请人:起元科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1