实施操作序列化以实现分布式数据结构的一致性的消息传送

文档序号:1957957 发布日期:2021-12-10 浏览:17次 >En<

阅读说明:本技术 实施操作序列化以实现分布式数据结构的一致性的消息传送 (Messaging implementing operational serialization to achieve consistency of distributed data structures ) 是由 S·E·卢科 K·W·贝里隆德 于 2020-04-07 设计创作,主要内容包括:公开的实施例提供了对分布式数据结构的协作访问。诸如插入、删除和注释之类的操作由参与协作的各个客户端执行。序列化服务实施这些操作的单一顺序,并确保这些操作和顺序被传送到参与协作客户端中的所有客户端。一旦所有客户端都已经确认了特定操作,该信息也被传送到客户端中的所有客户端,使得客户端可以对协作数据结构执行维护活动。结果是由协作的客户端中的所有客户端共享的滚动协作窗口,其中,协作窗口的底部由尚未被协作的所有客户端确认的排序最低的操作以及由序列化服务分配的排序最高的操作定义。(The disclosed embodiments provide cooperative access to distributed data structures. Operations such as insertion, deletion, and annotation are performed by the respective clients participating in the collaboration. The serialization service implements a single order for these operations and ensures that these operations and orders are transmitted to all clients participating in the collaboration client. Once all clients have confirmed a particular operation, this information is also communicated to all of the clients so that the clients can perform maintenance activities on the collaboration data structure. The result is a rolling collaboration window shared by all of the collaborating clients, where the bottom of the collaboration window is defined by the lowest-ordered operation that has not been acknowledged by all of the collaborating clients and the highest-ordered operation that is assigned by the serialization service.)

具体实施方式

下文的描述和附图充分说明了本领域的技术人员能够实施的具体实施例。其他实施例可以纳入结构、逻辑、电、过程和其他改变。一些实施例的部分和特征可以被包括在其他实施例的部分和特征中,或者替换其他实施例的部分和特征。权利要求中阐述的实施例包括那些权利要求的所有可用等同物。

如上所述,全序广播是一种用于确保操作在分布式系统中跨每个节点完成或不由这些节点中的任何节点执行的技术。所公开的实施例利用全序广播架构来提供用于访问分布式数据结构(DDS)的协作环境。集中式序列化过程定义了由协作的多个参与者发起的操作的顺序。在至少一些方面,该顺序可以由集中式序列化过程分配给每个操作的序列号来表示。一旦将序列号分配给操作,定义该操作的信息及其被分配的序列号就被分发给该协作的所有参与者。

所公开的实施例还提供了关于哪些操作已经由协作中的所有参与者确认以及哪些操作尚未被如此确认的指示。由所有参与者确认的操作形成了“协作窗口”的下限(唯一地),表示参与者之间未决或未完全确认的操作。协作窗口的顶部由最近或最高排序的操作表示。

当所公开的实施例进行操作时,“顶”端前进通过排序较高的序列号,并且随着时间的推移,随着从每个参与者单独地接收到对操作的确认,低端也向前推进。因此,协作窗口表示分布式数据结构上的序列化操作的“滚动”窗口。

在所公开的实施例中,每个参与者(例如,作为协作的一部分的计算设备,或协作模块的实例,如下文进一步讨论的)分别负责将每个序列化操作应用于分布式数据结构的其自己的副本。因此,如果操作是由第一参与者针对由包括二十个参与者的协作会话访问的分布式数据结构发起的,则该操作将在该分布式数据结构的二十个本地副本上物理执行二十次,针对每个协作参与者一次。

所公开的实施例部分地通过将硬件处理电路配置为执行实现所公开的实施例的操作的指令来实现。为便于讨论,这些指令被统称为协作模块。指令可以被实例化以提供运行软件程序,该软件程序可以访问执行本文中描述的指令和功能所必需的指令和数据。该实例化程序贯穿本公开内容被称为协作模块实例。每个协作模块实例操作以将适当的硬件处理电路配置为执行本文中讨论并归于此的功能中的一个或多个功能。虽然特定功能可以归于协作模块实例,但并不要求明示或暗示协作模块实例包括用于实现本文中描述的功能中的所有功能的指令。相反,当特定功能归于协作模块实例时,协作模块实例仅需要包括实现该特定功能所必需的指令。

所公开的实施例中的一些实施例提供用于协作文本编辑的下一代架构。为了取得成功,这些改进应当提供快速加载时间、改变传播的低延时、提供流畅的用户体验,以及以合理的成本高度可扩展。这种下一代架构还应当提供可扩展的背景,同时还提供相对简单的实施方式,例如,通过提供无状态操作模式。下一代架构应当将智能服务与在线协作进行整合,并支持文档分支化。

所公开的文本编辑过程包括至少三种操作:插入、删除和注释。因为协作的多个参与者可能同时编辑文本的相同部分,所以冲突规则被建立以确定在检测到跨协作模块实例的相冲突的编辑时如何对其进行解决。所公开的实施例经由单个序列化服务将在每个协作模块实例处发生的变化分发到每个其他协作模块实例,该序列化服务可以经由集中式服务,例如下文讨论的同步服务,或经由对等协议来实现。

序列化服务为每个操作分配序列号,并将这些操作中的每个操作分发给协作的所有参与者。当特定操作已经被成功分发到每个协作模块实例时,序列化服务还会通知这些协作模块实例中的所有协作模块实例,以便所有协作模块实例都可以将该操作完全合并到分布式数据结构的其永久副本中(例如,按操作顺序向前移动协作窗口的底部)。在适当的情况下,参与协作的协作模块实例和序列化服务之间的消息可以被加密以确保安全通信。

可以使用发布/订阅数据模式来实现所公开的实施例。例如,Syphon是使用ApacheKafka构建的高度可用且可靠的分布式发布/订阅系统,并且可以在所公开的实施例中的一些实施例中使用。所公开的实施例可以提供多种不同类型的分布式数据结构,包括列表、映射、序列和流。在一些方面,这些数据结构可以经由合并树来实现。

所公开的实施例提供获得跨所有协作模块实例的一致状态的协作模型。变化被乐观地复制,这是因为当变化发生时,这些变化被分发到协作模块实例,然后在操作无法被分发到参与协作的协作模块实例中的所有协作模块实例的罕见事件中被反转。所公开的实施例立即提供本地变化的本地应用,从而获得交互式环境的低延时。此外,由所公开的实施例提供的操作原语可以提供用于构建更复杂的分布式数据结构,例如丰富的字符串、表格、计数器、图形以及其他类型的分布式数据结构。

一些实施方式提供使用合并树来表示共享文档结构。所公开的合并树实施方式将来自参与协作的协作模块实例中的所有协作模块实例的变化的集成委托给每个单独的协作模块实例。虽然这会导致跨每个协作模块实例复制每个操作,但它也减少了对同步服务的处理需求。合并树支持分层富文本结构,例如嵌套表,并且实现具有交叉引用,例如脚注,的多流文本。所公开的实施例中的一些实施例提供可以有效地高速缓存合并树中的信息并且在空间(文本中的位置)和时间(修订历史中的位置)二者上参考合并树位置的智能服务。

所公开的合并树提供从树的另一个分支的分支化、合并和持续集成。合并树可以高效地使用存储并且提供对共享的合并树结构的历史中的点的检索。通过向进行加入的协作模块实例提供记录的文档的副本和任何未决变化来促进协作会话的加入。所公开的实施方式可以提供本地垃圾收集,这获得了稳定的存储器使用和紧凑的存储。所公开的合并树为同步服务中的操作处理提供恒定的时间和空间要求,这获得了具有成本效益的同步服务部署。

所公开的实现还提供了本地操作的提升的性能,这是因为本地操作考虑了协作下的数据结构的总长度。这些实施方式可以提供本地模型和协作模型之间的等效表示,这与提供拆分表示的Google的操作转换(OT)和冲突树复制数据类型(CRDT)的实施方式形成对比。这简化了相对于OT和CRDT的实施方式。所公开的实施例进一步提供了简化的撤销/重做架构。通过向上遍历树以识别正确的位置/范围,可以直接从合并树的片段中读取支持撤消/重做操作的信息。变化跟踪也是所公开的合并树中固有的,这是因为合并树片段直接映射到对底层协作数据结构所做出的每个改变。此外,考虑到合并树的内部节点很少,因此树的克隆相对较快。最后的观察是,所公开的实施例为诸如插入、移除和注释之类的常见操作提供了提升的性能,同时对于更复杂且不太常见的操作具有不比其他方法差的性能。

图1A是协作消息传送架构的概览图。协作100示出了分别经由单独的计算设备102a-b协作的两个用户101a-b。分布式数据结构视图103a-b分别在显示屏幕104a-b上向两个用户101a-b示出。图1A中所示的协作消息传送架构促进了用户101a-b中任一用户对分布式数据结构(其至少一部分由视图103a-b示出)的编辑传播到协作中的其他参与者(例如,设备和/或协作模块实例)。虽然图1A仅示出了两个用户,但所公开的实施例设想了由任意数量的用户/设备/协作模块实例进行的协作。

图1A还示出了两个协作模块实例105a-b。协作模块实例105a-b中的每一个协作模块实例表示存储在非暂时性计算机可读存储介质上的一组指令和数据。协作模块实例105a-b中的指令将客户端设备102a-b中的每个客户端设备分别配置为执行本文中描述的功能中的一个或多个功能。在一些方面,参与特定协作的每个协作模块实例将在不同的物理设备上运行。在一些情况下,多个协作模块实例可以在单个物理设备上运行。在一些方面,协作模块实例105a-b中的一个或多个协作模块实例可以在除了客户端设备102a-b之外的设备(图1A中未示出的其他设备)上执行,但仍然可以从客户端设备102a-b接收输入并向其提供输出。在一些方面,协作模块实例105a可以例如在也运行同步服务106的计算机上运行。

术语协作模块无意以任何方式限制本文公开的特征,而是仅用作引用那些集体特征的符号便利。例如,无意要求实现要求保护的特征的所有指令都驻留在单个存储设备或单个计算设备上,或者例如在物理上是连续的。

在协作100的假设示例中,用户101a可以编辑分布式数据结构视图103a。本地编辑的数据被协作模块实例105a立即显示在用户101a的显示屏104a上。此外,协作模块实例105a向同步服务106发送消息110a。消息110a指示由用户101a执行的编辑操作的性质。例如,消息110a可以指示该操作是插入操作、移除操作还是注释操作。消息110a还可以指示插入操作的插入点。换言之,数据在分布式数据结构视图103a内被插入的位置。如果操作是移除操作,则消息110a指示被移除的分布式数据结构数据的范围。消息110a还指示操作的参考序列号。参考序列号是标识分布式数据结构的当用户101a(和设备102a)执行主题操作时正在对其执行操作的版本的序列号。

在接收到消息110a时,同步服务106生成由消息110a定义的操作的序列号。同步服务106然后向参与协作的协作模块105a-b中的每个协作模块广播标识由用户101a(和计算设备102a)执行的操作的消息。在图1的示例中,这包括协作模块105a-b二者。在一些实施例中,广播可以是使用广播目的地地址的实际广播网络消息。在其他实施例中,广播可以包括对参与协作100的每个协作模块共同寻址的两个或更多个单播或多播消息。广播消息被示为消息120a和120b。在一些情况下,广播消息(例如,在图1A的示例中被统称为120a和120b)还可以指示参与协作的每个协作模块已经被通知了由设备102a发起的操作。替代地,如图1A所示,单独的广播消息(共同显示为消息130a和130b)可以指示由用户101a(和计算设备102a)发起的操作已经被成功地传播到参与协作的所有协作模块。

在图1A所示的实施例中,同步服务106跨分布式数据结构上发生的所有操作而实施共同的操作顺序,无论哪个协作模块发起该操作。因此,在一些情况下,本地操作顺序可能与同步服务实施的操作顺序不同。为了解决本地操作顺序和跨参与协作的所有协作模块的共同的操作顺序之间的差异,所公开的实施例提供了冲突规则来解决这些差异。例如,在维护面向串的分布式数据结构的一些实施例中,具有更大序列号的插入操作(在公共顺序中比第二插入更晚发生)比第二插入更早地放置在串中。在其他情况下,由两个不同的协作模块发起的两次删除可能重叠。一些实施例通过确定具有较早(例如,较小)序列号的删除进行操作以执行该删除而较晚删除的重叠部分基本上没有影响来解决重叠删除。

虽然上文参考同步服务106讨论了协作系统100,但是在一些其他实施例中,可以使用对等协议来实施操作顺序。例如,一些实施例可以基于诸如orbitDB之类的开源库为数据分配序列号。

上述协作系统使得对分布式数据结构视图103a-b的每次编辑转换到由协作模块105a-b中的至少一个协作模块维护的多达三个不同状态。

图1B是示出操作如何在三个状态之间移动的状态转换图。在图1B中名为“仅本地”的第一状态155表示在协作模块(例如,102a)已经执行了本地编辑但该编辑尚未被同步服务106确认(例如,经由消息120a)的操作的状态。操作仅存在于发起该操作的协作模块上的第一状态155。该操作将在处于第二状态而不是处于第一状态的第二协作模块上初始化。

当操作/编辑已经被同步服务106(例如,经由消息120a和/或120b)确认时,操作处于第二状态160。该编辑的这种第二状态可以存在于除了执行或引起编辑的协作模块之外的协作模块处。当所有协作模块都已经确认了编辑并且对编辑的指示已经经由同步服务106(例如,经由消息130a或130b)传播到协作模块时,编辑的第三状态165,在图1B中名为“同步”状态,存在于协作模块上。该第三状态可以被认为是“同步”状态,这是因为操作已经跨协作模块而被同步,并且可能不再需要跟踪该编辑的信息,这是因为经编辑的数据在分布式数据结构内被认为是“记录的”。

所公开的实施例通过协作模块以明确定义的顺序来处理对分布式数据结构的编辑或操作。同步服务106通过为每个操作分配唯一序列号来定义操作的顺序。当每个编辑或操作都被分配了标识操作本身的序列号时,该编辑对分布式数据结构的特定版本进行操作。该特定版本可以通过与分配给该编辑或操作的序列号不同的第二序列号来标识。贯穿本公开内容,该第二序列号可以被称为用于编辑/操作的参考序列号。

下面是操作的序列号和参考序列号之间的区别的操作示例。具体而言,在由第一序列号标识的第一操作被应用于分布式数据结构之后,分布式数据结构的结果版本可以由第一序列号标识。第一序列号定义分布式数据结构的第一“版本”。由第二序列号定义的第二操作将修改分布式数据结构的第一“版本”,该版本包括由第一操作(例如,第一操作的结果)引起的修改。该第二修改的结果是分布式数据结构的第二版本。由附加序列号定义的进一步的后续操作将进一步修改分布式数据结构以形成由那些序列号定义的附加新“版本”。

基于操作的序列号和分布式数据结构的它所操作的版本,每个协作模块可以正确地将在其他协作模块处发起的操作应用到分布式数据结构的其自己的副本。即使当多个协作模块可能“同时”修改分布式数据结构时,并且即使当一些协作模块在与分布式数据结构的演进版本同步方面可能滞后时,这也是可能的。

这是经由两个规则实现的。首先,如果操作是由本地协作模块发起的,则由本地协作模块发起的后续操作对分布式数据结构的版本进行操作,该版本包括由第一操作引起的修改。换言之,协作模块操作按顺序执行,没有例外。此外,本地操作应用所有远程操作,而不管序列号。

关于在本地设备处应用特定远程发起的修改,本地设备可以仅考虑操作中的已经接收到针对其的通知的一些操作。当将特定操作应用于分布式数据结构时,与远程发起的操作的操作序列号相比,具有较低参考序列号的操作(本地的和远程发起的二者)是相关的。在发起设备处,在其发起特定操作时,具有较高操作序列号的操作是不可见的,因此在确定如何将特定操作应用于分布式数据结构时是不相关的。

图2A示出了在所公开的实施例中的一个或多个实施例中,在协作模块实例(例如,105a-b)与同步服务106之间交换的消息的示例性消息格式。在一些方面,消息100a、120a-b和130a-b中的任何一个消息可以包括下文关于图2A讨论的字段中的一个或多个字段。

消息200包括协作标识符字段202、参考序列号字段204、操作序列号字段206、操作类型字段208、操作范围字段210、操作数据字段212和最大序列号字段214。协作标识202唯一地标识参与协作的协作模块。协作标识符202标识发起由消息200标识的操作的协作模块。在一些方面,当协作模块加入协作时,分发服务器106为每个协作模块分配标识号。参考序列号字段204标识由消息200(经由字段206)标识的操作被应用到的分布式数据结构的版本。因此,由协作模块维护的分布式数据结构的每个版本是经由不同的参考序列号来标识的。在进行修改时,参考序列号204标识在(经由字段202标识的)协作模块处同步的数据段。

操作序列号字段206标识由消息206标识的操作的序列号。当发起操作的协作模块发送包括操作序列号字段206的消息时,操作序列号字段206可以被设置为指示未分配序列号的预定值(例如-1)。预定值向同步服务指示,由该消息标识的操作是新的,因此同步服务为该操作分配序列号。在同步服务106分配序列号之前,该操作可以被认为处于“仅本地”状态,如上文关于图1B所描述的。

同步服务106可以将递增序列号分配给新操作,其中顺序与同步服务接收标识那些新操作的消息的顺序一致。在同步服务106为特定操作分配序列号之后,与该操作有关的消息可以在操作序列号字段206中包括分配的序列号。

操作类型字段208指示由消息200指示的操作类型。在一些实施例中,操作类型可以指示插入、移除或注释中的一项的操作类型,但是本公开内容所设想的操作不仅限于这些类型的操作。

操作范围字段210指示由该操作对其进行操作的分布式数据结构的数据范围。在一些方面,范围是单个值,例如插入操作在流中的位置。在一些方面,例如,当分布式数据结构中的数据范围被删除时,可以指示数据范围。

操作数据字段212指示要作为操作的一部分应用的数据。例如,如果操作类型是插入,则操作数据字段212指示要插入的数据。

取决于该字段的发送方的角色,最大序列号字段214可以具有两种不同的含义。当字段214是由协作模块发送时,字段214指示由协作模块从同步服务106或者在使用对等协议时用于提供操作的序列化的对等设备接收的最大序列号。当字段214是由同步服务106发送或者从使用对等协议进行序列化的另一协作模块发送到协作模块时,字段214指示已经被参与协作的所有协作模块确认的最大序列号。

图2B是示出图2A的消息200与连续排序操作集合220之间的关系的概览图。图2B示出了分布式数据结构的快照218。快照218表示特定版本的分布式数据结构的数据值。图2B还示出了对从快照218导出的分布式数据结构的版本执行的连续排序操作集合220。

消息200也在图2B中示出,包括上文关于图2A讨论的字段中的每个字段。图2B示出了消息200的操作序列号字段206可以识别连续排序操作集合220中的最高排序的操作222。注意,当消息200是由协作模块(例如105a-b)接收时,字段206标识次序最高的操作222,这是因为消息200指示已经向该操作分配了序列号。如上所述,当协作模块发起操作时,它可以将序列号字段206设置为预定编号(例如,206),指示该操作需要具有分配给它的序列号。在这种情况下,与图2B中所示的示例相反,字段206可能不一定标识排序最高的操作。

消息200还包括版本字段204,其标识对分布式数据结构的操作224。注意,版本字段204标识分布式数据结构的版本,该版本包括操作224和排列在操作224之下的操作中的所有操作的结果。换言之,如果版本字段204的值为950,则分布式数据结构的该版本包括具有序列号950、949、948、947等的操作的结果。该示例假设操作被排列,使得序列号较高的操作发生在序列号较低的操作之后。一些实施例可以使用替代方案对操作进行排序(例如,数值较低的序列号指示在数值较高的序列号之后的排序)。

当由同步服务106发送(或由协作模块从对等网络接收)时,消息200还标识由参与协作的所有协作模块确认的操作的最大序列号。该最大序列号由字段214指示。一些实施方式可以对以下并包括操作226的操作执行垃圾收集过程232。在操作226之后排列的操作(例如,操作230)具有至少一个未决确认。图2B中所示的未决连续操作230贯穿本公开内容可以被称为协作窗口。协作窗口定义已经由同步服务106(或用于序列化的对等协议)分配序列号但尚未被参与协作的所有协作模块确认的操作。当所公开的实施例进行操作时,协作窗口表示滚动窗口,这是因为它通过由同步服务106(或对等协议)排序的顺序操作向前推进,其中,协作窗口的顶部是由最近分配的或排序最高的序列号定义的,并且协作窗口的底部是由参与协作的所有协作模块确认的最大序列号(唯一地)定义的。

图2C示出了两个协作客户端105a-b与同步服务106之间的示例性消息通信。虽然同步服务106是同步服务的示例,但其他实施例可以使用对等协议来促进协作模块实例之间的操作的序列化。

图2C示出了由同步服务(例如,106)发送到协作模块实例105a的消息234。消息234可以包括上文关于图2A讨论的字段中的一个或多个字段。具体而言,消息234被示为传送操作序列号值十(10)(例如,经由字段204)、版本九(9)(例如,经由字段206)和最大序列号八(8)(例如,经由字段214)。由于消息234是由同步服务106发送到协作模块实例105a的,因此消息234的最大序列号值八(8)指示由参与协作的所有协作模块确认的操作的最大序列号。因此,在同步服务106发送消息234时,同步服务已经从参与协作的所有协作模块接收到对直到并包括被分配了为八(8)的序列号的操作的确认。

接下来,协作模块实例105a对分发数据结构执行新操作并发送消息235。消息235可以包括上文关于消息200和图2A讨论的字段中的一个或多个字段。具体而言,消息235被示为指示协作模块实例105a以-1的初始序列号发起第一操作。“-1”是由所公开的实施例中的一些实施例定义的第一预定(序列)号的示例,以指示尚未将序列号分配给消息235中定义的第一操作(例如,经由字段208、210和212中的一个或多个字段)。消息235还指示该第一操作是由协作模块实例105a对分布式数据结构的版本10执行的。这指示在执行由消息235定义的操作之前,直到并包括分配序列号十(10)的操作的所有操作都被应用于分布式数据结构。换言之,当执行由消息235定义的第一操作时,考虑了从直到并包括操作十(10)的操作得出的任何结果。因此,如果第一操作依赖于由那些操作中的任何一个操作修改的分布式数据结构的一部分,则第一操作的结果基于那些修改。

消息235还指示协作模块实例105a接收的最大操作序列号是十(10)(如消息234所提供的)。在一些方面,消息235中所示的最大操作序列号可以被包括在字段214中。消息235用作协作模块实例105a对直到序列号十(10)的所有操作的同步服务106的确认。

接下来,图2C示出了由协作模块实例105b发送给同步服务106的消息236。消息236可以包括上文关于消息200讨论的字段中的一个或多个字段。消息236标识协作模块实例105b(例如,经由字段202),并且指示协作模块实例105b已经发起了新的操作,这可以在消息中定义(例如,经由字段208、210、212,未示出)。消息236还指示第二操作对分布式数据结构的版本八(8)进行操作。换言之,当对分布式数据结构执行第二操作时,协作模块实例105b包括具有直到并包括序列号八(8)的序列号的操作的任何结果。消息235还指示协作模块实例105b已接收到最大操作序列号八(8)。因此,与协作模块实例105a相比,协作模块实例105b在操作的通知方面有些落后。与协作模块实例105b相比,协作模块实例105a已经被通知了两个附加操作(操作九(9)和十(10))。

注意,在同步服务106接收到消息236之后,立即地,两个操作需要被分配序列号,第一操作由协作模块实例105a发起,并且第二操作由协作模块实例105b发起。还要注意,如上所述,协作模块实例105b有些落后,这是因为它仍然不知道排列为九(9)和十(10)的操作。为此,同步服务将消息237和238发送到协作模块实例105b。

消息238和238中的一个或多个消息可以包括上文关于消息200和图2A描述的字段中的一个或多个字段。在一些方面,消息237和238可以被广播或多播到更多的协作模块,而不仅仅是协作模块实例105b。消息237和238至少分别向协作模块实例105b通知分配有序列号九(9)和十(10)的操作。消息237和238可以提供定义由序列号九(9)和十(10)标识的操作的附加信息(例如,经由字段208、210和212)。

同步服务106对消息237和238的传输展示了所公开的实施例中的若干实施例的至少一个设计参数,所述参数用于跨所有协作模块而实施单一操作顺序,以及确保每个协作模块按顺序接收操作的通知。因此,由于协作模块实例105b正在经由消息236指示其最大接收序列号是八(8),分发服务器通过将操作九(9)和十(10)传送到协作模块实例105b(分别经由消息236和237),以便分发模块还可以经由消息239传送分配有序列号十一(11)的后续操作来进行响应。如图所示,消息239指示最初由消息236指示的第二操作已经被同步服务106分配了序列号十一(11)。类似的消息240向协作模块240通知第二操作及其序列号11的分配,以及分布式数据结构的对其执行第二操作的版本(如消息236中所指示的)。

图2C还示出了从同步服务106发送到协作模块实例105b的消息241。消息241示出了由协作模块实例105a发起并由消息234指示的第一操作已被同步服务分配了序列号十二(12)。消息241可以提供定义第一操作的附加信息(例如,经由字段208、210和212)。注意,消息241中的版本指示与消息235中提供的版本指示等同,这是因为这两个消息定义了相同的操作。消息241的最大序列号指示为八(8),其指示参与协作的所有协作模块的下限(在本示例中由协作模块实例105b设置)。同步服务向协作模块实例105a发送消息242。在一些方面,消息241和242可以是向协作模块105a和105b二者广播或多播的相同消息。

图2C还示出了示例性心跳消息243。心跳消息243可以包括上文关于图2A和消息200讨论的字段中的一个或多个字段。心跳消息243可以在预定或配置的不活动时段之后由协作模块实例105b发送。不活动可以由协作模块实例105b发送到同步服务106的消息来定义。在不活动确定中可以不考虑由协作模块实例105b接收的消息。由于消息243是心跳消息,因此序列号字段(例如,206)被设置为第二预定值以区别于具有未分配序列号的操作的第一预定值(例如,在消息235和236中)。心跳消息243(例如,经由字段214)指示由协作模块243接收的最大序列号是十二(12)。

消息244指示协作模块实例105a已经发起对分布式数据结构的版本十二(12)的第三操作(当第三操作由协作模块实例105a应用于分布式数据结构时,所有排列为12和更低的操作都被考虑在内)。响应于接收到消息244,同步服务106向参与协作的所有协作模块分发对第三操作的通知。为此,图2C示出了将消息245和246分别发送到协作模块105b和105a的同步服务。在一些方面,消息245和246可以是同时向至少两个协作模块105a-b广播或多播的相同物理消息。注意,消息245和246指示与最初在消息244中指示的相同的版本信息(12)和协作模块标识(105a)。还要注意,心跳消息241更新了由协作模块实例105b接收的最大序列号。由于协作模块实例105b先前表示协作窗口的下限,因此消息245和246通过指示最大序列号值十二(12)(与心跳消息243一致)来指示对协作窗口的底端的更新。

图2D示出了协作模块实例105a-b与同步服务(在这种情况下为同步服务106)之间的示例性消息交换。下文关于图2D讨论的消息中的一个或多个消息可以包括上文关于图2A中的消息200讨论的字段中的一个或多个字段。

图2D中所示的消息交换意在展示诸如同步服务106之类的同步服务如何在操作被分发到参与协作的协作模块实例(或设备)时调整操作的参考序列号。这些调整提供协作模块实例对分布式数据结构执行操作而不会阻挡或以其他方式在继续之前等待同步服务。具体而言,当协作模块实例在同步服务为那些操作中的任何操作分配序列号之前执行多个操作时,这些调整可以是适当的。

图2D示出了一系列三个消息251a-c,其指示分别由协作模块实例105a发起的第一操作、第二操作和第三操作。消息251a-c都指示没有将序列号分配给第一操作、第二操作或第三操作中的任何一个操作(例如,经由序列号的示例性预定值-1)。消息251a-c中的每个消息还示出了它们各自的操作的参考序列号十(10)。注意,参考序列号不会随着三个消息251a-c中的每个消息被发送而改变。这是协作模块实例105a在三个操作的发起之间没有从同步服务(例如,106)接收任何消息的结果。

接下来图2D示出了发送一对消息252a-b的同步服务。在一些方面,图2D中所示的两个消息252a-b可以是向协作模块实例105a-b二者广播或多播的单个物理消息。消息252a-b指示序列号11已经被分配给由消息251a定义的第一操作。分布式数据结构的由第一操作对其进行操作的版本由消息252a-b标识为版本十(10)。

接下来,图2D示出了同步服务106分别向协作客户端实例105b和105a发送消息253a-b。与消息252a-b的情况一样,消息253a-b可以是分别广播或多播到协作模块实例253b和253a的单个物理消息。消息253a-b指示序列号已经被分配给由协作模块实例105a发起(并且由消息251b指示)的第二操作。注意,虽然协作模块实例105a指示第二操作的参考序列号是10(见消息251b),但当第二操作被分配序列号时,同步服务指示第二操作的参考序列号(具有序列号十二(12))为十一(11)。注意,该参考序列号等同于分配给消息252a-b中指示的操作的序列号。因此,同步服务基于其对由协作模块实例105a执行的多个操作的序列的了解来更新第二操作的参考序列号。

具体而言,同步服务106被通知,协作模块实例105a执行了第一操作,然后接着是第二操作,然后是第三操作。该通知由消息序列251a-c提供。因此,向同步服务提供了如下指示,第二操作是对分布式数据结构的一个版本执行的,该版本包括第一操作的结果,第一操作经由消息252a-b被分配了序列号11。结果,同步服务在消息253a-b中指示,第二操作(序列号十二(12))是对分布式数据结构的版本十一(11)执行的,该版本包括第一操作的结果。

类似地,同步服务106以类似方式更新第三操作的参考序列号。如图2D所示,同步服务106发送消息254a-b(其可以与252a-b和253a-b相同),该消息通知参与由协作客户端实例105a发起的第三操作的协作的协作模块实例。第三操作最初在消息251c中指示。第三操作被分配了序列号十三(13)。第二操作被分配了序列号十二(12)。由于第三操作是对分布式数据结构的包括第二操作的结果的版本执行的,同步服务106在消息254a-b中指示第三操作的参考序列号十二(12)。

图2E是快照过程的概览图。快照过程260示出了图1A的同步服务106向持久性服务268提供操作记录265。持久性服务268将操作记录265馈送到操作日志270。在一些方面,持久性服务268与同步服务集成。

操作日志270包括个体记录272,每个个体记录定义操作。包括在操作日志270中的个体记录272可以按照由同步服务106分配给每个操作的操作序列号定义的顺序包括进来。

在一些方面,操作日志270的每个个体记录可以由包括在消息200的字段中的值中的一个或多个值组成,如上所述。操作日志270由快照服务280读取。快照服务280产生快照,例如图2E所示的快照281a和281b。快照表示分布式数据结构在特定时间点的状态。例如,快照281a可以表示在直到并包括由操作记录272表示的操作的所有操作应用于数据结构之后分布式数据结构的状态。快照服务280可以接收第一快照,例如快照281a,以及序列号大于第一快照中包括的最大序列号操作的操作的附加操作记录集合作为输入。这些操作记录在图2E中被表示为285。快照服务280然后将附加操作285应用于第一快照281a以生成第二快照281b,其表示分布式数据结构的直到并包括操作记录288的第二状态。

图2E还示出了供应服务290。供应服务290负责将新的协作模块联机到现有协作中。为此,供应服务290向新的协作模块(图2E中的102c)供应最新的快照,图2E中的281b。供应服务290还向新协作模块实例105c供应序列号大于包括在先前快照281b中的那些操作的操作记录。图2E将这些操作记录示为292a,其从操作日志270读取作为292a并被提供给新的协作模块实例105c作为记录292b。协作模块实例105c然后将操作记录292b应用于快照281b以获得由协作管理的分布式数据结构的“当前”或最新版本。

图3示出了在所公开的实施例中的一些实施例中,可以用于构建树的两个数据结构。在这些实施例中的一些实施例中,生成和维护树数据结构以包括一个或多个块数据结构300和一个或多个元素数据结构320。除了树的叶层之外,树的所有层包括下文关于块数据结构300描述的字段中的一个或多个字段,而树的叶节点可以包括下文关于叶/元素数据结构描述的一个或多个字段。如下所述的示例性合并树数据结构(叶、节点、块、树、元素等)表示在物理硬件存储器中提供的数据值的示例性格式。例如,下文描述的字段中的每个字段可以存储硬件存储器中的一个或多个值。这些值可以由硬件处理电路,例如一个或多个硬件处理器,存储在存储器中。这些值还可以由一个或多个硬件处理器根据需要从硬件存储器中读取以执行本文中讨论的功能中的一个或多个功能。在一些实施例中,硬件处理电路可以经由标识这些数据值中的每个数据值的存储器地址来写入或读取这些值。在一些方面,存储器地址可以是基于字的地址,并且数据值可以不必以字对齐的方式存储在存储器内的物理位置中。在这些情况下,如本领域中已知的,硬件处理电路可以被配置为读取包括特定值的数据字,然后在硬件处理电路内对字值执行附加处理以隔离非字对齐的值。所公开的实施例可以利用通过硬件处理电路访问存储在硬件存储器中的一个或多个数据结构的任何现有方法。

下文关于图3讨论的示例性合并树块300具有可变长度。换言之,块300可以被存储在硬件存储器的可变数量的部分中(例如,可变数量的字节、字等)。长度基于参与协作的协作模块的数量和该协作的当前协作窗口的大小而变化。协作窗口可以被认为是针对分布式数据结构的、跨参与该协作的所有协作模块已经发起但尚未被最终确定(“同步”)的多个编辑或操作。为了跟踪对针对分布式数据结构的、尚未完全同步/确认的编辑,合并树块300包括最小长度字段302。块300的最小长度字段表示由块下方的树的元素表示的分布式数据结构的长度,这些元素跨所有协作模块是公共的或同步的。换言之,至少在一些方面,最小长度字段302表示由块下方的元素表示并且与小于或等于在字段214中接收到的最大序列号的序列号相关联的数据长度,如上所述。

块300还包括可变数量的协作模块标识符字段,例如字段304。字段314被示为协作模块标识符字段的另一示例,尽管合并树块300中的协作模块标识符字段的数量可以从零变化到潜在的任何上限,仅受参与协作的协作模块的数量限制。

对于合并树块300中包括的每个协作模块实例标识符,合并树块300中还包括可变数量的数据对。每对数据关联参考序列号(例如,3061..n)和长度值(例如,存储在字段3081..n中)。存储在字段3161..n中的序列号值和存储在字段3181..n中的长度值被示为与不同的协作模块实例标识符314相关联,以显示每个协作模块实例标识符的关联数量可以不同。

上文介绍的块300的字段跟踪由合并树表示的分布式数据结构的哪个部分对参与协作的每个协作模块实例是可见的。由这些字段提供的信息针对分布式数据结构的由参考序列号(例如,3061..n和3161..n)标识的每个版本来进行维护。当确定如何将源自本地或远程协作模块实例的操作应用于特定合并树时使用该信息。该信息可能是必要的,这是因为当该远程协作模块发起操作时远程协作模块处的分布式数据结构的版本可能不等同于第二协作模块处的分布式数据结构的第二版本。在所公开的实施例中的一些实施例中,第二协作模块需要以复制远程协作模块获得的结果的方式将操作应用于分布式数据结构的该第二版本。部分长度信息支持这些操作。

特定块和特定协作模块的部分长度信息可以由下面的公式1定义,在该公式中对由块表示并满足定义条件的所有叶节点元素执行求和:

pLen(op client,op ref seq,block)=minLen(block)+Σlen(leaf.op seq≤opref seq)+len(leaf.client=op client和leaf.op seq>op ref seq) (1)

其中:

minLen()返回块所表示的数据的最小长度(块所表示的同步数据的长度),

len()返回分布式数据结构中的数据长度,由匹配识别出的条件的元素表示,

op client是发起操作的协作模块的标识符,

op ref seq是操作的参考序列号,

leaf node.client标识发起操作的协作模块,由叶节点表示,

leaf node.op seq是第二操作的操作序列号,由叶节点表示

示例性元素数据结构320包括数据字段322、操作序列号字段324、删除序列号字段325、参考序列号字段326和发起操作328的协作模块的标识符。数据字段322包括表示由特定元素表示的协作数据的一部分(例如,分布式数据结构)的数据。操作序列号324标识分配给由该元素表示的操作的序列号。删除序列号325标识用于删除由元素数据结构320表示的数据的操作的序列号。换言之,操作序列号324可以指示插入或注释数据的操作的序列号,并且如果该数据随后被删除,则删除序列号325将指示该(后续)操作的序列号。

参考序列号326指示当协作模块执行由元素320定义的操作时由该协作模块接收的同步操作的最大序列号。同步操作可以是已经被参与协作的所有协作模块确认的那些操作。操作协作模块标识符字段328标识发起操作的协作模块。

以下图4-图13表示支持两个协作模块之间的协作的数据结构,为简单起见,将其称为协作模块实例105a和协作模块实例105b。这两个协作模块各自编辑字符串结构,并且合并树数据结构支持这些编辑跨协作模块102a-b二者的同步。

图4示出了由协作模块实例105a维护的合并树部分400的示例。合并树部分400表示字符串“Cat on the mat”。该字符串是两个子字符串连接的结果。第一子字符串“on themat”由合并树部分400的合并树块405a以及由协作模块实例105a插入在字符串“on themat”的位置零(0)处的第二字符串“Cat”表示。插入操作由块405b表示。块405a-b中的每一个块可利用上文关于合并树节点/块300讨论的字段中的一个或多个字段。

由块405b表示的插入操作还没有被服务器确认,因此被分配序列号-1,如图所示。由块405a表示的插入“Cat”的参考序列号为零(0),这是因为插入发生在分布式数据结构的、具有被分配了序列号零(0)的排序最高的版本(字符串“on the mat”)上。

图4还示出了树部分400的块420。树的块420存储最小长度值422(例如,在一些方面存储在字段302中)。最小长度值422对应于由片段405a表示的数据“on the mat”的长度。由片段405a表示的数据是确认数据,这是因为参与协作的所有协作模块实例都具有产生字符串“on the mat”的确认操作。由于被分配了小于或等于当前参考序列号的序列号的操作的结果(例如,在一些方面,如在来自分发服务器的字段214中所提供的)对参与协作的所有协作模块实例都是可见的。因此,该数据的长度可以被包括在最小长度值422中。

块420还包括协作模块实例105a的部分长度信息,如424所示。部分长度信息424指示当协作模块实例105a访问具有为零或更大值的序列号的那些片段时,块420下方的片段包括四(4)个附加的数据字符(超出最小长度)。这对应于由协作模块实例105a插入“Cat”。块420不包括协作模块实例105b的任何部分长度信息,这指示在任何情况下都没有附加数据可用于协作模块实例105b(这是因为“Cat”的插入还没有被分发服务器分配序列号并且因此对于实例105b是不可见的)。

图5示出了协作模块实例105b上的示例性合并树部分500。图5的示例性合并树部分500表示字符串“Big on the mat”。合并树部分500包括由元素505a表示的字符串部分“on the mat”,其与上文关于协作模块实例105a和合并树部分400讨论的由元素405a表示的“on the mat”的字符串部分同步。

树部分500还包括第二元素502b,其表示字符串“Big”在字符串“on the mat”的位置零(0)处的插入操作。插入操作由协作模块实例105b发起。协作模块实例105b将序列号-1分配给插入“Big”操作,直到插入被同步服务确认。由元素505b表示的插入的参考序列号/分布式数据结构版本为零。这指示对分布式数据结构执行插入“Big”的操作时,考虑了具有较低排序或等同序列号为零的操作的结果。

图5还示出了树部分500的块520。块520指示块520下方的叶元素的最小长度值522。最小长度值522表示由元素505a表示的同步数据的长度。换言之,长度值522指示由节点520表示的已经传出协作窗口的底端(例如230)的数据的长度。

块520还包括协作模块实例105b的部分长度信息524。部分长度信息524指示对于零或以上的参考序列号,块520下方的叶元素除了最小长度值522之外还包括四个附加的数据字符。块520不包括协作模块实例105a的任何部分长度信息。这指示除了由最小长度值522表示的数据之外,在树部分500中没有对协作模块实例105a可见的附加数据。

图6示出了协作模块实例105b上的合并树部分600的经更新版本。图6的合并树部分600反映了在协作模块实例105b上发生的附加插入操作,以及因此对合并树部分500的修改。第二插入操作在字符串中的位置四(4)处插入单词“furry”,并由元素505c表示。单词“furry”出现在字符串中单词“big”之后,单词“big”由元素505b表示。由元素505c表示的插入操作被分配序列号-1,这是因为该操作尚未由服务器分配序列号,并且被分配了为零的参考序列号,这是因为“furry”这个词的插入发生在从服务器接收到任何操作之前。

树部分600的块被示为620。块620指示最小长度值622为十一,再次表示由元素505a表示的数据。最小长度值622不包括由元素505b和505c表示的数据的长度,这是因为该数据未被参与协作的所有协作模块实例确认。该块还包括部分长度信息612。由于协作模块实例105b发起了由元素505b和505c表示的两个插入操作,并且这两个操作都具有为零的参考序列号,因此部分长度信息612指示,协作模块实例105b对树部分600的访问具有为零的参考序列号或者超过最小长度值622的更多的参考十(10)个数据字符。这十个字符表示由元素505c表示的六个字符和来自元素505b的四(4)个字符(每个字符串在末尾包括空格)。

图7示出了在协作模块实例105b处存储的合并树部分600的经更新版本。经更新部分被标记为700。树部分700示出,来自图4的、由协作模块实例105a发起的插入操作“cat”已经被传播(例如,经由同步服务106)到协作模块实例105b。该插入操作在树部分700中表示为元素505d。

由协作模块实例105a进行的“cat”的插入与由协作模块实例105b进行的“big”和“furry”的插入冲突,这是因为这些插入中的所有插入都是在字符串的零位置。冲突规则确定元素505d在树部分700中的位置因此基于插入操作的参考序列号确定。协作模块实例105a插入“Cat”的参考序列号为零。在上文讨论的冲突规则下,“big”和“furry”插入操作向左移动,这是因为它们将被分配比“cat”插入的序列号更大的序列号(一(1))。

图7还示出了树部分700的块720。该块指示最小长度值722。块720还分别指示协作模块实例105a和102b的部分长度信息712a-b。部分长度信息712a指示针对为一(1)或更大值的参考序列号的四(4)个字符的部分长度。这对应于由元素505d表示的数据的长度。由元素505b和505c表示的数据对于协作模块实例105a尚不可见,因此没有为协作模块实例105a提供该数据的部分长度信息。协作模块实例105b的部分长度信息712b指示,对于大于或等于零(0)的参考序列号,在块720下方的元素中包括十个数据字符。这十个字符包括由片段505b和505c表示的数据。部分长度信息712b还包括如下指示,对于为一(1)或更大值的参考序列号,块720下方的元素包括14个数据字符。与部分信息712b中的参考序列号零(0)相比的参考序列号一(1)的附加四(4)个数据字符是由块505d表示的数据。由块505d表示的数据被分配序列号一(1),并且由协作模块实例105a发起。

在从同步服务106接收到插入“Cat”的通知之后,协作模块实例105b可以从同步服务106接收对插入“Big”的确认。同步服务分配“big”操作的插入,由元素505b表示的序列号为二。这将在下面的后续示例中显示。

图8示出了来自图4的合并树部分400的经更新版本作为树部分800。树部分800示出协作模块实例105a已经被通知,协作模块实例105b将“Big”插入到字符串中。该插入操作被表示为元素405c。“Big”的插入使用了参考序列号零(0),这与由元素405b表示的“Cat”的插入的参考序列号相冲突。根据冲突规则,“Big”放在“Cat”之前,这是因为它的序列号(二(2))在“Cat”(其是一(1))之后。

树部分800包括块820。块820指示最小长度值822。块820分别包括协作模块102a-b中的每个协作模块的部分长度信息812a-b。部分长度信息812指示,对于协作模块实例105a,块820下方的元素表示参考序列号为零的四个数据字符(由块405b表示)。部分长度信息812a还指示,对于协作模块实例105a,当参考序列号为二或更大值时,块820下方的元素表示八个(8)附加数据字符(除了最小长度值822之外的)。这八个数据字符由元素405b和405c表示。关于协作模块实例105b,部分长度信息812b指示,当参考序列号为零时,块822下方的元素表示四(4)个附加数据字符(超出最小长度值822)。这四(4)个附加字符由块405c表示,其由协作模块实例105b发起并且具有为零的参考序列号。当协作模块实例105b的参考序列号为一(1)时,部分长度信息812b指示,块820下方的元素表示总共八(8)个附加数据字符,这是因为当参考序列号为一时,“Cat”插入对协作模块实例105b变得可见。

图9示出了协作模块实例105a的经更新版本将树部分合并为树部分900。树部分900示出了附加插入操作已经在协作模块实例105a上发生。插入操作将字符串“top of”插入到前一个字符串“big cat on the mat”的位置11处。由于插入发生在由先前协作模块实例105a合并树中的元素405a表示的字符串“on the mat”的中间,因此元素405a被拆分为两个元素,标记为元素405d和405e。新字符“top of”由元素405f表示。由于由元素405d表示的字符“on”和由元素405e表示的字符“the mat”二者均源自具有为零(0)的序列号的原始字符串“on the mat”,因此为零的序列号还被分配给分别表示“on”“the mat”的元素405d和405e中的每个元素。当协作模块实例105a插入“top of”字符串时,它还向服务器发送指示插入操作、插入的字符和插入位置的消息。该插入操作的序列号被分配为-1(如图9所示),直到分发服务器106为插入操作提供确认的序列号为止。

包括在树部分900中的块920指示最小长度信息922。对于协作模块105a-b,合并树部分900的部分长度信息在块920中分别示为922a-b。部分长度信息922a指示,对于协作模块实例105a,为零的参考序列号在块920下方的元素中包括十四(14)个附加数据字符。这十四(14)个附加字符包括由元素405b、405d和405f表示的数据。当协作模块实例105a上的参考号达到二(2)或更多时,由协作模块实例105b进行的对“Big”的插入变得对协作模块实例105a可见,因此部分长度信息相对于序列号零增加四(4),如部分长度信息912a所示。

关于协作模块实例105b,部分长度信息912b指示,当参考序列号为零时,块920下方的元素提供四(4)个附加字符。这四(4)个附加字符由块405c表示。部分长度信息912b还指示,当参考序列号为一(1)时,块920下方的元素提供四(4)个附加字符。当协作模块实例105a的对“Cat”的插入变得对协作模块实例105b可见时,这四(4)个附加字符由块405b表示。

图10示出了协作模块实例105b上的经更新树部分1000。树部分1000反映在协作模块实例105b从服务器接收到对插入“furry”的确认之后的状态。如图所示,更新为“furry”分配了序列号。

块1020还指示了分别针对协作模块实例105a和102b的部分长度信息1012a-b。部分长度信息1012a指示针对为零(0)或更大值的参考序列号的四(4)个字符的部分长度。这对应于由元素505d表示的数据的长度,其由协作模块实例105a发起。当参考序列号为零时,由元素505a和505c表示的数据对于协作模块实例105a尚不可见,因此当参考序列号为零时,没有为协作模块实例105a提供该数据的部分长度信息。

部分长度信息1012a还指示,当协作模块实例105a的参考序列号为二时,由元素505b表示的四个附加字符变得对协作模块实例105a可见。当参考序列号为三时,部分长度信息1012a指示,块1020下方的元素包括附加的十四(14)个信息字符,包括由元素505b和505c(和505d)二者表示的数据。

协作模块实例105b的部分长度信息1012b指示,对于大于或等于零(0)的参考序列号,在块1020下方的元素中包括十个数据字符。这十个字符包括由片段505b和505c表示的数据。部分长度信息1012b还包括如下指示,对于为一(1)或更大值的参考序列号,块1020下方的元素包括14个数据字符。与部分信息1012b中的参考序列号零(0)相比的参考序列号一(1)的附加四(4)个数据字符是由块505d表示的数据。由块505d表示的数据被分配了为一(1)的序列号,并且由协作模块实例105a发起。

图11示出了在协作模块实例105a已经被分发服务器106通知插入“Furry”之后,协作模块实例105a上的示例性合并树部分1100。插入由元素405g表示。来自服务器的通知向协作模块实例105a指示,Furry插入被分配了为三(3)的序列号。

包括在树部分1100中的块1120指示最小长度信息1122。对于协作模块105a-b,合并树部分1100的部分长度信息在块1120中分别示为1122a-b。部分长度信息1122a指示,对于协作模块实例105a,为零的参考序列号在块1120下方的元素中包括十四(14)个附加数据字符。这十四(14)个附加字符包括由元素405b、405d和405f表示的数据。当协作模块实例105a上的参考号达到二(2)或更多时,由协作模块实例105b进行的对“Big”的插入变得对协作模块实例105a可见,因此部分长度信息相对于序列号零增加四(4),达到总共十八(18),如部分长度信息1112a所示。当协作模块实例105a上的参考号达到三(3)或更多时,由协作模块实例105b进行的对“furry”的插入变得可见,因此部分长度信息1112a指示参考号三(3)的附加的六(6)个数据字符,如图所示。

关于协作模块实例105b,部分长度信息1112b指示,当参考序列号为零时,块1120下方的元素提供四(4)个附加字符。这四(4)个附加字符由块405c表示。部分长度信息1112b还指示,当参考序列号为一(1)时,块1120下方的元素提供四(4)个附加字符。当协作模块实例105a的对“Cat”的插入变得对协作模块实例105b可见时,这四(4)个附加字符由块405b表示。

图12示出了合并树部分1200,其指示协作模块实例105a已经从同步服务106接收到对“top of”的插入的确认。同步服务106为“top of”的插入操作分配了为四(4)的序列号。这在元素405f中示出。

包括在树部分1200中的块1220指示最小长度信息1222。对于协作模块105a-b,合并树部分1200的部分长度信息在块1220中分别示为1222a-b。部分长度信息1222a指示,对于协作模块实例105a,为零的参考序列号在块1220下方的元素中包括十四(14)个附加数据字符。这十四(14)个附加字符包括由元素405b、405d和405f表示的数据。当协作模块实例105a上的参考号达到二(2)或更多时,由协作模块实例105b进行的对“Big”的插入变得对协作模块实例105a可见,因此部分长度信息相对于序列号零增加四(4),达到总共十八(18),如部分长度信息1212a所示。当协作模块实例105a上的参考号达到三(3)或更多时,由协作模块实例105b进行的对“furry”的插入变得可见,因此部分长度信息1212a指示针对为三(3)的参考号的附加的六(6)个数据字符,如图所示。

关于协作模块实例105b,部分长度信息1212b指示,当参考序列号为零时,块1220下方的元素提供四(4)个附加字符。这四(4)个附加字符由块405c表示。部分长度信息1212b还指示,当参考序列号为一(1)时,块1220下方的元素提供四(4)个附加字符。当协作模块实例105a的对“Cat”的插入变得对协作模块实例105b可见时,这四(4)个附加字符由块405b表示。通过将序列号(4)分配给由元素405f表示的对“top of”的插入,然后可以更新部分长度信息1212b以指示这一点。换言之,当访问树部分1200时,协作模块实例105b当其参考序列号为四(4)或更大值时对十五(15)个附加信息字符具有可见性(超出由最小长度值1222指示的),如部分长度信息1212b所示。相对于为一(1)的序列号的附加七个字符由块405f表示的数据提供。

图13示出了在协作模块实例105b接收到对由协作模块实例105a进行的对字符串“top of”的插入的通知之后,存储在协作模块实例105b上的合并树部分1300。插入由元素505g表示。为了完成插入,协作模块实例105b将其先前的“on the mat”元素505拆分为两个元素505e和505f,以分别表示“on”和“the mat”。然后,“top of”插入由元素505g表示,如图所示。

块1320分别包括协作模块105a-b的最小长度值1322和部分长度信息1312a-b。基于由元素505g表示的“top of”插入,关于为四(4)的参考序列号(等同于分发服务器106分配给“top of”插入操作的序列号)的指示提供了相对于为一、二或三的参考序列号的附加7个数据字符,如部分长度信息1312b所示。

图14是用于将对分布式数据结构的操作分发到多个协作模块的示例性过程的流程图。在一些方面,下文针对图14讨论的过程1400可以由同步服务106来执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。

在操作1405中,与多个协作模块实例建立协作会话。例如,如上文关于图1A所讨论的,多个协作模块实例(例如,协作模块实例102a和102b)可以各自编辑分布式数据结构,例如文本串。建立协作会话可以包括,例如,检索定义分布式数据结构的特定版本的数据,并且在一些方面,从一个或多个相应协作模块获得定义对分布式数据结构的一个或多个进行中操作的数据。进行中操作可能尚未与参与协作会话的每个协作模块实例同步。

在操作1410中,接收对分布式数据结构的操作的指示。例如,如上文关于图1A所讨论的,对分布式数据结构执行操作的协作模块实例可以向同步服务106通知该操作(例如,经由图2A的消息200)。操作1410还可以包括:接收分布式数据结构的对其执行操作的版本的指示(例如,经由消息200的参考序列号206)。在操作1410中接收的进一步指示可以包括:操作的类型(例如,插入、删除或注释)、对发起操作的协作模块实例的指示(例如,字段202)、与操作相关联的值(例如,注释值,或者作为另一例子,插入的字符串字符)和对在分布式数据结构中执行操作的位置的标识。例如,分布式数据结构中的偏移可以标识用于插入的插入点。作为另一示例,偏移范围可以指示要被操作删除的分布式数据结构的一部分。

在操作1415中,向操作分配序列号。在一些方面,可以根据对操作的指示被协作模块实例的公共服务,例如同步服务106,接收的顺序,将操作序列号分配给操作。分配给每个接收操作的序列号可以是单调递增的编号或严格递增的编号。在一些方面,当协作模块实例发起操作并向公共服务(例如,同步服务106)告知该操作时,协作模块实例可以将新操作的序列号发起为预定义编号,例如负一(-1)。公共服务在接收到通知时,可以至少部分基于被设置为该预定义编号的操作的序列号来识别需要向该操作分配序列号。

在操作1420中,将定义操作的信息分发给参与协作会话的多个协作模块实例。在一些方面,该信息可以被指示为与上文关于图2A讨论的字段中的一个或多个字段一致。操作1420可以包括:生成包括该信息的消息,并将其发送到参与协作会话的每个协作模块实例。例如,图1A示出消息120a和120b向协作模块实例105a和105b中的每个协作模块实例分发消息,向那些协作模块实例中的每个协作模块实例告知由协作模块实例105a发起的操作。在该特定示例中,自从操作由协作模块实例105a发起以来已经知晓该操作的协作模块实例105a经由消息120a识别分配给该操作的序列号。

操作1425确定信息是否已经被分发到参与协作的协作模块实例中的所有协作模块实例。如果不是,则处理返回到操作1420,在该操作处将信息分发到一个或多个附加设备。

如果信息被分发到所有协作模块实例,则过程1400移动到操作1430,该操作向参与协作的所有设备指示,分配给该操作的序列号是同步的。换言之,操作1430向协作模块实例中的所有协作模块实例告知,每个协作模块实例现在知晓该操作。在一些方面,操作1430是通过更新上文关于图2A所讨论的字段214以指示与在操作1415中分配的操作序列号等同的值来完成的。然后可以将消息200发送到协作模块实例中的所有协作模块实例。这在图1A中关于附加消息130a和130b示出,附加消息130a和130b分别向协作模块实例105a和105b中的每一个协作模块实例告知,操作已经跨所有协作模块实例被完全同步了。

例如,如上文关于图2A所讨论的,从同步服务106发送到协作模块实例(例如,105a和/或105b)的消息定义了对分布式数据结构执行的操作。在一些方面,操作1410还包括:接收对(例如,由同步服务106)分配给该操作的序列号的指示。该指示可以被包括在由协作字段(例如,字段206)接收的消息(例如,200)的字段中。操作1410还可以包括:接收分布式数据结构的对其执行操作的版本的指示(例如,字段204中的参考序列号)。

图15是用于将对分布式数据结构的操作分发到多个协作模块实例的示例性过程的流程图。在一些方面,下文关于图15讨论的过程1500可以由协作模块实例,例如协作模块实例105a-b中的任何一个协作模块实例,执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论功能中的一个或多个功能。

在开始操作1502之后,过程1500移动到操作1505。在操作1505中,确定发起操作的节点、位置、参考序列号和协作模块实例。例如,在一些方面,可以执行过程1500以识别树中的要对其应用操作的一部分。例如,插入、删除或注释操作可以由本地操作或者由远程协作模块实例生成。该操作可以指示分布式数据结构中的该操作将影响的一部分。例如,插入命令可以指示分布式数据结构内的插入点。删除操作可以指示分布式数据结构中的要删除的数据范围。注释操作可以指示要添加的注释在分布式数据结构中的位置。

操作1510将偏移变量设置到搜索中指示的位置。随着过程1500的继续,偏移变量可以变化。

决策操作1515评估在操作1505中识别的节点是块(树的非叶节点)还是元素(树的叶节点)。如果节点是叶,则在操作1505中识别的位置由叶节点定位或表示。因此,可以返回叶节点的标识作为搜索结果。过程1500然后移动到结束操作1519。如果节点是非叶节点,则过程1500从决策框1515移动到操作1520。

在操作1520中,获得节点的子节点。在一些方面,操作1520被配置为:从数据结构的第一位置(例如,表示数据结构的开始部分的节点)到数据结构的第二位置(表示数据结构的结束部分的节点)遍历子节点。例如,操作1520可以被配置为:当分布式数据结构表示富文本字符串时提供表示字符串开头的节点,并且操作1520的后续调用可以提供表示富文本字符串的逐渐后面的部分的节点。

在操作1525中,确定由子节点表示的协作模块实例特定长度。基于发起操作的协作模块实例和该协作模块实例处的参考序列号来确定协作模块实例特定长度。例如,如上文关于图4-图13中任意图的示例性树结构所讨论的,所公开的实施例可以维护定义由树结构的特定部分表示的、分布式数据结构的协作模块实例特定长度的部分长度信息。在一些方面,部分长度可以基于上文讨论的公式1来确定。

操作1525可以基于部分长度以及最小长度值来确定协作模块实例特定长度,其中,最小长度值指示由树中的操作1520的子节点下方的一部分表示的分布式数据结构的最小大小或长度。可以将子节点的部分长度值与最小长度相加以确定协作模块实例特定长度。

决策操作1530确定在操作1525中确定的长度是否大于或等于偏移值。如果长度大于偏移,则正在被搜索的位置(来自操作1505)由树中的当前节点表示的该部分表示。在这种情况下,过程1500移动到操作1535,该操作通过将节点设置为前一节点的子节点而移动到树中的较低层。如果长度不大于偏移值,则当前节点不表示分布式数据结构中的包括该位置在内的一部分。因此,根据所确定的长度对偏移值进行调整。过程1500然后移动到操作1545,并确定节点的另一个子节点(当前节点的对等节点)。

图16是用于将对分布式数据结构的操作分发到多个协作模块实例的示例性过程的流程图。在一些方面,下文关于图16讨论的过程1600可以由协作模块实例,例如协作模块实例102a-b中的任何一个协作模块实例,执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。

在开始操作1602之后,过程1600移动到操作1605。在操作1605中,接收定义操作的信息。该信息可以从用于协作会话的公共服务接收。公共服务可以与参与协作会话的协作模块实例通信。在一些方面,公共服务是上文讨论的同步服务106。定义操作的信息可以包括上文关于消息200和图2A讨论的项目中的一个或多个项目。例如,该信息可以包括公共服务分配给该操作的操作序列号。操作序列号唯一地标识操作。该信息还可以包括操作的参考序列号。参考序列号标识分布式数据结构的由操作修改的版本。该信息还可以包括对操作类型的指示,例如该操作是对分布式数据结构,例如文本串或富文本串,的插入、删除还是注释。该信息可以包括与操作相关联的值(例如,要插入到数据结构中的数据,或用于注释数据结构的数据)。该信息还可以包括对与参与协作会话的每个协作模块实例同步的操作的最大序列号的指示(例如,字段214的值)。该信息还可以包括分布式数据结构内要被应用操作的位置(例如,消息200的字段210)。

在操作1610中,为合并树添加或修改元素以表示该操作。在一些方面,框1610可以包括针对添加/修改的元素和树的根之间的每个块节点更新协作模块实例特定的部分长度信息。因此,如果协作模块实例105a发起特定操作,则可以针对添加的节点/元素和根之间的每个块节点来更新协作模块实例105a特定的部分长度信息。

例如,基于特定参考序列号将数据插入富文本字符串的操作可能导致表示所插入的数据的元素与表示富文本字符串的树的根节点之间的每个节点可以被更新,以将特定参考序列号与和所插入的数据的长度相等的部分长度的增加相关联。发起操作信息的协作模块实例的部分长度被更新为

在操作1615中,接收关于与序列号相关联的操作是同步操作的指示。例如,如关于图1所讨论的,协作模块实例105a-b中的每一个协作模块实例可以接收相应的消息130a-b,该消息指示操作已经跨参与协作的所有协作模块实例而被同步。在一些方面,这可以通过将消息200的字段214设置为与由公共服务(例如,同步服务106)分配的操作的序列号等同的值来实现。

在操作1620中,基于所接收的对操作1615的指示来更新参考序列号。换言之,协作模块实施方式可以跟踪分布式数据结构的最大同步序列号。当协作模块实例发起操作时,它可以使用所跟踪的参考序列号作为操作的基础。换言之,所跟踪的参考序列号用于标识分布式数据结构的协作模块实例对其进行操作的版本。当这些操作经由公共服务(例如,同步服务106)与其他协作模块实例共享时,提供该信息。例如,分布式数据结构的用作特定操作的基础的版本可以经由消息200,并且具体地,在一些实施例中,经由字段204,被传送到其他协作模块实例,如上所述。

在操作1620完成之后,过程1600移动到结束操作1625。

图17是访问分布式数据结构的示例性过程的流程图。在一些方面,过程1700可以由运行协作模块实例的设备执行。例如,过程1700可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面,执行下文关于图17讨论的功能中的一个或多个功能的协作模块实例可以在实施方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面,下文关于图17讨论的过程1700可以由协作模块实例执行,例如由协作模块实例105a-b中的任何一个协作模块实例执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。在下文图17的讨论中,执行方法1700的设备可以被称为“执行设备”。

在开始操作1702之后,过程1700移动到操作1705。在操作1705中,识别最近最少使用的节点。如上所述,在经由树表示分布式数据结构的实施例中,可以维护树上最近最少使用的节点列表。最近最少使用的节点列表可以用于促进垃圾收集和/或树结构的其他优化。

在一些方面,除了LRU列表之外,还可以用一些其他方式通过操作1705来识别节点。例如,如上所述,随着参与协作的所有协作模块实例所确认的操作的最大序列号的增加,可以执行对表示分布式数据结构的数据结构的一些维护,例如,如下所述。

决策操作1715评估分配给由节点表示的操作的序列号是否小于由协作的所有参与者(例如,协作模块实例)已经确认的最大序列号。换言之,该节点是表示协作窗口内还是协作窗口下方的操作。在一些实施例中,这可以通过比较由节点标识的两个序列号来实现。例如,节点可以指示插入或注释序列号(例如,经由字段324)并且也删除序列号(经由字段325)。如果指示了多个序列号,则这多个序列号中的所有序列号都必须在协作窗口下方通过,然后才能在节点上执行进一步的操作(例如,垃圾收集)。

如果节点表示操作仍在协作窗口内,则过程1700返回到操作1705并且可能从LRU列表中选择另一个节点。

如果由节点表示的操作已经传出协作窗口,则过程1700从决策操作1715移动到操作1720,其评估该操作是删除。为了做出该确定,操作1720可以评估节点是否包括删除序列号(例如,325)。如果指示了删除序列号,则过程1700移动到操作1722并删除叶节点。处理然后返回到操作1705。如果该节点不表示删除操作,则过程1700移动到决策框1725,其确定该操作是否为插入操作。如果操作是插入,则过程1700从决策操作1725移动到操作1730,其识别分布式数据结构的相邻部分(例如,由兄弟节点表示)。操作1740可以将分布式数据结构的相邻部分集成到单个叶节点中。集成可取决于那些其他部分是否也已通过协作窗口下方。过程1700然后返回以从LRU列表中获得另一个节点。

图18是访问分布式数据结构的示例性过程的流程图。在一些方面,过程1800可以由运行协作模块实例的设备执行。例如,过程1800可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面,协作模块实例执行下文关于图18讨论的功能中的一个或多个功能。协作模块实例(例如,105a-b)可以在实施方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面,下文关于图18讨论的过程1800可以由协作模块实例执行,例如由协作模块实例105a-b中的任何一个协作模块实例执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。在下文图18的讨论中,执行方法1800的设备可以被称为“执行设备”。

在开始操作1805之后,过程1800转换到操作1810,其识别起始节点。在一些方面,起始节点可以是表示分布式数据结构的树的根节点。

在操作1815中,操作序列号的部分长度信息小于或等于由参与协作的所有协作模块实例确认的最大序列号(例如,字段214的值)。推理支持操作1815是:一旦特定序列号小于或等于由所有协作模块实例确认的最大序列号,则分配给该特定序列号的操作已经被参与协作的所有协作模块实例看到和/或应用,因此不需要为该操作保持部分长度。注意,节点的最小长度值可以基于所删除的部分长度信息而进行调整。

决策操作1820确定是否存在额外的节点要检查。如果没有,则过程1800在结束操作1840处完成。否则,过程1800移动到操作1830,其递归地遍历到树中的下一个节点。

图19是访问分布式数据结构的示例性过程的流程图。在一些方面,过程1900可以由运行协作模块实例的设备执行。例如,过程1900可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面,协作模块实例可以在实施方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。在下文图19的讨论中,执行方法1900的设备可以被称为“执行设备”。

在开始操作1900之后,过程1900移动到操作1910,其加入协作会话。协作会话提供对分布式数据结构的访问。加入协作会话可以包括:建立与同步服务106的会话。在一些方面,加入协作会话可以包括经由对等协议与参与协作会话的其他设备和/或协作模块实例对接。

在操作1915中,对分布式数据结构执行离线编辑。执行离线编辑可以包括:生成对分布式数据结构的操作。在利用诸如本文中讨论的树结构的实施例中,执行离线编辑可以包括:根据需要生成非叶节点和/或叶节点以在本地表示离线操作。由于编辑可能在执行设备无法联系同步服务106(或在使用对等协议时的其他对等设备)时生成,因此在执行设备处维护的协作窗口可能会变得相对较大,包括提供离线编辑操作中的所有操作。

在操作1920中,执行设备重新加入协作会话。例如,虽然在操作1915期间执行设备可能不具有去往同步服务106的网络连接,但在1920中恢复了同步服务106和执行设备之间的网络连接。

在操作1925中,接收分布式数据结构的快照。如上所述,快照指示分布式数据结构在一时间点处的绝对值或状态。因此,作为一个示例,如果在快照之前对分布式数据结构应用了一项或多项操作,则快照表示那些一项或多项操作的组合结果。

在操作1930中,在快照之后发生的(由其他协作模块实例发起的)任何附加操作被传送到执行设备(以及进行执行的协作模块实例)。这允许执行设备基于快照和附加操作来表示分布式数据结构的版本。注意,只有序列号大于快照版本的操作才会包括在该版本中。

在操作1935中,离线编辑被应用于快照。在一些方面,操作1935包括:为离线编辑中的每个离线编辑发送消息200,每个消息将特定离线编辑定义为对分布式数据结构的操作。每个消息将由过程1900构造,与上文讨论的消息200的描述一致。操作1935还可以包括:从同步服务接收相应数量的响应/消息,同步服务106为离线编辑/操作中的每一者分配序列号。然后,执行设备可以表示分布式数据结构的附加版本,该附加版本包括1930的操作和1935的操作二者。该过程将生成由执行设备维护的分布式数据结构的版本,该版本与参与协作的其他协作模块实例维护的分布式数据结构版本一致。

决策操作1940确定离线编辑和应用于快照的操作之间是否存在任何冲突。如果存在冲突,则过程1900移动到操作1950,其显示解除冲突对话框。解除冲突对话框被配置为:提供对发生冲突的两个操作中的一个操作的手动选择。所选择的操作将应用于分布式数据结构,而两个操作中的第二操作将被取消。

图20是访问分布式数据结构的示例性过程的流程图。在一些方面,过程2000可以由运行协作模块实例的设备执行。例如,过程2000可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面,执行下文关于图20讨论的功能中的一个或多个功能的协作模块实例可以在实施方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面,下文关于图20讨论的过程2000可以由协作模块实例执行,例如由协作模块实例102a-b中的任何一个协作模块实例执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。在下文图20的讨论中,执行方法2000的设备可以被称为“执行设备”。注意,在各种实施例中,上文关于至少图15-图19和/或图21和/或图22讨论的功能中的一个或多个功能可以被包括在过程2000中。

在开始操作2005之后,过程2000移动到操作2010。操作2010加入协作会话。协作会话提供对分布式数据结构的访问。加入协作会话可以包括打开到服务,例如同步服务106,的网络连接。加入协作会话还可以包括:向服务标识协作会话将提供对其的访问的分布式数据结构。在一些方面,分布式数据结构可以是文件的形式。在一些方面,文件可以被存储在可经由网络访问的稳定存储设备上。在一些方面,可以经由统一资源定位符(URL)来标识分布式数据结构。

在操作2015中,接收标识对分布式数据结构的连续排序操作的消息。在一些方面,该消息是从同步服务106接收的。在利用对等协议在参与协作会话的协作模块实例之间进行通信的一些其他方面,可以从参与协作会话的其他协作模块实例中的一个协作模块实例接收消息。所标识的操作中的每个操作具有未决确认。连续排序操作定义分布式数据结构的协作窗口。换言之,协作窗口表示已经由参与协作的某个协作模块实例发起但尚未被参与协作的协作模块实例中的所有协作模块实例确认的对分布式数据结构的操作。因此,当将协作视为一个整体时(考虑参与协作的所有协作模块实例),协作窗口表示仍在“进行中”的操作。

如上文关于图2A和消息200所讨论的,可以指示操作序列号(例如,经由字段206)和经同步或经确认操作的最大序列号(例如,经由字段214)。这两个值提供了对分布式数据结构的连续排序操作的指示。例如,如果经确认操作的最大序列号是N,并且操作序列号是N+C(其中C是常数),则存在由消息标识的C个连续排序操作,这些操作具有未决确认。之所以如此,是因为当所有设备都确认操作时,经确认操作的最大序列号(例如,214)会“朝着”操作序列号(例如,206)前进。新操作将在操作序列号被分配给参与协作的协作模块实例时推进操作序列号。

在操作2020中,分布式数据结构的第一版本被表示为包括连续排序操作中的每个操作。通过将分布式数据结构表示为包括连续排序操作中的每个操作,对第一版本的后续操作基于连续排序操作中的每个操作的结果。一些方面可以通过对定义连续排序操作的信息进行存储或排队来实现这一点。例如,一些实施例可以使用队列或树型数据结构来存储未决(未确认)的操作。一旦连续排序操作被适当地存储或排队,在这些实施例中分布式数据结构被认为是“表示”那些操作。

在一些方面,一旦操作被参与协作的所有协作模块实例确认,该操作就可以应用于分布式数据结构。换言之,分布式数据结构中包括的数据可以被操作不可撤销地修改。关于如何表示对分布式数据结构的操作的细节因实施例而异。在一些实施例中,与分布式数据结构上的协作异步的垃圾收集过程或其他过程可以将操作应用于包括在分布式数据结构中的数据。例如,如上所述的垃圾收集过程可以对由参与协作的所有协作模块实例所确认的操作进行操作。在一些方面,基于在操作2015中接收到的消息,分布式数据结构可以基于该操作而被修改。

在操作2025中,分布式数据结构的第二版本被表示为包括第一操作,第一操作在连续排序操作中的最后一个操作之后。第一操作由执行设备发起。如上所述,一些实施方式可以存储定义未决操作的信息。因此,在这些实施例中,定义第一操作的信息,例如操作的类型(例如,字段208)、分布式数据结构内的操作被应用到的位置或范围(例如,字段210)、操作被应用到的分布式数据结构的版本(例如,字段204)和发起操作的协作模块实例(例如,字段202),可以被存储、排队或以其他方式记录。通过表示分布式数据结构的第二版本,对分布式数据结构执行的后续操作考虑了第一操作的结果。通过表示对分布式数据结构的第一操作,第一操作之后的操作取决于第一操作的结果(在一定程度上,后续操作取决于第一操作的结果)。

在操作2030中,发送通知消息。通知消息指示,第一操作应用于分布式数据结构的第一版本。在一些方面,通知消息包括上文关于图2A描述的字段中的一个或多个字段。这些字段的一个或多个值特定于第一操作。在利用集中式服务进行操作的序列化的实施例中,可以将通知传送到同步服务106。在利用对等协议进行序列化的其他实施例中,可以将通知传送到参与协作的另一个协作模块实例。

过程2000的一些方面包括接收多个通知。每个通知针对相应的操作。如上文的通知,每个通知指示分配给相应操作的唯一序列号。每个通知还标识发起操作的协作模块实例。在一些方面,协作模块实例与客户端设备之间可以存在一对一的映射,因此协作模块实例的标识可以与正在运行协作模块的特定实例的特定物理上不同的计算设备的标识同义。分配给操作中的每个操作的唯一序列号指示将操作应用于分布式数据结构的顺序。通过过程2000接收的多个通知中的一个或多个通知可以用于由执行设备发起的操作。例如,如上所述,当协作模块实例发起新操作时,它可以向参与协作的其他协作模块实例传送与上文关于消息200描述的字段中的一个或多个字段相对应的值。由于尚未为操作分配序列号,因此它可以发送指示相同的预定值。一旦分配了序列号,就会向最初发起新操作的协作模块实例提供回通知。该通知将指示进行接收的协作模块实例的标识符(例如,在字段202中)。

在一些实施例中,过程2000可以包括:发起分布式数据结构的第二操作,并且稍后接收对附加操作的通知。该通知可以进一步指示(例如,经由分配给附加操作的序列号)附加操作将在第二操作之前应用于分布式数据结构。替代地,如果执行设备接收到为第二操作分配序列号的通知,并且然后随后接收到为附加操作分配第二序列号的第二通知,则第二操作是在附加操作之前被应用于分布式数据结构。

过程2000的一些方面包括:解决对分布式数据结构的两个操作之间的编辑冲突。基于两个序列号的相对顺序来解决编辑冲突,两个序列号中的每个序列号被分配给相冲突的两个操作中的一个操作。例如,两个编辑操作之间的编辑冲突可能导致在分布式数据结构中,排列较后的插入出现在排列较早的插入之前。通过按照与其分配的序列号的顺序一致的顺序执行删除操作来解决两个删除操作之间的编辑冲突。

过程2000的一些方面包括:接收对经更新的协作窗口的指示,该经更新的协作窗口排除这些连续操作中的一些操作;以及基于所接收的指示,对排除的操作执行垃圾收集。

在操作2030之后,过程2000移动到结束操作2035。

图21是访问分布式数据结构的示例性过程的流程图。在一些方面,过程2100可以由运行协作模块实例的设备执行。例如,过程2100可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面,协作模块实例还可以在实施方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面,下文关于图21讨论的过程2100可以由协作模块实例执行,例如由协作模块实例105a-b中的任何一个协作模块实例执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。在下文图21的讨论中,执行方法2100的设备可以被称为“执行设备”。注意,在各种实施例中,上文关于至少图15-图20和/或图22讨论的功能中的一个或多个功能可以被包括在过程2100中。

在开始操作2105之后,过程2100移动到操作2110。操作2110加入协作会话。协作会话提供对分布式数据结构的访问。加入协作会话可以包括打开到服务,例如同步服务106,的网络连接。加入协作会话还可以包括:向服务标识协作会话将提供对其的访问的分布式数据结构。在一些方面,分布式数据结构可以是文件的形式。在一些方面,文件可以被存储在可经由网络访问的稳定存储设备上。在一些方面,可以经由统一资源定位符(URL)来标识分布式数据结构。

在操作2120中,接收到通知。在至少一些实施例中,通知可以是网络消息的形式。可以从同步服务106接收通知。在利用对等协议在协作会话的协作模块实例之间进行通信的一些其他实施例中,可以从参与协作会话的其他协作模块实例中的一个协作模块实例接收通知。

通知指示由远程设备执行的操作。换言之,操作由执行设备以外的设备执行。操作例如可以是对序列数据结构,例如文本串、富测试串或流,的插入、删除或注释操作。可以经由分配给操作的序列号来指示该操作。

通知还指示操作相对于分布式数据结构的位置。例如,位置可以包括从分布式数据结构的起始数据点或字节到分布式数据结构中要应用插入、删除或注释操作的位置的偏移,该偏移在各个方面中以字节或字为单位。在插入操作的情况下,位置指示将新数据插入到分布式数据结构中的何处,该位置之后的分布式数据结构的操作前版本的数据位于新插入的数据之后。在注释操作的情况下,位置指示要对分布式数据结构的哪个部分进行注释。在移除操作的情况下,位置指示分布式数据结构中的要移除的数据。例如,位置可以指示要通过移除操作从分布式数据结构中移除的数据位置的范围。

该通知还可以指示分布式数据结构的应用该操作的版本。例如,如上所述,应用于特定分布式数据结构的最高操作序列号可以定义该特定分布式数据结构的版本。该版本或序列号信息可以经由包括消息200的字段中的一个或多个字段的消息传送到参与协作的协作模块实例,例如在执行设备上运行的协作模块实例,如上文关于图2A所讨论的。

在操作2130中,识别分布式数据结构中的由树的第一节点表示的一部分的最小长度。树表示分布式数据结构。操作2130中所提到的第一节点可以是树的任何节点,包括根节点或根节点下方的节点。在一些方面,第一节点可以是树的叶节点。

如上所述,在将分布式数据结构表示为树的实施例中,分布式数据结构的一些部分可以跨参与协作的所有协作模块实例而被同步。因此,这些部分对于这些协作模块实例中的所有协作模块实例都是恒定的,并且可以确定这些部分的长度。该长度是操作2130中提到的最小长度,并且与本公开内容通篇讨论的最小长度的讨论一致。

在一些实施例中,通知还可以指示与参与协作的所有其他客户端确认或同步的操作的最小序列号。例如,如以上关于图2所讨论的,通知可以包括字段214。

在操作2140中,确定特定于第二设备并且由第一节点表示的部分长度。如上所述,当参与协作的设备将操作应用于分布式数据结构时,分布式数据结构通过包含那些操作中的每个操作的顺序版本演进。因此,参与协作的两个协作模块实例可以具有稍微不同的分布式数据结构的版本,直到某些编辑已经被传送到两个协作模块实例为止。在操作2140中确定的最小长度考虑了跨协作模块实例的分布式数据结构版本的这些差异。操作2140确定由分布式数据结构的应用了第二设备操作的版本的第一节点表示的部分长度。如上所述,该部分长度不仅可以特定于执行操作的协作模块实例,还可以特定于分布式数据结构的应用了特定操作的版本。在一些方面,公式1可用于确定部分长度。在一些实施例中,在执行操作2140之前,该部分长度可能已经被预先确定并且第一节点被更新以反映部分长度。

在操作2145中,确定由第一节点表示的、分布式数据结构的部分的大小。大小基于最小长度和部分长度。在一些方面,大小是最小长度和部分长度的总和。

在操作2150中,确定该部分的大小大于或等于该操作在分布式数据结构内的位置。如上所述,在将分布式数据结构表示为树的实施例中,树的特定节点表示分布式数据结构的特定部分。过程2100描述了实施例可以如何基于由每个节点表示的分布式数据结构的长度,通过搜索树的节点来识别哪些特定节点表示正在对其应用操作的树的一部分。

虽然操作2150指示第二设备操作的位置在第一节点处或低于第一节点,但在其他示例中,大小可以小于该位置,从而指示需要搜索第一节点的其他子节点,以识别表示分布式数据结构中的包括该位置的一部分的节点。该过程可以跨第一节点的兄弟节点继续,直到识别出树的适当分支为止。然后该过程可以在树中的较低处进行以逐渐缩小分布式数据结构的该部分的范围,直到识别出表示该部分的叶节点为止。

在操作2160中,基于操作2150的确定来确定叶节点。由于操作2150确定了分布式数据结构的包括该位置的部分由第一节点表示,因此操作2160可以深入到树中(到第一节点的子节点)以逐渐缩小搜索范围,直到识别出表示该位置的叶节点为止。

在操作2170中,基于所识别的叶节点在树中表示第二设备操作。表示该操作可以包括各种项目。如果操作是插入或移除操作,则可以根据需要拆分所识别的叶节点来提供单个叶节点以包括分布式数据结构中的受操作影响的部分。例如,如果执行插入操作,则叶节点可以在该位置处被拆分为三个节点,第一节点表示分布式数据结构中的所插入的数据之前的一部分,第二叶节点表示所插入的数据,并且第三叶节点表示来自所识别的叶节点的任何剩余数据。对于移除操作,可以更新叶节点以指示该操作的序列号。所识别的叶节点也可以被拆分以进行移除操作,使得所移除的数据由单个叶节点表示,或者至少未删除的数据不与被删除的数据在同一叶节点中表示。对于注释操作,可以更新叶节点以包括注释信息。也可以根据需要对叶节点进行适当的拆分以表示树中的操作。

在操作2170完成之后,过程2100移动到结束操作2175。

图22是访问分布式数据结构的示例性过程的流程图。在一些方面,过程2200可以由运行协作模块实例的设备执行。例如,过程2200可以由设备102a和/或102b中的一个或多个设备来执行。在一些方面,协作模块实例还可以在实施方式的服务器侧运行,例如在也运行同步服务106的计算机上运行。在一些方面,下文关于图22讨论的过程2200可以由协作模块实例执行,例如由协作模块实例105a-b中的任何一个协作模块实例执行。在一些方面,存储在存储器(例如,下文的指令2304)中的指令(例如,下文的指令2324)可以将硬件处理电路(例如,下文的处理器2302)配置为执行下文讨论功能中的一个或多个功能。在下文图22的讨论中,执行方法2200的设备可以被称为“执行设备”。

注意,在各种实施例中,上文关于至少图15-图19和/或图20和/或图21和/或图24讨论的功能中的一个或多个功能可以被包括在过程2200中。

在操作2205中,执行设备加入协作。协作提供对分布式数据结构的访问。加入协作会话可以包括打开到服务,例如同步服务106,的网络连接。加入协作会话还可以包括:向服务标识协作会话将提供对其的访问的分布式数据结构。在一些方面,分布式数据结构可以是文件的形式。在一些方面,文件可以被存储在可经由网络访问的稳定存储设备上。在一些方面,可以经由统一资源定位符(URL)来标识分布式数据结构。

在操作2210中,接收对分布式数据结构的序列化的多个相应操作的指示。在一些方面,这些指示中的每个指示可以是来自序列化服务的消息,包括上文关于消息200和图2A讨论的字段中的一个或多个字段。该指示还指示发起这些操作中的每个操作的设备(例如,消息200的字段202)。如上所述,指示可以改为指示协作模块实例,而不指示设备。

在操作2215中,在树的叶节点中表示对分布式数据结构的多个操作(例如,经由320)和对分布式数据结构的操作的结果(例如,经由至少322)。如上所述,例如,关于图4-图13,操作可以在树的叶节点中表示,并且基于操作的发起设备(例如,协作模块实例)、发起设备向其应用操作的DDS版本、以及分配给操作的序列号来选择性地应用于分布式数据结构的数据。

在操作2220中,针对分布式数据结构中的由非叶节点下方的叶节点表示的一部分来表示发起设备(或发起协作模块实例)特定长度。在各种实施例中,可以针对树中的每个非叶节点,或者至少针对树的叶节点和根节点之间的非叶节点,来执行操作2230。如上所述,部分长度信息被包括在树的非叶节点中。还可以在非叶节点中表示最小长度值,最小长度值表示由非叶节点下方的叶节点表示的DDS的最小长度。

在操作2225中,接收对由特定发起设备进行的附加操作的附加指示。还接收到对分布式数据结构内应用操作的位置的指示(例如,要插入的位置、或者要移除的位置范围、或者要注释的位置)。在一些方面,操作2225包括:接收包括上文关于图2A讨论的字段中的一个或多个字段的消息,该消息提供指示。

在操作2230中,识别树的叶节点,该叶节点表示分布式数据结构中的附加操作被应用到的一部分。例如,如果该操作是在偏移X处的插入到字符串中的插入操作,则操作2230识别表示字符串中的偏移X的叶节点。为了识别叶节点,操作2230依赖于上文讨论的特定于发起该操作的设备(或协作模块实例)的部分长度值中的一个或多个部分长度值。基于分布式数据结构的特定发起设备对其应用附加操作的版本,进一步识别叶节点。

在操作2235中,基于附加操作来修改叶节点。如上所述,一些示例修改包括:将引导节点拆分为多个节点以促进数据的插入。对于删除操作,可以通过记录分配给删除操作的序列号来修改叶节点。在一些实施例中,还可以拆分叶节点以提供专用于所删除的数据的叶节点。如果操作是注释操作,则可以将注释数据复制到叶节点,或者以其他方式与叶节点相关联。(粗体字符串的指示文本是注释的一个示例)。

如上所述,过程2200可以包括:从序列化服务(或对等协议)接收指示消息200的字段中的一个或多个字段的消息,如上文关于图2A所讨论的。如上文关于图2B所讨论的,这些消息定义尚未被协作的所有参与者(协作模块实例或设备)确认的操作的协作窗口。过程2200还可以包括:将维护过程应用于树中的表示协作窗口下方的操作的叶节点。如上所述,这些维护操作可以包括:当那些叶节点表示DDS的连续数据时对叶节点进行组合,完全移除节点(例如,如果数据被协作窗口下方的操作删除,则表示该数据的叶节点可以从树上移除)。

图23示出了可以在其上执行本文中讨论的技术(例如,方法)中的任意一种或多种技术的示例性机器2300的框图。在替代实施例中,机器2300可以作为单独的设备操作,或者可以连接(例如,网络连接)到其他机器。在网络化的部署中,在服务器-客户端网络环境中,机器2300可以作为服务器机器、客户端机器或这二者来进行操作。在示例中,机器2300可以用作对等(P2P)(或其他分布式)网络环境中的对等机器。机器2300可以是个人计算机(PC)、平板PC、机顶盒(STB)、个人数字助理(PDA)、移动电话、智能电话、网络设备、网络路由器、交换机或桥、服务器计算机、数据库、会议室设备,或者能够(顺序或以其他方式)执行规定将要由该机器执行的动作的指令的任何机器。在各个实施例中,机器2300可以执行上文针对图1-图22或下文针对图24所描述的过程中的一个或多个过程。此外,虽然仅示出了单个机器,但术语“机器”也应当被理解为包括单独或联合执行一组(或多组)指令,以便执行本文中讨论的方法中的任意一种或多种方法的机器的任意集合,例如云计算、软件即服务(SaaS)、其他计算机集群配置。

如本文所描述的,示例可以包括下列各项或者可以在下列各项上操作:逻辑单元或多个组件、模块或机构(在下文中都被称为“模块”)。模块是能够执行指定操作的有形实体(例如,硬件),并且可以用某种方式配置或布置。在示例中,可以用指定的方式将电路布置(例如,内在地和或相对于诸如其他电路之类的外部实体)为模块。在示例中,一个或多个计算机系统(例如,单独的客户端或服务器计算机系统)的部分或整体,或者一个或多个硬件处理器1202可以由固件或软件(例如,指令、应用部分或应用)配置为操作以执行指定操作的模块。在示例中,软件可以位于机器可读介质上。在示例中,当由模块的底层硬件执行时,软件使得硬件执行指定操作。

因此,术语“模块”被理解为包括有形实体,是物理构建的、特别配置(例如,硬线连接的)或临时(例如,暂时)配置(例如,编程)以便以特定方式执行,或者执行本文中描述的任何操作的部分或所有的实体。考虑在其中模块是临时配置的示例,这些模块中的每个模块不需要在任何一个时刻进行实例化。例如,在模块包括使用软件配置的通用硬件处理器的情况下,通用硬件处理器可以在不同时刻被配置为各个不同的模块。软件可以相应地将硬件处理器配置为例如在一个时刻构造特定的模块,并且在另一个不同时刻构成不同的模块。

机器(例如,计算机系统)2300可以包括硬件处理器2302(例如,中央处理单元(CPU)、图形处理单元(GPU)、硬件处理器内核或它们的任意组合)、主存储器2304和静态存储器2306,其中的一些或所有可以经由互连(例如,总线)2308与彼此进行通信。机器2300还可以包括显示单元2310、字母数字输入设备2312(例如,键盘)、以及用户接口(UI)导航设备2314(例如,鼠标)。在示例中,显示单元2310、输入设备2312和UI导航设备2314可以是触摸屏显示器。机器2300可以额外包括存储设备(例如,驱动单元)2316、信号生成设备2318(例如,扬声器)、网络接口设备2320、以及一个或多个传感器2321,例如全球定位系统(GPS)传感器、罗盘、加速计、或其他传感器。机器2300可以包括输出控制器2328,例如串行(例如,通用串行总线(USB)、并行或其他有线或无线(例如,红外线(IR)、近场通信(NFC)等)连接,以便传送或控制一个或多个外围设备(例如,打印机、卡阅读器等)。

存储设备2316可以包括机器可读介质2322,在其上存储有体现本文中描述的技术或功能中的任意一种或多种或由其使用的一组或多组数据结构或指令2324(例如,软件)。指令2324还可以完全或至少部分位于主存储器2304内、静态存储器2306内,或者在由机器2300对该指令的执行期间在硬件处理器2302内。在示例中,硬件处理器2302、主存储器2304、静态存储器2306或存储设备2316的一种或任意组合可以构成机器可读介质。

虽然将机器可读介质2322示为单个介质,但术语“机器可读介质”可以包括被配置为存储一个或多个指令2324的单个介质或多个介质(例如,集中式或分布式数据库、和/或相关联的高速缓存器和服务器)。

术语“机器可读介质”可以包括能够进行存储、编码或携带用于由机器2300执行的指令,并且使得机器2300执行本公开内容的技术中的任意一种或多种技术,或者能够进行存储、编码或携带由这些指令使用或者与这些指令相关联的数据结构的任何介质。非限制性的机器可读介质的示例可以包括固态存储器以及光学和磁介质。机器可读介质的具体示例可以包括:非易失性存储器,例如半导体存储器设备(例如,电可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)))和闪存器设备;磁盘,例如内部硬盘和可移动盘;磁光盘;随机存取存储器(RAM);固态硬盘(SSD);以及CD-ROM和DVD-ROM盘。在一些示例中,机器可读介质可以包括非暂时性机器可读介质。在一些示例中,机器可读介质可以包括不是瞬时传播信号的机器可读介质。

指令2324还可以经由网络接口设备2320使用传输介质在通信网络2326上发送或接收。机器2300可以利用多种传输协议(例如,帧中继、互联网协议(IP)、传输控制协议(TCP)、用户数据报协议(UDP)、超文本传输协议(HTTP)等)中的任意一种协议来与一个或多个其他机器通信。示例性通信网络可以包括局域网(LAN)、广域网(WAN)、分组数据网络(例如,互联网)、移动电话网络(例如,蜂窝网络)、普通老式电话(POTS)网络,以及无线数据网络(例如,被称为的电气和电子工程师协会(IEEE)802.11标准系列、被称为的IEEE 802.16标准系列)、IEEE802.15.4标准系列、长期演进(LTE)标准系列、通用移动电信系统(UMTS)标准系列、对等(P2P)网络等等。在示例中,网络接口设备2320可以包括一个或多个物理插口(例如,以太网、同轴电缆或电话插口)或连接到通信网络2326的一个或多个天线。在示例中,网络接口设备2320可以包括多个天线以便使用单输入多输出(SIMO)、多输入多输出(MIMO)、或多输入单输出(MISO)技术中的至少一种技术以无线的方式进行通信。在一些示例中,网络接口设备2320可以使用多用户MIMO技术进行无线通信。

图24是可以由序列化服务实现的示例性过程的流程图。例如,过程2400可以由序列化服务106执行。在一些方面,存储在存储器(例如,上文的指令2304)中的指令(例如,上文的指令2324)可以将硬件处理电路(例如,上文的处理器2302)配置为执行下文讨论的功能中的一个或多个功能。在下文图24的讨论中,执行方法2200的设备可以被称为“执行设备”。注意,在各种实施例中,上文关于至少图14-图19和/或图20和/或图21和/或图22讨论的功能中的一个或多个功能可以被包括在过程2400中。

在开始操作2402之后,过程2400移动到操作2405,其建立与多个设备的协作会话。协作会话提供对分布式数据结构的访问。

在操作2410中,接收到消息。该消息请求为操作分配序列号。例如,操作2410可以接收包括上文关于图2A和消息200讨论的字段中的一个或多个字段的消息。例如,该消息可以指示发起该操作的协作模块实例或设备(例如,字段202),并且请求将序列号分配给该消息中指示的操作(例如,该操作可以由字段208、2010、212中的一个或多个字段指示)。在如上所述的一些方面,可以经由包括在序列号字段206中的预定值(例如,-1)来指示该请求。

在一些方面,所接收的消息可以被解码以识别消息中指示的序列号被设置为预定值,预定值指示需要将序列号分配给操作(例如,序列号字段206可以被设置为预定值,例如-1)。然后可以基于关于消息正在请求序列号分配的识别来做出确定。

在一些方面,所接收的消息指示分布式数据结构的与操作相关联的版本号(例如,经由字段204)。

在操作2415中,向操作分配序列号。响应于在操作2410中接收到的消息来执行操作。可以如上文关于例如图2B和/或图2C中的任一图所描述的那样来分配序列号。例如,可以分配序列号以定义由参与协作会话的各种协作模块实例或设备发起的操作的顺序。

在操作2420中,向多个设备中的每个设备发送指示操作和所分配的序列号的第一通知。例如,第一通知可以包括上文关于图2A和消息200讨论的字段中的一个或多个字段。如上所述,执行设备可以经由单独发送给每个参与者的单个广播消息、多个多播消息或个体单播消息来通知协作参与者(设备和/或协作模块实例)中的每一者。由于第一通知可以包括图2A的字段中的任何字段,因此该通知还可以向多个设备中的每个设备通知已经被所有设备确认的操作的当前最大序列号(例如,参考序列号)。

可以生成第一通知以进一步指示与操作相关联的版本。此外,还可以在第一通知中提供与操作相关的任何信息。例如,第一通知可以包括与在操作2410中接收的消息中包括的值一致的、消息200的字段中的任何字段中的值。如上文关于图2D所描述的,在一些情况下,与从协作参与者接收的第一操作相关联的版本号可以基于该参与者处的其他本地发起的操作而被调整。具体而言,当第一操作被执行时,在协作参与者处没有分配序列号的操作的数量与版本号是如何调整的有关。调整版本号以考虑这些操作(具有未决的序列号分配)。如上所述,如果第一操作与第一版本相关联,但发起参与者在发起第一操作之前还有N个其他操作未决,则可以调整第一版本以反映,这N个未决操作在第一操作在协作参与者处发起之前被应用于分布式数据结构。在利用数值上更高的序列号来表示排序较高的操作和版本的一些方面,第一版本可以被调整为第一版本+N。在一些方面,N可以通过以下方式来确定:首先确定参与者自操作2410消息中指定的分布式数据结构的版本以来发起的操作的数量(不包括2410的消息的操作)。N可以被设置为该操作的数量。这在上文关于图2D进行了描述。

操作2425确定多个设备(是设备和/或协作模块实例的协作的参与者)中的每个设备已经确认了该操作。操作2425可以通过监测从多个设备中的每个设备接收的消息来做出该确定。具体而言,可以监测上文关于图2A讨论的消息200的最大序列号字段214的值。当来自特定设备(或协作模块实例)的特定消息中的该字段的值指示在操作顺序中等于或高于操作2415中分配的序列号的值时,操作2425确定该特定设备已经确认了该操作。操作2425然后监测从多个设备(或协作模块实例)中的每一者接收的值。当所有设备指示相同时,操作2425的确定完成。

在操作2430中,向多个设备中的每个设备发送第二通知。第二通知指示操作2425的确定。第二通知可以是包括上文关于图2A中的消息200讨论的字段中的一个或多个字段的消息。在一些方面,通过将图2的消息的字段214的值设置为操作顺序中至少与所分配的序列号一样高的值来指示该确定。

虽然过程2400在上文描述了将单个序列号分配给单个操作,但本领域技术人员将理解,过程2400可以迭代地操作以将多个序列号分配给多个操作。可以以交织的方式接收由各种协作参与者(设备和/或协作模块实例)发起的操作,并且过程2400可以按照与操作的接收顺序一致的顺序向这些交织的操作分配序列号。

过程2400还可包括:生成分布式数据结构的快照。如上文关于图2E所讨论的,快照可以并入对分布式数据结构的直到某个序列号的所有操作的结果。一旦将那些结果应用于分布式数据结构,快照就表示分布式数据结构的值。当新参与者加入协作时,可以向新参与者提供快照。此外,还可以向新参与者提供分配有序列号但未包括在快照中的任何操作。这允许新参与者将那些操作应用于快照,并将其分布式数据结构的本地版本与协作的其他参与者的本地版本同步。

如本文所描述的,示例可以包括下列各项或者可以在下列各项上操作:逻辑单元或多个组件、模块或机构。模块是能够执行指定操作的有形实体(例如,硬件),并且可以用某种方式配置或布置。在示例中,可以用指定的方式将电路布置(例如,内在地或相对于诸如其他电路之类的外部实体)为模块。在示例中,一个或多个计算机系统(例如,单独的客户端,或服务器计算机系统)的部分或整体,或者一个或多个硬件处理器1202可以由固件或软件(例如,指令、应用部分或应用)配置为操作以执行指定操作的模块。在示例中,软件可以位于机器可读介质上。在示例中,当由模块的底层硬件执行时,软件使得硬件执行指定操作。

示例1是一种由设备执行的方法,包括:加入协作会话,所述协作会话提供对分布式数据结构的访问;接收标识对所述分布式数据结构的连续排序操作的消息,所标识的操作中的每个操作具有未决确认;表示所述分布式数据结构的第一版本,所述第一版本被表示为包括所述连续排序操作中的每个操作;表示所述分布式数据结构的第二版本以包括第一操作,所述第一操作排序在所述连续排序操作中的最后一个操作之后;以及发送第二消息,所述第二消息指示所述第一操作,并且还指示所述第一操作与所述第一版本之间的关联。

在示例2中,根据示例1所述的发明主题可选地包括:接收指示多个相应操作的多个消息,所述消息中的每个消息指示分配给所述相应操作中的每个操作的唯一序列号,每个消息还标识发起所述相应操作的、参与所述协作会话的不同设备,所述唯一序列号还指示所述多个操作对所述分布式数据结构进行操作的顺序;以及表示所述分布式数据结构以包括所述多个操作中的每个操作。

在示例3中,根据示例2所述的发明主题可选地包括:其中,所述多个消息中的消息指示所述设备发起了所述相应操作。

在示例4中,根据示例1-3中的一个或多个示例所述的发明主题可选地包括:表示所述分布式数据结构的第三版本以包括第二操作;接收指示附加操作的第三消息,以及关于在所述第二操作之前对所述分布式数据结构应用了所述附加操作的进一步指示;以及修改所述分布式数据结构的所述第二版本以与所述第三消息一致。

在示例5中,根据示例1-4中的任意一个或多个示例所述的发明主题可选地包括:接收指示分配给所述第一操作的第一序列号的第三消息。

在示例6中,根据示例5所述的发明主题可选地包括:接收指示第二设备操作的第四消息,所述第四消息还指示所述第二设备操作被应用于所述分布式数据结构的第三版本,所述第四消息还指示分配给所述第二设备操作的第二序列号。

在示例7中,根据示例6所述的发明主题可选地包括:基于所述第一序列号和所述第二序列号的相对顺序,解决所述第一操作与所述第二设备操作之间的对所述分布式数据结构的编辑冲突。

在示例8中,根据示例1-7中的任意一个或多个示例所述的发明主题可选地包括:其中,所述连续排序操作定义所述分布式数据结构的协作窗口。

在示例9中,根据示例8所述的发明主题可选地包括:其中,所述分布式数据结构的所述第二版本的所述表示包括:存储定义所述连续排序操作中的每个操作的第一数据;以及存储基于所述第一数据来定义所述第一操作的第二数据。

在示例10中,根据示例8-9中的任意一个或多个示例所述的发明主题可选地包括:接收对经更新协作窗口的指示,所述经更新的协作窗口排除了所述连续操作中的一些操作;以及基于所接收的指示,对所排除的操作执行垃圾收集。

在示例11中,根据示例1-10中的任意一个或多个示例所述的发明主题可选地包括:其中,所述分布式数据结构的版本由所述版本中包括的排序最高的操作序列号来定义。

在示例12中,根据示例1-11中的任意一个或多个示例所述的发明主题可选地包括:接收定义第二操作的消息、分配给所述第二操作的序列号以及由所述协作会话中的参与者确认的排序最高的操作序列号。

在示例13中,根据示例12所述的发明主题可选地包括:其中,所述连续排序操作包括具有所分配的序列号的操作,所分配的序列号在顺序上高于由参与所述协作会话的设备确认的最高排序序列号并且在顺序上低于或等于所述序列号。

在示例14中,根据示例1-13中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是从与所述协作会话的参与者通信的服务接收的。

在示例15中,根据示例14所述的发明主题可选地包括:其中,所述第二消息被发送到所述服务。

在示例16中,根据示例1-15中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是经由对等协议接收的。

在示例17中,根据示例16所述的发明主题可选地包括:其中,所述第二消息是通过所述对等协议发送的。

示例18是一种设备,包括:硬件处理电路;存储指令的一个或多个硬件存储器,所述指令在被执行时将所述硬件处理电路配置为执行包括下列各项的操作:加入协作会话,所述协作会话提供对分布式数据结构的访问;接收标识对所述分布式数据结构的连续排序操作的消息,所标识的操作中的每个操作具有未决确认;表示所述分布式数据结构的第一版本,所述第一版本被表示为包括所述连续排序操作中的每个操作;表示所述分布式数据结构的第二版本以包括第一操作,所述第一操作排序在所述连续排序操作中的最后一个操作之后;以及发送第二消息,所述第二消息指示所述第一操作,并且还指示所述第一操作与所述第一版本之间的关联。

在示例19中,根据示例18所述的发明主题可选地包括所述操作还包括:接收指示多个相应操作的多个消息,所述消息中的每个消息指示分配给所述相应操作中的每个操作的唯一序列号,每个消息还标识发起所述相应操作的、参与所述协作会话的不同设备,所述唯一序列号还指示所述多个操作对所述分布式数据结构进行操作的顺序;以及表示所述分布式数据结构以包括所述多个操作中的每个操作。

在示例20中,根据示例19所述的发明主题可选地包括:其中,所述多个消息中的消息指示所述设备发起了所述相应操作。

在示例21中,根据示例18-20中的一个或多个示例所述的发明主题可选地包括所述操作还包括:表示所述分布式数据结构的第三版本以包括第二操作;接收指示附加操作的第三消息,以及关于在所述第二操作之前对所述分布式数据结构应用了所述附加操作的进一步指示;以及修改所述分布式数据结构的所述第二版本以与所述第三消息一致。

在示例22中,根据示例18-21中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:接收指示分配给所述第一操作的第一序列号的第三消息。

在示例23中,根据示例22所述的发明主题可选地包括所述操作还包括:接收指示第二设备操作的第四消息,所述第四消息还指示所述第二设备操作被应用于所述分布式数据结构的第三版本,所述第四消息还指示分配给所述第二设备操作的第二序列号。

在示例24中,根据示例23所述的发明主题可选地包括所述操作还包括:基于所述第一序列号和所述第二序列号的相对顺序,解决所述第一操作与所述第二设备操作之间的对所述分布式数据结构的编辑冲突。

在示例25中,根据示例18-24中的任意一个或多个示例所述的发明主题可选地包括:其中,所述连续排序操作定义所述分布式数据结构的协作窗口。

在示例26中,根据示例25所述的发明主题可选地包括:其中,所述分布式数据结构的所述第二版本的所述表示包括:存储定义所述连续排序操作中的每个操作的第一数据;以及存储基于所述第一数据来定义所述第一操作的第二数据。

在示例27中,根据示例26所述的发明主题可选地包括所述操作还包括:接收对经更新协作窗口的指示,所述经更新的协作窗口排除了所述连续操作中的一些操作;以及基于所接收的指示,对所排除的操作执行垃圾收集。

在示例28中,根据示例18-27中的任意一个或多个示例所述的发明主题可选地包括:其中,所述分布式数据结构的版本由所述版本中包括的排序最高的操作序列号来定义。

在示例29中,根据示例18-28中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:接收定义第二操作的消息、分配给所述第二操作的序列号以及由所述协作会话中的参与者确认的排序最高的操作序列号。

在示例30中,根据示例12-29中的任意一个或多个示例所述的发明主题可选地包括:其中,所述连续排序操作包括具有所分配的序列号的操作,所分配的序列号在顺序上高于由参与所述协作会话的设备确认的最高排序序列号并且在顺序上低于或等于所述序列号。

在示例31中,根据示例18-30中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是从与所述协作会话的参与者通信的服务接收的。

在示例32中,根据示例31所述的发明主题可选地包括:其中,所述第二消息被发送到所述服务。

在示例33中,根据示例18-32中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是经由对等协议接收的。

在示例34中,根据示例33所述的发明主题可选地包括:其中,所述第二消息是通过所述对等协议发送的。

示例35是一种包括指令的非暂时性计算机可读存储介质,所述指令在由设备的硬件处理电路执行时将所述设备配置为执行包括下列各项的操作:加入协作会话,所述协作会话提供对分布式数据结构的访问;接收标识对所述分布式数据结构的连续排序操作的消息,所标识的操作中的每个操作具有未决确认;表示所述分布式数据结构的第一版本,所述第一版本被表示为包括所述连续排序操作中的每个操作;表示所述分布式数据结构的第二版本以包括第一操作,所述第一操作排序在所述连续排序操作中的最后一个操作之后;以及发送第二消息,所述第二消息指示所述第一操作,并且还指示所述第一操作与所述第一版本之间的关联。

在示例36中,根据示例35所述的发明主题可选地包括所述操作还包括:接收指示多个相应操作的多个消息,所述消息中的每个消息指示分配给所述相应操作中的每个操作的唯一序列号,每个消息还标识发起所述相应操作的、参与所述协作会话的不同设备,所述唯一序列号还指示所述多个操作对所述分布式数据结构进行操作的顺序;以及表示所述分布式数据结构以包括所述多个操作中的每个操作。

在示例37中,根据示例36所述的发明主题可选地包括:其中,所述多个消息中的消息指示所述设备发起了所述相应操作。

在示例38中,根据示例35-37中的一个或多个示例所述的发明主题可选地包括所述操作还包括:表示所述分布式数据结构的第三版本以包括第二操作;接收指示附加操作的第三消息,以及关于在所述第二操作之前对所述分布式数据结构应用了所述附加操作的进一步指示;以及修改所述分布式数据结构的所述第二版本以与所述第三消息一致。

在示例39中,根据示例35-38中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:接收指示分配给所述第一操作的第一序列号的第三消息。

在示例40中,根据示例39所述的发明主题可选地包括所述操作还包括:接收指示第二设备操作的第四消息,所述第四消息还指示所述第二设备操作被应用于所述分布式数据结构的第三版本,所述第四消息还指示分配给所述第二设备操作的第二序列号。

在示例41中,根据示例40所述的发明主题可选地包括所述操作还包括:基于所述第一序列号和所述第二序列号的相对顺序,解决所述第一操作与所述第二设备操作之间的对所述分布式数据结构的编辑冲突。

在示例42中,根据示例35-41中的任意一个或多个示例所述的发明主题可选地包括:其中,所述连续排序操作定义所述分布式数据结构的协作窗口。

在示例43中,根据示例42所述的发明主题可选地包括:其中,所述分布式数据结构的所述第二版本的所述表示包括:存储定义所述连续排序操作中的每个操作的第一数据;以及存储基于所述第一数据来定义所述第一操作的第二数据。

在示例44中,根据示例42-43中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:接收对经更新协作窗口的指示,所述经更新的协作窗口排除了所述连续操作中的一些操作;以及基于所接收的指示,对所排除的操作执行垃圾收集。

在示例45中,根据示例35-44中的任意一个或多个示例所述的发明主题可选地包括:其中,所述分布式数据结构的版本由所述版本中包括的排序最高的操作序列号来定义。

在示例46中,根据示例35-45中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:接收定义第二操作的消息、分配给所述第二操作的序列号以及由所述协作会话中的参与者确认的排序最高的操作序列号。

在示例47中,根据示例46所述的发明主题可选地包括:其中,所述连续排序操作包括具有所分配的序列号的操作,所分配的序列号在顺序上高于由参与所述协作会话的设备确认的最高排序序列号并且在顺序上低于或等于所述序列号。

在示例48中,根据示例47所述的发明主题可选地包括:其中,对所述连续排序操作的指示是从与所述协作会话的参与者通信的服务接收的。

在示例49中,根据示例48所述的发明主题可选地包括:其中,所述第二消息被发送到所述服务。

在示例50中,根据示例47-49中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是经由对等协议接收的。

在示例51中,根据示例50所述的发明主题可选地包括:其中,所述第二消息是通过所述对等协议发送的。

示例52是一种装置,包括:用于加入协作会话的单元,所述协作会话提供对分布式数据结构的访问;用于接收标识对所述分布式数据结构的连续排序操作的消息的单元,所标识的操作中的每个操作具有未决确认;用于表示所述分布式数据结构的第一版本的单元,所述第一版本被表示为包括所述连续排序操作中的每个操作;用于表示所述分布式数据结构的第二版本以包括第一操作的单元,所述第一操作排序在所述连续排序操作中的最后一个操作之后;以及用于发送第二消息的单元,所述第二消息指示所述第一操作,并且还指示所述第一操作与所述第一版本之间的关联。

在示例53中,根据示例52所述的发明主题可选地包括:用于接收指示多个相应操作的多个消息的单元,所述消息中的每个消息指示分配给所述相应操作中的每个操作的唯一序列号,每个消息还标识发起所述相应操作的、参与所述协作会话的不同装置,所述唯一序列号还指示所述多个操作对所述分布式数据结构进行操作的顺序;以及用于表示所述分布式数据结构以包括所述多个操作中的每个操作的单元。

在示例54中,根据示例53所述的发明主题可选地包括:其中,所述多个消息中的消息指示所述装置发起了所述相应操作。

在示例55中,根据示例52-54中的一个或多个示例所述的发明主题可选地包括:用于表示所述分布式数据结构的第三版本以包括第二操作的单元;用于接收指示附加操作的第三消息以及关于在所述第二操作之前对所述分布式数据结构应用了所述附加操作的进一步指示的单元;以及用于修改所述分布式数据结构的所述第二版本以与所述第三消息一致的单元。

在示例56中,根据示例52-55中的任意一个或多个示例所述的发明主题可选地包括:用于接收指示分配给所述第一操作的第一序列号的第三消息的单元。

在示例57中,根据示例56所述的发明主题可选地包括:用于接收指示第二装置操作的第四消息的单元,所述第四消息还指示所述第二装置操作被应用于所述分布式数据结构的第三版本,所述第四消息还指示分配给所述第二装置操作的第二序列号。

在示例58中,根据示例57所述的发明主题可选地包括:用于基于所述第一序列号和所述第二序列号的相对顺序,解决所述第一操作与所述第二装置操作之间的对所述分布式数据结构的编辑冲突的单元。

在示例59中,根据示例52-58中的任意一个或多个示例所述的发明主题可选地包括:其中,所述连续排序操作定义所述分布式数据结构的协作窗口。

在示例60中,根据示例59所述的发明主题可选地包括:其中,所述分布式数据结构的所述第二版本的所述表示包括:用于存储定义所述连续排序操作中的每个操作的第一数据的单元;以及用于存储基于所述第一数据来定义所述第一操作的第二数据的单元。

在示例61中,根据示例60所述的发明主题可选地包括:用于接收对经更新协作窗口的指示的单元,所述经更新的协作窗口排除了所述连续操作中的一些操作;以及用于基于所接收的指示,对所排除的操作执行垃圾收集的单元。

在示例62中,根据示例52-61中的任意一个或多个示例所述的发明主题可选地包括:其中,所述分布式数据结构的版本由所述版本中包括的排序最高的操作序列号来定义。

在示例63中,根据示例52-62中的任意一个或多个示例所述的发明主题可选地包括:用于接收定义第二操作的消息、分配给所述第二操作的序列号以及由所述协作会话中的参与者确认的排序最高的操作序列号的单元。

在示例64中,根据示例63所述的发明主题可选地包括:其中,所述连续排序操作包括具有所分配的序列号的操作,所分配的序列号在顺序上高于由参与所述协作会话的设备确认的最高排序序列号并且在顺序上低于或等于所述序列号。

在示例65中,根据示例52-64中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是从与所述协作会话的参与者通信的服务接收的。

在示例66中,根据示例65所述的发明主题可选地包括:其中,所述第二消息被发送到所述服务。

在示例67中,根据示例52-66中的任意一个或多个示例所述的发明主题可选地包括:其中,对所述连续排序操作的指示是经由对等协议接收的。

在示例68中,根据示例67所述的发明主题可选地包括:其中,所述第二消息是通过所述对等协议发送的。

示例69是一种包括指令的非暂时性计算机可读存储介质,所述指令在被执行时将硬件处理电路配置为执行包括下列各项的操作:与多个设备建立协作会话,所述协作会话提供对分布式数据结构的协作访问;从包括在所述多个设备中的设备接收消息,所述消息指示用于向对所述分布式数据结构的操作分配序列号的请求;响应于所述请求,为所述操作分配序列号;向所述多个设备中的每个设备发送指示所述操作和所分配的序列号的第一通知;确定从所述多个设备中的每个设备接收到所述第一通知的确认;以及响应于所述确定,向所述多个设备中的每个设备发送指示所述确定的第二通知。

在示例70中,根据示例69所述的发明主题可选地包括:其中,所述消息指示所述分布式数据结构的与所述操作相关联的版本号,并且所述方法还包括:生成所述第一通知以进一步指示所述版本和所分配的序列号。

在示例71中,根据示例70所述的发明主题可选地包括所述操作还包括:从所述设备接收指示用于将第二序列号分配给第二操作的请求的第二消息,所述消息还指示所述分布式数据结构的与所述第二操作相关联的第二版本;响应于所述请求,向所述第二操作分配第二序列号;确定由所述设备进行的具有未分配序列号的操作的数量;基于所述操作的数量,调整所述第二版本;以及向所述多个设备中的每个设备通知所述第二操作、所分配的第二序列号和经调整的第二版本。

在示例72中,根据示例69-71中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:关于所述消息的序列号字段存储预定值的第一确定,以及基于所述第一确定的关于所述消息指示所述请求的第二确定。

在示例73中,根据示例69-72中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:从所述设备接收用于将序列号分配给相应第一多个操作的第一多个请求;接收与所述第一多个请求交织的、用于将序列号分配给相应第二多个操作的第二多个请求;以及按照所述第二多个操作与所述第一多个操作的交织顺序,将序列号分配给所述第一多个操作和所述第二多个操作。

在示例74中,根据示例73所述的发明主题可选地包括所述操作还包括:基于所述第一多个操作和所述第二多个操作来生成所述分布式数据结构的快照;从附加设备接收用于加入所述协作会话的请求;以及响应于所述请求,将所述快照发送到所述附加设备。

在示例75中,根据示例69-74中的任意一个或多个示例所述的发明主题可选地包括:其中,所述消息还指示所述操作的类型和所述分布式数据结构内的与所述操作相关联的位置,并且其中,所述第一通知被生成以指示所述类型和所述位置。

在示例76中,根据示例75所述的发明主题可选地包括:其中,所述消息还指示与所述操作相关联的分布式数据结构数据值,并且其中,所述第一通知被生成以指示所述数据值。

在示例77中,根据示例69-76中的任意一个或多个示例所述的发明主题可选地包括:其中,所述第二通知通过在消息的字段中向所述多个设备中的每个设备发送所分配的序列号来向所述确定的所述多个设备指示所述确定,所述消息的所述字段被预确定以指示由所述多个设备确认的最大序列号。

示例78是一种方法,包括:与多个设备建立协作会话,所述协作会话提供对分布式数据结构的协作访问;从包括在所述多个设备中的设备接收消息,所述消息指示用于向对所述分布式数据结构的操作分配序列号的请求;响应于所述请求,为所述操作分配序列号;向所述多个设备中的每个设备发送指示所述操作和所分配的序列号的第一通知;确定从所述多个设备中的每个设备接收到所述第一通知的确认;以及响应于所述确定,向所述多个设备中的每个设备发送指示所述确定的第二通知。

在示例79中,根据示例78所述的发明主题可选地包括:其中,所述消息指示所述分布式数据结构的与所述操作相关联的版本号,并且所述方法还包括:生成所述第一通知以进一步指示所述版本和所分配的序列号。

在示例80中,根据示例79所述的发明主题可选地包括:从所述设备接收指示用于将第二序列号分配给第二操作的请求的第二消息,所述消息还指示所述分布式数据结构的与所述第二操作相关联的第二版本;响应于所述请求,向所述第二操作分配第二序列号;确定由所述设备进行的具有未分配序列号的操作的数量;基于所述操作的数量,调整所述第二版本;以及向所述多个设备中的每个设备通知所述第二操作、所分配的第二序列号和经调整的第二版本。

在示例81中,根据示例78-80中的任意一个或多个示例所述的发明主题可选地包括:关于所述消息的序列号字段存储预定值的第一确定,以及基于所述第一确定的关于所述消息指示所述请求的第二确定。

在示例82中,根据示例78-81中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:从所述设备接收用于将序列号分配给相应第一多个操作的第一多个请求;接收与所述第一多个请求交织的、用于将序列号分配给相应第二多个操作的第二多个请求;以及按照所述第二多个操作与所述第一多个操作的交织顺序,将序列号分配给所述第一多个操作和所述第二多个操作。

在示例83中,根据示例82所述的发明主题可选地包括:基于所述第一多个操作和所述第二多个操作来生成所述分布式数据结构的快照;从附加设备接收用于加入所述协作会话的请求;以及响应于所述请求,将所述快照发送到所述附加设备。

在示例84中,根据示例78-83中的任意一个或多个示例所述的发明主题可选地包括:其中,所述消息还指示所述操作的类型和所述分布式数据结构内的与所述操作相关联的位置,并且其中,所述第一通知被生成以指示所述类型和所述位置。

在示例85中,根据示例84所述的发明主题可选地包括:其中,所述消息还指示与所述操作相关联的分布式数据结构数据值,并且其中,所述第一通知被生成以指示所述数据值。

在示例86中,根据示例78-85中的任意一个或多个示例所述的发明主题可选地包括:其中,所述第二通知通过在消息的字段中向所述多个设备中的每个设备发送所分配的序列号来向所述确定的所述多个设备指示所述确定,所述消息的所述字段被预确定以指示由所述多个设备确认的最大序列号。

示例87是一种系统,包括:硬件处理电路;存储指令的一个或多个电子硬件存储器,所述指令在被执行时将所述硬件处理电路配置为执行包括下列各项的操作:与多个设备建立协作会话,所述协作会话提供对分布式数据结构的协作访问;从包括在所述多个设备中的设备接收消息,所述消息指示用于向对所述分布式数据结构的操作分配序列号的请求;响应于所述请求,为所述操作分配序列号;向所述多个设备中的每个设备发送指示所述操作和所分配的序列号的第一通知;确定从所述多个设备中的每个设备接收到所述第一通知的确认;以及响应于所述确定,向所述多个设备中的每个设备发送指示所述确定的第二通知。

在示例88中,根据示例87所述的发明主题可选地包括:其中,所述消息指示所述分布式数据结构的与所述操作相关联的版本号,并且所述方法还包括:生成所述第一通知以进一步指示所述版本和所分配的序列号。

在示例89中,根据示例88所述的发明主题可选地包括:从所述设备接收用于指示将第二序列号分配给第二操作的请求的第二消息,所述消息还指示所述分布式数据结构的与所述第二操作相关联的第二版本;响应于所述请求,向所述第二操作分配第二序列号;确定由所述设备进行的具有未分配序列号的操作的数量;基于所述操作的数量,调整所述第二版本;以及向所述多个设备中的每个设备通知所述第二操作、所分配的第二序列号和经调整的第二版本。

在示例90中,根据示例87-89中的任意一个或多个示例所述的发明主题可选地包括:关于所述消息的序列号字段存储预定值的第一确定,以及基于所述第一确定的关于所述消息指示所述请求的第二确定。

在示例91中,根据示例87-90中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:从所述设备接收用于将序列号分配给相应第一多个操作的第一多个请求;接收与所述第一多个请求交织的、用于将序列号分配给相应第二多个操作的第二多个请求;以及按照所述第二多个操作与所述第一多个操作的交织顺序,将序列号分配给所述第一多个操作和所述第二多个操作。

在示例92中,根据示例91所述的发明主题可选地包括:基于所述第一多个操作和所述第二多个操作来生成所述分布式数据结构的快照;从附加设备接收用于加入所述协作会话的请求;以及响应于所述请求,将所述快照发送到所述附加设备。

在示例93中,根据示例87-92中的任意一个或多个示例所述的发明主题可选地包括:其中,所述消息还指示所述操作的类型和所述分布式数据结构内的与所述操作相关联的位置,并且其中,所述第一通知被生成以指示所述类型和所述位置。

在示例94中,根据示例93所述的发明主题可选地包括:其中,所述消息还指示与所述操作相关联的分布式数据结构数据值,并且其中,所述第一通知被生成以指示所述数据值。

在示例95中,根据示例87-94中的任意一个或多个示例所述的发明主题可选地包括:其中,所述第二通知通过在消息的字段中向所述多个设备中的每个设备发送所分配的序列号来向所述确定的所述多个设备指示所述确定,所述消息的所述字段被预确定以指示由所述多个设备确认的最大序列号。

示例96是一种装置,包括:用于与多个设备建立协作会话的单元,所述协作会话提供对分布式数据结构的协作访问;用于从包括在所述多个设备中的设备接收消息的单元,所述消息指示用于向对所述分布式数据结构的操作分配序列号的请求;用于响应于所述请求,为所述操作分配序列号的单元;用于向所述多个设备中的每个设备发送指示所述操作和所分配的序列号的第一通知的单元;用于确定从所述多个设备中的每个设备接收到所述第一通知的确认的单元;以及用于响应于所述确定,向所述多个设备中的每个设备发送指示所述确定的第二通知的单元。

在示例97中,根据示例96所述的发明主题可选地包括:其中,所述消息指示所述分布式数据结构的与所述操作相关联的版本号,并且所述方法还包括:生成所述第一通知以进一步指示所述版本和所分配的序列号。

在示例98中,根据示例97所述的发明主题可选地包括:用于从所述设备接收用于指示将第二序列号分配给第二操作的请求的第二消息的单元,所述消息还指示所述分布式数据结构的与所述第二操作相关联的第二版本;用于响应于所述请求,向所述第二操作分配第二序列号的单元;用于确定由所述设备进行的具有未分配序列号的操作的数量的单元;用于基于所述操作的数量,调整所述第二版本的单元;以及用于向所述多个设备中的每个设备通知所述第二操作、所分配的第二序列号和经调整的第二版本的单元。

在示例99中,根据示例96-98中的任意一个或多个示例所述的发明主题可选地包括:关于所述消息的序列号字段存储预定值的第一确定,以及基于所述第一确定的关于所述消息指示所述请求的第二确定。

在示例100中,根据示例96-99中的任意一个或多个示例所述的发明主题可选地包括所述操作还包括:用于从所述设备接收用于将序列号分配给相应第一多个操作的第一多个请求的单元;用于接收与所述第一多个请求交织的、用于将序列号分配给相应第二多个操作的第二多个请求的单元;以及用于按照所述第二多个操作与所述第一多个操作的交织顺序,将序列号分配给所述第一多个操作和所述第二多个操作的单元。

在示例101中,根据示例100所述的发明主题可选地包括:用于基于所述第一多个操作和所述第二多个操作来的单元生成所述分布式数据结构的快照的单元;用于从附加设备接收用于加入所述协作会话的请求的单元;以及用于响应于所述请求,将所述快照发送到所述附加设备的单元。

在示例102中,根据示例96-101中的任意一个或多个示例所述的发明主题可选地包括:其中,所述消息还指示所述操作的类型和所述分布式数据结构内的与所述操作相关联的位置,并且其中,所述第一通知被生成以指示所述类型和所述位置。

在示例103中,根据示例102所述的发明主题可选地包括:其中,所述消息还指示与所述操作相关联的分布式数据结构数据值,并且其中,所述第一通知被生成以指示所述数据值。

在示例104中,根据示例96-103中的任意一个或多个示例所述的发明主题可选地包括:其中,所述第二通知通过在消息的字段中向所述多个设备中的每个设备发送所分配的序列号来向所述确定的所述多个设备指示所述确定,所述消息的所述字段被预确定以指示由所述多个设备确认的最大序列号。

因此,术语“模块”被理解为包括有形实体,是物理构建的、特别配置(例如,硬线连接的)或临时(例如,暂时)配置(例如,编程)以便以特定方式执行,或者执行本文中描述的任何操作的部分或所有的实体。考虑在其中模块是临时配置的示例,这些模块中的每个模块不需要在任何一个时刻进行实例化。例如,在模块包括使用软件配置的通用硬件处理器的情况下,通用硬件处理器可以在不同时刻被配置为各个不同的模块。软件可以相应地将硬件处理器配置为例如在一个时刻构造特定的模块,并且在另一个不同时刻构成不同的模块。

各个实施例可以完全或部分地以软件和/或固件来实现。该软件和/或固件可以采取包含在非暂时性计算机可读存储介质中或之上的指令的形式。然后,那些指令可以由一个或多个处理器读取并执行,以使得能够执行本文所述的操作。指令可以具有任何合适的形式,例如但不限于:源代码、编译代码、解释代码、可执行代码、静态代码、动态代码等。这种计算机可读介质可以包括任何有形的非暂时性介质,用于以一台或多台计算机可读的形式存储信息,例如但不限于只读存储器(ROM)、随机存取存储器(RAM)、磁盘存储介质、光学存储介质、闪存器等等。

72页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:管理对数字资产的访问

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!