维护消息传送系统的持久性的制作方法

文档序号:17120568发布日期:2019-03-15 23:45阅读:187来源:国知局
维护消息传送系统的持久性的制作方法

本申请要求提交于2016年5月16日的美国专利申请15/155,384的优先权,其全部内容通过引用而并入于此。



背景技术:

本说明书涉及数据通信系统,特别地涉及用于实现实时、可扩展的发布-订阅消息传送的系统。

发布-订阅模式(或者“pubsub”)是利用软件系统实现的数据通信消息传送布置,其中,所谓的发布者将消息发布到主题,并且所谓的订户接收与他们所订阅的特定主题有关的消息。每个主题可以存在一个或多个发布者,并且发布者一般不知道什么样的订户(如果有的话)将接收到所发布的消息。一些pubsub系统不缓存消息或者具有小的缓存,这意味着订户可能不会接收到在订阅特定主题之前所发布的消息。在消息发布激增期间、或者随着特定主题的订户的数量增加,pubsub系统可能易受到性能不稳定性的影响。



技术实现要素:

一般来说,本说明书中所描述的主题的一个方面可以体现在如下的方法中,该方法包括以下动作:从第一客户端装置接收针对在多个通道中的第一通道中的位置处开始的所述第一通道的消息的请求,其中各通道包括相应的有顺序的多个消息,所述多个消息根据所述顺序被存储在一个或多个相应缓冲器中,各缓冲器具有相应存活时间;标识所述顺序中的与所述位置相对应的所述第一通道中的第一消息,其中所述第一消息被存储在具有已经期满的存活时间的缓冲器中;向订阅所述第一通道的一个或多个第二客户端装置发送针对所述顺序中的在所述位置处开始的消息的请求;从所述第二客户端装置中的一个第二客户端装置接收包括所述顺序中的位于所述位置之处或之后的所述第一通道的一个或多个消息的响应消息;根据所述顺序而从所述第一通道中的具有尚未期满的存活时间的一个或多个缓冲器检索所述第一通道的消息;根据所述顺序来组合所检索到的消息以及来自所述响应消息的消息;以及将所组合的消息发送至所述第一客户端装置。该方面的其它实施例包括相应的系统、设备和计算机程序。

这些和其它方面可以可选地包括以下特征中的一个或多个。针对订阅所述第一通道的一个或多个第二客户端装置,确定到所述第一通道的相应连接延迟;以及标识所述第二客户端装置中的具有最短连接延迟的一个第二客户端装置。针对订阅所述第一通道的一个或多个第二客户端装置,确定到所述第一通道的相应当前连接会话的持续时间;以及标识所述一个或多个第二客户端装置中的具有最长当前连接会话的一个第二客户端装置。根据所述顺序来组合所检索到的消息以及来自所述响应消息的消息进一步包括:从所组合的消息中移除一个或多个重复消息。

可以实施本说明中所描述的主题的特定实施例,以实现以下优点中的一个或多个优点。消息传送系统维护消息的通道。对于各通道,将被发布到通道的消息存储在该通道的通道流中。所述通道流包括通道细流的序列,各通道细流具有相应存活时间。消息按照特定顺序存储在相应通道细流中。在通道细流的存活时间期满的情况下,期满通道细流中所存储的消息不再可用于通道的订户,并且期满通道细流所用的计算资源可被释放用于消息传送系统中的其它计算工作。在特定订户请求通道的通道流的期满通道细流中的该通道的消息的情况下,消息传送系统向该通道的其他订户请求消息历史,包括该通道的通道流的已期满通道细流中先前所存储的消息。消息传送系统可以组合来自其他订户的消息历史以及通道的通道流的有效(未期满)通道细流中当前所存储的消息,并将所组合的消息提供至特定订户。以这种方式,特定订户可以接收通道的连续消息,而不会丢失通道的通道流的期满通道细流中所存储的消息。

在附图和以下的描述中详细阐述了本说明书中所描述的主题的一个或多个实施例。根据说明书、附图和权利要求,本主题的其它特征、方面和优点将变得明显。

附图说明

图1a示出支持pubsub通信模式的示例性系统。

图1b示出示例性客户端装置上的软件的功能层。

图2是示例性消息传送系统的图。

图3a是用于将数据写入通道细流(streamlet)的示例性方法的数据流程图。

图3b是用于从通道细流读取数据的示例性方法的数据流程图。

图4a是用于将消息发布到消息传送系统的通道的示例性方法的数据流程图。

图4b是用于订阅消息传送系统的通道的示例性方法的数据流程图。

图4c是用于存储消息传送系统的通道的消息的示例性数据结构。

图5是用于维护消息传送系统中的通道的订户的消息的持久性的示例性方法的数据流程图。

图6是用于维护消息传送系统中的通道的订户的消息的持久性的另一示例性方法的流程图。

各个附图中的相同附图标记和标示表示相同元件。

具体实施方式

图1a示出支持pubsub通信模式的示例性系统100。发布者客户端(例如,发布者1)可以通过系统100来将消息发布到命名通道(例如,“通道1”)。消息可以包括任何类型的信息,该信息包括以下各项中的一项或多项:文本、图像内容、声音内容、多媒体内容、视频内容、以及二进制数据等。其它类型的消息数据也是可以的。订户客户端(例如,订户2)可以使用系统100来订阅命名通道,并且开始接收在订阅请求之后发生的或来自给定位置(例如,消息编号或时间偏移)的消息。客户端可以是发布者和订户两者。

根据配置,pubsub系统可以分类如下:

·一对一(1:1)。在该配置中,各通道存在一个发布者和一个订户。典型的用例是私人消息传送。

·一对多(1:n)。在该配置中,各通道存在一个发布者和多个订户。典型的用例是广播消息(例如,股票价格)。

·多对多(m:n)。在该配置中,存在发布到单个通道的许多发布者。消息然后被传递给多个订户。典型的用例是地图应用。

创建命名通道不需要单独的操作。在订阅通道时或者在向通道发布消息时隐式地创建通道。在一些实现中,通道名称可以由名称空间来限定。名称空间包括一个或多个通道名称。不同的名称空间可以具有相同的通道名称,而不会引起歧义。名称空间的名称可以是通道名称的前缀,其中名称空间和通道名称以点分隔。在一些实现中,可以在指定通道授权设置时使用名称空间。例如,消息传送系统100可以具有app1.foo和app1.system.notifications通道,其中“app1”是名称空间的名称。系统可以允许客户端订阅和发布到app1.foo通道。然而,客户端仅可以订阅但不发布到app1.system.notifications通道。

图1b示出示例性客户端装置上的软件的功能层。客户端装置(例如,客户端102)是诸如个人计算机、膝上型计算机、平板计算机、智能电话、智能手表或服务器计算机等的数据处理设备。其它类型的客户端装置也是可以的。应用层104包括将与pubsub系统100集成的最终用户应用。消息传送层106是应用层104的编程接口以利用系统100的诸如通道订阅、消息发布、消息检索、用户认证和用户授权等的服务。在一些实现中,被传递到消息传送层106以及从消息传送层106传递的消息被编码为javascript对象表示法(json)对象。其它消息编码方案也是可以的。

操作系统108层包括客户端102上的操作系统软件。在各种实现中,可以使用持久性或非持久性连接来发送和接收去往/来自系统100的消息。可以使用例如网络套接字来创建持久连接。诸如tcp/ip层112等的传输协议实现了与系统100的传输控制协议/因特网协议通信,其中消息传送层106可以使用该通信以通过到系统100的连接来发送消息。其它通信协议也是可以的,包括例如用户数据报协议(udp)。在其它实现中,可以采用可选的传输层安全(tls)层110来确保消息的机密性。

图2是示例性消息传送系统100的图。系统100提供用于实现pubsub通信模式的功能。例如,该系统包括可被部署在一个或多个地理位置中的一个或多个数据中心122处的软件组件和存储器。该系统包括mx节点(例如,mx节点或多路复用器节点202、204和206)、q节点(例如,q节点或队列节点208、210和212)、一个或多个通道管理器节点(例如,通道管理器214、215)、以及可选的一个或多个c节点(例如,c节点或缓存节点220和222)。各节点可以在虚拟机中或者在物理机(例如,数据处理设备)上执行。各mx节点用作通过外部网络216的一个或多个发布者和/或订户连接的终止点。例如,mx节点、q节点、c节点和通道管理器之间的内部通信通过内部网络218进行。通过说明的方式,mx节点204可以是来自客户端102的订户连接的终点。各q节点缓冲通道数据以供mx节点消耗。发布到通道的有序消息序列是逻辑通道流。例如,如果三个客户端向给定通道发布消息,则这些客户端所发布的组合消息包括通道流。可以按照客户端的发布时间、mx节点的接收时间、或q节点的接收时间在通道流中对消息进行排序。用于在通道流中对消息进行排序的其它方式也是可以的。在多于一个消息将按照顺序被分配到同一位置的情况下,一个消息可被(例如,随机地)选择为具有顺序中的较晚序列。各通道管理器节点负责通过将通道流分割成所谓的通道细流来管理q节点负载。以下进一步讨论通道细流。可选的c节点提供缓存以及q节点中的负载移除。

在示例性消息传送系统100中,一个或多个客户端装置(发布者和/或订户)建立到mx节点(例如,mx节点204)的相应的持久性连接(例如,tcp连接)。mx节点用作这些连接的终止点。例如,可以基于外部协议(例如,json)来对这些连接所运载的(例如,相应的客户端装置和mx节点之间的)外部消息进行编码。mx节点终止外部协议并将外部消息转译为内部通信,并且反之亦然。mx节点代表客户端向通道细流进行发布和对通道细流进行订阅。以这种方式,mx节点可以对订阅同一通道或发布到同一通道的客户端装置的请求进行多路复用和合并,从而将多个客户端装置表示为一个,而不是一个接一个地表示。

在示例性消息传送系统100中,q节点(例如,q节点208)可以存储一个或多个通道流的一个或多个通道细流。通道细流是针对通道流的一部分的数据缓冲器。当通道细流的存储已满时,它将关闭写入。当通道细流的存活时间(ttl)期满时,它将关闭读取和写入并被解除分配。通过说明的方式,通道细流可以具有1mb的最大尺寸和三分钟的ttl。不同的通道可以具有由不同的ttl限定的通道细流。例如,一个通道中的通道细流最多可以存在三分钟,而另一通道中的通道细流最多可以存在10分钟。在各种实现中,通道细流与q节点上运行的计算进程相对应。例如,可以在通道细流的ttl期满之后终止计算进程,从而将(用于通道细流的)计算资源释放回q节点。

当从客户端装置接收到发布请求时,mx节点(例如,mx204)向通道管理器(例如,通道管理器214)作出请求以授权对通道细流的访问从而写入正被发布的消息。然而,注意,如果mx节点已被授权对通道的通道细流的写入访问(并且通道尚未关闭写入),则mx节点可以将消息写入该通道细流,而无需请求对访问通道细流的授权。一旦消息被写入通道的通道细流,则该消息可以由mx节点读取并被提供给该通道的订户。

类似地,当从客户端装置接收到通道订阅请求时,mx节点向通道管理器作出请求以授权对所读取消息的通道的通道细流的访问。如果mx节点已被授权对通道的通道细流的读取访问(并且通道的ttl尚未关闭读取),则mx节点可以从通道细流读取消息,而无需请求对访问通道细流的授权。读取的消息然后可被转发至已订阅该通道的客户端装置。在各种实现中,从通道细流读取的消息由mx节点缓存,以使得mx节点可以减少从通道细流读取所需的次数。

通过说明的方式,mx节点可以从通道管理器请求授权,其中该授权允许mx节点将数据块存储到用于存储特定通道的通道细流的特定q节点上的通道细流中。示例性通道细流授权请求和授权数据结构如下:

streamletgrantrequest数据结构存储流的名称channel,并且mode指示mx节点是意图从通道细流读取还是写入通道细流。mx节点将streamletgrantrequest发送到通道管理器节点。作为响应,通道管理器节点向mx节点发送streamletgrantresponse数据结构。streamletgrantresponse包含通道细流的标识符(streamlet-id)、通道细流的最大尺寸(limit-size)、通道细流可以存储的消息的最大数量(limit-msgs)、ttl(limit-life)、以及通道细流驻留的q节点(q-node)的标识符。streamletgrantrequest和streamletgrantresponse还可以具有指向用于从通道细流读取的通道细流中的位置(或通道中的位置)的position字段。

一旦通道细流关闭,则授权变为无效。例如,一旦通道细流的ttl已经期满,则该通道细流被关闭读取和写入,并且当通道细流的存储装置已满时,该通道细流被关闭写入。当授权变为无效时,mx节点可以从通道管理器请求新的授权以从通道细流读取或写入通道细流。新的授权将引用不同的通道细流,并且将根据新的通道细流驻留的位置来引用相同的或不同的q节点。

图3a是各个实现中的用于将数据写入通道细流的示例性方法的数据流程图。在图3a中,在mx节点(例如,mx节点202)请求写入通道细流被通道管理器(例如,通道管理器214)授权的情况下,如前所述,mx节点建立与从通道管理器(302)接收到的授权响应中所标识的q节点(例如,q节点208)的传输控制协议(tcp)连接。通道细流可以由(例如,用于由多个发布者客户端发布的消息的)多个写入授权并发写入。mx节点和q节点之间的其它类型的连接协议也是可以的。

然后mx节点发送准备发布消息(304),其中该准备发布消息具有mx节点想要写入q节点的通道细流的标识符。通道细流标识符和q节点标识符可以由通道管理器在前面所述的写入授权中提供。q节点将消息移交给所标识的通道细流的处理程序进程301(例如,q节点上运行的计算进程)(306)。处理程序进程可以向mx节点发送确认(308)。在接收到确认之后,mx节点开始将消息(例如,310、312、314和318)写入(发布)到处理程序进程,该处理程序进程转而将所接收到的数据存储在所标识的通道细流中。处理程序进程还可以针对所接收到的数据向mx节点发送确认(316、320)。在一些实现中,确认可以是捎带式(piggy-backed)的或累积式的。例如,处理程序进程可以向mx节点发送针对所接收到的每预定量的数据(例如,针对接收到的每100个消息)、或者针对每预定时间段(例如,针对每毫秒)的确认。可以使用诸如nagle算法等的其它确认调度算法。

如果通道细流不再接受发布的数据(例如,当通道细流已满时),则处理程序进程发送指示问题的否定确认(nak)消息(330)、接着发送eof(文件结束)消息(332)。以这种方式,处理程序进程关闭与用于发布授权的mx节点的关联。如果mx节点具有附加的消息要存储,则该mx节点可以从通道管理器请求对另一通道细流的写入授权。

图3b是各个实现中的用于从通道细流读取数据的示例性方法的数据流程图。在图3b中,mx节点(例如,mx节点204)向通道管理器(例如,通道管理器214)发送用于读取从通道中的特定消息或时间偏移开始的特定通道的请求。通道管理器向mx节点返回读取授权,其包括包含特定消息的通道细流的标识符、通道细流中与特定消息相对应的位置、以及包含特定通道细流的q节点(例如,q节点208)的标识符。然后mx节点建立与q节点的tcp连接(352)。mx节点和q节点之间的其它类型的连接协议也是可以的。

然后mx节点向q节点发送订阅消息(354),其中该订阅消息具有(q节点中的)通道细流的标识符以及通道细流中mx节点想要读取的位置(356)。q节点将订阅消息移交给通道细流的处理程序进程351(356)。处理程序进程可以向mx节点发送确认(358)。然后处理程序进程向mx节点发送在通道细流中的该位置处开始的消息(360、364、366)。在一些实现中,处理程序进程可以将通道细流中的所有消息发送到mx节点。在发送特定通道细流中的最后一个消息之后,处理程序进程可以向mx节点发送对最后一个消息的通知。mx节点可以向通道管理器发送用于包含特定通道中的下一消息的另一通道细流的另一请求。

如果特定通道细流(例如,在其ttl期满之后)关闭,则处理程序进程可以发送取消订阅消息(390)、接着发送eof消息(392),以关闭与用于读取授权的mx节点的关联。当mx节点(例如,按照通道管理器的指示)移动到特定通道中的消息的另一通道细流时,mx节点可以关闭与处理程序进程的关联。如果mx节点接收到来自相应的客户端装置的取消订阅消息,则mx节点也可以关闭与处理程序进程的关联。

在各种实现中,可以同一时刻写入和读取通道细流。例如,在同一时刻可以存在有效的读取授权和有效的写入授权。在各种实现中,通道细流可以由(例如,用于由多个发布者客户端订阅的通道的)多个读取授权并发读取。通道细流的处理程序进程可以基于例如到达时间对来自并发写入授权的消息进行排序,并基于顺序来存储这些消息。以这种方式,从多个发布者客户端发布到通道的消息可被序列化并被存储在通道的通道细流中。

在消息传送系统100中,一个或多个c节点(例如,c节点220)可以卸载来自一个或多个q节点的数据传输。例如,如果存在许多mx节点从特定通道的q节点请求通道细流,则通道细流可被卸载并被缓存在一个或多个c节点中。作为替代,mx节点(例如,按照来自通道管理器的读取授权的指示)可以从c节点读取通道细流。

如上所述,在通道流中对消息传送系统100中的通道的消息进行排序。通道管理器(例如,通道管理器214)将通道流分割成固定大小的通道细流,其中各通道细流驻留在相应的q节点上。以这种方式,可以在许多q节点中共享存储通道流;各q节点存储通道流的一部分(一个或多个通道细流)。更特别地,通道细流可被存储在与q节点上的计算进程相关联的寄存器和动态存储器元件中,从而避免需要访问诸如硬盘等的永久性的较慢存储装置。这得到了更快的消息访问。通道管理器还可以通过监视q节点的相应工作负载并按照避免使任何一个q节点过载的方式分配通道细流,来平衡消息传送系统100中的q节点中的负载。

在各种实现中,通道管理器维护如下的列表,其中该列表标识各有效通道细流、通道细流驻留的相应q节点、对通道细流中的第一消息的位置的标识、以及通道细流是否关闭写入。在一些实现中,q节点向通道管理器以及正向通道细流发布的任意mx节点通知通道细流由于已满或者通道细流的ttl期满而关闭。当通道细流关闭时,通道细流保持在通道管理器的有效通道细流列表上直到通道细流的ttl期满为止,以使得mx节点可以继续从通道细流检索消息。

在mx节点针对给定通道请求写入授权、并且对于该通道不存在可以写入的通道细流的情况下,通道管理器分配q节点其中之一上的新的通道细流,并在streamletgrantresponse中返回通道细流和q节点的身份。否则,通道管理器在streamletgrantresponse中返回当前开放用于写入的通道细流和相应q节点的身份。mx节点可以向通道细流发布消息,直到通道细流已满或者通道细流的ttl期满为止,此后可以由通道管理器分配新的通道细流。

在mx节点针对给定通道请求读取授权、并且对于该通道不存在可以读取的通道细流的情况下,通道管理器分配q节点其中之一上的新的通道细流,并在streamletgrantresponse中返回通道细流和q节点的身份。否则,通道管理器返回包含mx节点希望读取的位置的通道细流和q节点的身份。然后q节点可以开始向mx节点发送来自在指定位置处开始的通道细流的消息,直到通道细流中没有更多的消息要发送为止。当新消息被发布到通道细流时,已订阅该通道细流的mx节点将接收该新消息。如果通道细流的ttl已期满,则处理程序进程351向订阅该通道细流的任意mx节点发送eof消息(392)。

如前面参考图2所述,消息传送系统100可以包括多个通道管理器(例如,通道管理器214、215)。多个通道管理器提供弹性并防止单点故障。例如,一个通道管理器可以将其维护的通道细流和当前授权的列表复制给另一“从属”通道管理器。作为另一示例,多个通道管理器可以使用诸如paxos或raft协议等的分布式共识协议来协调它们之间的操作。

图4a是用于将消息发布到消息传送系统的通道的示例性方法的数据流程图。在图4a中,发布者(例如,发布者客户端402、404、406)将消息发布到前面参考图2所述的消息传送系统100。例如,发布者402分别建立连接411并向mx节点202发送发布请求。发布者404分别建立连接413并向mx节点206发送发布请求。发布者406分别建立连接415并向mx节点204发送发布请求。这里,mx节点可以经由内部网络218来与消息传送系统100中的通道管理器(例如,通道管理器214)以及一个或多个q节点(例如,q节点212和208)进行通信(417)。

通过说明的方式,从发布者到mx节点的各发布请求(例如,在json密钥/值对中)包括通道名称和消息。mx节点(例如,mx节点202)可以基于发布请求的通道名称(例如,“foo”)来将发布请求中的消息分配给消息传送系统100中的不同通道。mx节点可以向通道管理器214确认所分配的通道。如果(订阅请求中指定的)通道在消息传送系统100中尚不存在,则通道管理器可以在消息传送系统100中创建并维护新的通道。例如,通道管理器可以通过维护用于标识以下各项的列表来维护新的通道:通道流的各有效通道细流、通道细流驻留的相应q节点、以及如前所述的通道细流中的第一个消息和最后一个消息的位置的标识。

对于特定通道的消息,mx节点可以将消息存储在消息传送系统100中的一个或多个缓冲器或通道细流中。例如,mx节点202从发布者402接收用以将消息m11、m12、m13和m14发布到通道foo的请求。mx节点206从发布者404接收用以将消息m78和m79发布到通道foo的请求。mx节点204从发布者406接收用以将消息m26、m27、m28、m29、m30和m31发布到通道foo的请求。

mx节点可以标识用于存储通道foo的消息的一个或多个通道细流。如前所述,各mx节点可以从通道管理器214请求写入授权,其中该写入授权允许mx节点将信息存储在通道foo的通道细流中。例如,mx节点202从通道管理器214接收用以将消息m11、m12、m13和m14写入q节点212上的通道细流4101的授权。mx节点206从通道管理器214接收用以将消息m78和m79写入通道细流4101的授权。这里,通道细流4101是存储通道foo的消息的通道流430的通道细流序列的最后一个(在当时)。通道细流4101具有先前存储在通道细流4101中但仍然开放的通道foo的消息(421),即通道细流4101仍具有用于存储更多消息的空间并且通道细流的ttl尚未期满。

mx节点202可以基于mx节点202接收到各消息(例如,m11、m13、m14、m12)的相应时间来布置通道foo的消息(422),并且按照布置将所接收到的消息存储在通道细流4101中。也就是说,mx节点202首先接收m11,然后接收m13、m14和m12。类似地,mx节点206可以基于mx节点206接收到各消息(例如,m78、m79)的相应时间来布置通道foo的消息(423),并且按照布置将所接收到的消息存储在通道细流4101中。

例如,mx节点202(或mx节点206)可以使用前面参考图3a所述的用于将数据写入通道细流的方法来存储所接收到的消息。在各种实现中,mx节点202(或mx节点206)可以(例如,在本地数据缓冲器中)缓冲所接收到的通道foo的消息,并在缓冲消息达到预定大小(例如,100个消息)或者已经过去预定时间(例如,50毫秒)时将所接收到的消息存储在通道foo的通道细流(例如,通道细流4101)中。也就是说,mx节点202可以一次性将100个消息存储在通道细流中,或者每50毫秒进行存储。可以使用诸如nagle算法等的其它确认调度算法。

在各种实现中,q节点212(例如,处理程序进程)按照如mx节点202和mx节点206所布置的顺序来将通道foo的消息存储在通道细流4101中。q节点212按照q节点212接收消息的顺序来将通道foo的消息存储在通道细流4101中。例如,假设q节点212首先接收到(来自mx节点206的)消息m78,然后是(来自mx节点202的)消息m11和m13、(来自mx节点206的)m79、以及(来自mx节点202的)m14和m12。q节点212将这些消息(例如,m78、m11、m13、m79、m14和m12)按照被接收的顺序存储在通道细流4101中,紧跟在已存储在通道细流4101中的消息421之后。以这种方式,从多个发布者(例如,402、404)发布到通道foo的消息可以以特定顺序被序列化并被存储在通道foo的通道细流4101中。订阅通道foo的不同订户将以同一特定顺序接收通道foo的消息,如将参考图4b更详细所述。

在图4a的示例中,在消息m12被存储在通道细流4101中之后的某一时刻,mx节点204从通道管理器214请求写入通道foo的授权。由于通道细流4101仍开放写入,因此通道管理器214向mx节点204提供向通道细流4101写入消息的授权。mx节点204基于mx节点204接收到各消息(例如,m26、m27、m31、m29、m30、m28)的相应时间来布置通道foo的消息(424),并且按照针对通道foo的布置来存储这些消息。

通过说明的方式,假设消息m26被存储到通道细流4101的最后可用位置。由于通道细流4101现在已满,因此q节点212向mx节点204发送nak消息、接着发送eof消息,以关闭与mx节点204的用于写入授权的关联,如前面参考图3a所述。然后mx节点204从通道管理器214请求用于通道foo的附加消息(例如,m27、m31等)的另一写入授权。

通道管理器214可以监视消息传送系统100中的可用q节点的相应工作负载(例如,多少个通道细流驻留在各q节点中)。通道管理器214可以为来自mx节点204的写入请求分配通道细流,使得可以针对任意给定q节点避免过载(例如,太多的通道细流或太多的读取或写入授权)。例如,通道管理器214可以标识消息传送系统100中的最小负载q节点,并将最小负载q节点上的新的通道细流分配用于来自mx节点204的写入请求。在图4a的示例中,通道管理器214分配q节点208上的新的通道细流4102,并且向mx节点204提供用以将通道foo的消息写入通道细流4102的写入授权。如图4a所示,q节点按照如mx节点204所布置的如下顺序将来自mx节点204的消息存储在通道细流4102中:m27、m31、m29、m30和m28(假设此时不存在针对通道细流4102的其它并发写入授权)。

在通道管理器214为来自mx节点(例如,mx节点204)的授权请求分配用以写入通道(例如,foo)的新通道细流(例如,通道细流4102)的情况下,通道管理器214向通道细流分配将在已经位于通道流中的其它通道细流的ttl之后期满的ttl。例如,在分配通道细流时,通道管理器214可以向通道foo的通道流的各通道细流分配3分钟的ttl。也就是说,各通道细流将在其由通道管理器214分配(创建)3分钟之后期满。由于在先前的通道细流关闭(例如,完全填充或期满)之后分配新的通道细流,以这种方式,通道foo的通道流包括分别在其先前的通道细流期满之后依次期满的通道细流。例如,如图4a中的通道foo的示例性通道流430所示,通道细流4098和4098之前的通道细流已经期满(如虚线灰色框所示)。存储在这些期满通道细流中的消息不可用于通道foo的订户的读取。通道细流4099、4100、4101和4102仍然是有效的(未期满)。通道细流4099、4100和4101关闭写入,但仍可用于读取。在消息m28被存储在通道细流4102中的时刻,通道细流4102可用于读取和写入。在稍后的时间,通道细流4099将期满、接着是通道细流4100、4101,以此类推。

图4b是用于订阅消息传送系统的通道的示例性方法的数据流程图。在图4b中,订户480建立与消息传送系统100的mx节点461的连接462。订户482建立与mx节点461的连接463。订户485建立与消息传送系统100的mx节点468的连接467。这里,mx节点461和468可以经由内部网络218分别与消息传送系统100中的通道管理器214以及一个或多个q节点进行通信(464)。

订户(例如,订户480)可以通过建立连接(例如,462)并向mx节点(例如,mx节点461)发送订阅通道foo的消息的请求,来订阅消息传送系统100的通道foo。该请求(例如,在json密钥/值对中)可以包括通道名称“foo”。当接收到订阅请求时,mx节点461可以向通道管理器214发送针对通道foo的通道流中的通道细流的读取授权的请求。

通过说明的方式,假设在当前时刻,通道foo的通道流431包括有效通道细流4102、4103和4104,如图4b所示。通道细流4102和4103均已满。通道细流4104存储通道foo的消息,包括(在当前时刻)存储在位置47731处的最后消息。通道细流4101和4101之前的通道细流是无效的,这是因为它们各自的ttl已经期满。注意,前面参考图4a所述的存储在通道细流4101中的消息m78、m11、m13、m79、m14、m12和m26不再可用于通道foo的订户,这是因为通道细流4101由于其ttl已期满因而不再有效。如前所述,通道foo的通道流中的各通道细流具有3分钟的ttl,因此仅在距离当前时间不早于3分钟被发布到通道foo(即存储到通道的通道细流中)的消息(如存储在通道foo的通道细流中的消息)可用于通道foo的订户。

例如,当订户480是通道foo的新订户时,mx节点461可以请求用于通道foo中的所有可用消息的读取授权。基于该请求,通道管理器214向mx节点461提供针对作为通道foo的有效通道细流中的最早通道细流(即有效通道细流的序列中的第一个)的(q节点208上的)通道细流4102的读取授权。mx节点461可以使用前面参考图3b所述的用于从通道细流读取数据的方法来检索来自q节点208的通道细流4102中的消息。注意,从通道细流4102检索到的消息维持与通道细流4102中所存储的顺序相同的顺序。在各种实现中,当将通道细流4102中所存储的消息提供给mx节点461时,q节点208可以(例如,在本地数据缓冲器中)缓冲这些消息,并在缓冲消息达到预定大小(例如,200个消息)或者已经过去预定时间(例如,50毫秒)时将这些消息发送到mx节点461。也就是说,q节点208可以将通道foo的消息(来自通道细流4102)一次200个地发送到mx节点461,或每50毫秒发送到mx节点。可以使用诸如nagle算法等的其它确认调度算法。

在接收到通道细流4102中的最后一个消息之后,mx节点461可以向q节点208发送确认,并且向通道管理器214发送针对通道foo的通道流中的下一通道细流的另一请求(例如,用于读取授权)。基于该请求,通道管理器214向mx节点461提供针对在通道foo的有效通道细流的序列中逻辑上跟在通道细流4102之后的(q节点472上的)通道细流4013的读取授权。mx节点461可以例如使用前面参考图3b所述的用于从通道细流读取数据的方法来检索通道细流4013中所存储的消息,直到它检索到通道细流4013中所存储的最后一个消息为止。mx节点461可以向通道管理器214发送针对(q节点474上的)下一通道细流4104中的消息的读取授权的另一请求。在接收到读取授权之后,mx节点461检索通道细流4014中所存储的通道foo的消息,直到位置47731处的最后一个消息为止。类似地,mx节点468可以从通道细流4102、4103和4104检索消息(如图4b中的虚线箭头所示),并且将这些消息提供给订户485。

mx节点461可以(经由连接462)将检索到的通道foo的消息发送给订户480,同时从q节点208、472或474接收消息。在各种实现中,mx节点461可以将检索到的消息存储在本地缓冲器中。以这种方式,当另一订户(例如,订户482)订阅通道foo并请求该通道的消息时,可以将检索到的消息提供给该另一订户。mx节点461可以移除本地缓冲器中所存储的、具有超过预定时间段的发布时间的消息。例如,mx节点461可以移除具有超过3分钟的相应的发布时间的(本地缓冲器中所存储的)消息。在一些实现中,用于将消息保持在mx节点461上的本地缓冲器中的预定时间段可以与通道foo的通道流中的通道细流的存活时间持续时间相同或相似,这是因为在给定时刻,从通道流检索到的消息不包括具有已期满的相应存活时间的通道细流中的那些消息。

从通道流431中检索到并被(mx节点461)发送给订户480的消息按照这些消息被存储在通道流中的相同顺序进行布置。例如,发布到通道foo的消息被序列化并且以特定顺序(例如,m27、m31、m29、m30以此类推)被存储在通道细流4102中,然后被依次存储在通道细流4103和通道细流4104中。mx节点从通道流431检索消息,并按照如下的这些消息被存储在通道流中的相同顺序来将这些消息提供给订户480:m27、m31、m29、m30以此类推,接着是通道细流4103中的有序消息,接着是通道细流4104中的有序消息。

代替检索通道流431中的所有可用消息,mx节点461可以请求用于通道流431中所存储的、从特定位置(例如,位置47202)处的消息开始的消息的读取授权。例如,位置47202可以与订户480(例如,经由到mx节点461或消息传送系统100的另一mx节点461的连接)最后订阅通道foo时的较早时刻(例如,在当前时间之前10秒)相对应。mx节点461可以向通道管理器214发送用于在位置47202开始的消息的读取授权的请求。基于该请求,通道管理器214向mx节点461提供对(q节点474上的)通道细流4104、以及通道细流4104上的与通道流位置47202相对应的位置的读取授权。mx节点461可以检索通道细流4104中的从所提供的位置开始的消息,并将检索到的消息发送到订户480。

如以上参考图4a和图4b所述,发布到通道foo的消息被序列化并按照特定顺序被存储在通道的通道细流中。通道管理器214在通道细流被创建时对其有序序列进行维护,并贯穿它们相应的存活时间。在一些实现中,由mx节点(例如,mx节点461或mx节点468)从通道细流检索并提供给订户的消息可以按照与这些信息被存储在通道细流的有序序列中相同的顺序。以这种方式,被发送给不同订户(例如,订户480、订户482或订户485)的消息可以按照(与这些消息被存储在通道细流中)相同的顺序,而与订户连接到哪个mx节点无关。

在各种实现中,通道细流将消息存储在一组消息块中。各个块存储多个消息。例如,块可以存储两百个千字节的消息。各个块具有其自己的存活时间,该存活时间可能比持有该块的通道细流的存活时间短。如以下参考图4c更详细所述,一旦块的ttl已经期满,则可以从持有该块的通道细流中丢弃该块。

图4c是用于存储消息传送系统的通道的消息的示例性数据结构。如参考图4a和图4b关于通道foo所述,假设在当前时刻,通道foo的通道流432包括有效通道细流4104和4105,如图4c所示。通道细流4103和4103之前的通道细流是无效的,因为它们各自的ttl已期满。通道细流4104对于其(例如,由相应的写入授权所确定的)容量已满并且关闭附加消息写入。通道细流4104仍可用于消息读取。通道细流4105开放并且可用于消息写入和读取。

通过说明的方式,通道细流4104(例如,在图4b所示的q节点474上运行的计算进程)当前持有两个消息块。块494持有来自通道位置47301~47850的消息。块495持有来自通道位置47851~48000的消息。通道细流4105(例如,在消息传送系统100中的另一q节点上运行的计算进程)当前持有两个消息块。块496持有来自通道位置48001~48200的消息。块497持有从通道位置48201开始的消息,并仍然接受通道foo的附加消息。

在(例如,通过写入授权)创建通道细流4104时,创建第一块(子缓冲器)492以存储例如来自通道位置47010~47100的消息。稍后,在块492已达到其容量之后,创建另一块493以存储例如来自通道位置47111~47300的消息。随后创建块494和495以存储附加消息。之后,通道细流4104关闭附加消息写入,并且利用附加块来创建通道细流4105以存储通道foo的附加消息。

在该示例中,块492和493各自的ttl已期满。这两个块中所存储的(来自通道位置47010~47300)的消息不再可用于通道foo的订户的读取。通道细流4104可以例如通过解除分配块492和493的存储器空间来丢弃这两个期满的块。在通道细流4104自身变为无效之前,块494或495可能变为期满并被通道细流4104丢弃。替代地,通道细流4104自身可能在块494或495变为期满之前变为无效。以这种方式,通道细流可以持有一个或多个消息块,或者不包含消息块,这取决于例如通道细流和块的相应的ttl。

在消息传送系统100中的q节点上运行的通道细流或计算进程可以通过从q节点分配特定大小的存储器空间来创建用于存储通道的消息的块。通道细流可以从消息传送系统100中的mx节点一次接收一个消息,并将接收到的消息存储在块中。替代地,mx节点可以汇集(即,缓冲)一组消息并将该组消息发送到q节点。通道细流可以(从q节点)分配存储器空间的块,并将该组消息存储在该块中。mx节点还可以例如通过从各消息中移除公共头部来对该组消息进行压缩。

如前所述,消息传送系统100中的通道的通道细流具有相应ttl。在通道细流的ttl已经期满的情况下,对于该通道的订户,不再能够从消息传送系统100获得通道细流中先前所存储的消息。这可能导致丢失消息或者订户从消息传送系统100接收到的消息的缺失。例如,订户可能已经取消订阅通道(例如,关闭用于访问消息传送系统的应用),并在十分钟之后再次订阅该通道(例如,再次重启该应用)。订户可能不(从消息传送系统100)接收在十分钟跨度期间已经期满的通道细流中所存储的消息,但是仅接收仍然有效(未期满)的通道细流中所存储的消息。因此,订户将看到他在十分钟以前的时间处或之前所接收到的最后一个消息与通道流中的第一有效通道细流(即,在期满之前具有最短有效时间的通道细流)的第一消息之间的通道中的消息的缺失。

这里所述的特定实现描述了用于维护订户从消息传送系统100接收到的通道的消息的连续性或持久性的方法。当订户订阅消息传送系统100中的通道并且请求通道中的、在该通道的通道流的有效通道细流中不再可用的消息时,各种实现可以从其他订户请求该通道的消息历史,并将具有通道流中的最新消息的消息历史提供给请求订户,如以下参考图3进一步所述。

图5是用于维护消息传送系统中的通道的订户的消息的持久性的示例性方法的数据流程图。在图5中,订户582建立与消息传送系统100的mx节点531的连接562。类似地,订户584、586、588和589建立与消息传送系统100的mx节点(例如,mx节点531、533、535、537)的相应连接564,566,568和569。这里,mx节点531、533、535、537可以经由内部网络218分别与消息传送系统100中的通道管理器214以及一个或多个q节点进行通信(530)。

通过说明的方式,假设在当前时刻,前述的通道foo的通道流501包括有效的通道细流5127和5128。通道细流5127已满。通道细流5128存储通道foo的消息,包括(在当前时刻)存储在位置54431处的最后消息。通道细流5126和5126之前的通道细流是无效的,这是因为它们各自的ttl已经期满。

假设订户584、586、588和589在当前时刻订阅了通道foo。订户584、586、588和589各自已从消息传送系统100检索到通道foo的消息,包括存储在最后(最新)有效通道细流5128中的位置54431处的最后(最新)消息。例如,订户584、586、588和589可以分别本地地存储所检索到的通道foo的消息。例如,订户可以将从消息传送系统100检索到的消息存储在客户端应用可访问的本地存储器中,以订阅消息传送系统100的通道并发布到消息传送系统100的通道。例如,客户端应用可以是先前参考图1b所述的应用层104的一部分。客户端应用可以按照与客户端应用从消息传送系统100接收消息相同的顺序、即如前所述按照与消息被存储在通道foo的通道流501中相同的顺序,来本地地存储所接收到的通道foo的消息。

另外,客户端应用可以本地地存储各消息的、在通道foo的通道流501中的相应通道流位置。这里,消息的通道流位置可以例如通过消息传送系统100与该消息一起被提供至订户。

根据各订户到通道foo的当前订阅会话的持续时间,不同订户可以本地地存储通道foo的不同数量的消息。例如,在图5中,订户584本地地存储通道foo中的来自(期满通道细流5125中的)通道流位置53820到54431的消息(594)。订户586本地地存储通道foo中的来自(期满通道细流5123中的)通道流位置53244到54431的消息(596)。订户588本地地存储通道foo中的来自(有效通道细流5127中的)通道流位置54309到54431的消息(598)。订户589本地地存储通道foo中的来自(期满通道细流5126中的)通道流位置54005到54431的消息(599)。在该示例中,订户586在当前时刻具有到通道foo的最长当前订阅会话。订户588在当前时刻具有到通道foo的最短当前订阅会话。在图5中,当前订户584、586、588和589已经接收到通道foo中的(在通道流位置54431处的)最新(最后)消息并且本地地存储该消息。在某些情况下,通道的当前订户可能与消息传送系统100不同步(例如,由于通过其与mx节点的连接来接收消息的过程中的时间滞后),并且可能没有通道的最新消息。

通过说明的方式,在当前时刻,订户582例如在具有密钥/值对的json消息中向mx节点531发送针对通道foo的消息的请求。假设订户582在较早时刻订阅通道foo,但是稍后(但在当前时刻之前)取消订阅。订户582已经本地地存储通道foo中的来自(通道细流5123之前的期满通道细流中的)通道流位置52810到(期满通道细流5124中的)53519的消息(592)。请求的json消息可以如下:

这里,请求的json消息针对通道foo以及针对在下一通道流位置53520处开始的消息来指示订阅的动作。如果订户582是通道foo的新订户,则其对通道foo的消息的请求可以具有开始通道流位置“0”或通道流501的第一位置。

由于通道foo的流501中的有效通道细流5127和5128仅具有在54121(最早有效通道细流5127中的第一位置)到54431的位置处开始的消息,因此如果仅从有效通道细流5127和5128为订户582检索通道foo的消息,则订户582可能看到消息(例如,位置53519和54121之间的消息)的缺失。

例如,代替仅从(通道foo的流501中的)有效通道细流为订户582检索通道foo的消息,消息传送系统100可以从通道foo的当前订户请求较早的消息。更具体地,在从订户582接收到针对通道foo的消息的请求之后,mx节点531首先判断请求的起始通道流位置(即,53520)是在通道foo的通道流中的有效通道细流中还是在期满通道细流中。例如,mx节点531可以标识与请求的起始通道流位置相对应的特定消息,并判断该特定消息是被存储在通道foo的流的有效通道细流中、还是被存储在现在期满的通道细流中。在该示例中,mx节点531判断为该特定消息被存储在现在期满的通道细流5124中,从而指示出订户582正在请求从通道foo的通道流501的(在当前时刻)有效的通道细流不可获得的一个或多个消息。

然后,mx节点531向(通道foo的)其他当前订户请求消息历史,其中该消息历史可以例如包括先前存储在通道foo的通道流501的现在期满的通道细流中的消息。例如,mx节点531可以向通道foo的一个或多个其他当前订户(例如订户584、586、588和589)发送特殊消息。特殊消息包括来自订户582的用于请求在通道流位置53520处开始的消息的原始请求。特殊消息还包括mx节点531的标识符,使得稍后可以将(来自通道foo的其他当前订户的)消息历史返回到mx节点531。

mx节点531可以通过例如使用前面参考图3a所述的方法将特殊消息存储(542)到通道foo的流501中的有效且开放的通道细流(例如,5128)(542),来将特殊消息发送至通道foo的其他订户。然后可以例如使用前面参考图4b所述的方法将通道foo的特殊消息和其它新消息(例如,发布到通道流501中的通道流位置54431之后的消息)提供给通道foo的其他订户。

被提供给其他当前订户的特殊消息可以是如下的json消息:

这里,json消息针对通道foo以及针对在通道流位置53520处开始的消息来指示请求消息历史的动作。“data/message_history_request”动作向订户的客户端应用指示该消息不会显示在客户端应用的用户界面中。也就是说,特殊消息对最终用户不可见。作为替代,“data/message_history_request”动作被配置为指示客户端应用向消息传送系统100提供响应消息,其中该响应消息包括本地存储在订户处的、在通道流位置53520之处或之后开始的通道foo中的可用消息。

由于本地存储在当前订户处的消息以与通道foo的通道流501中相同的顺序存储,因此响应中的通道foo的消息可以按照与通道foo的通道流501中相同的顺序布置,在请求的起始通道流位置53520之处或之后开始。响应消息还包括mx节点531的标识符,使得响应消息中的消息可被路由回mx节点531。例如,来自当前订户584的响应消息可以是如下的json消息:

这里,json消息针对通道foo并且在通道流位置53820处开始指示响应历史消息的动作。json消息还包括在通道流位置53820处开始的消息。注意,订户584没有在本地存储的通道流位置53820之前发生的消息。

类似地,订户588可以创建包括在通道流位置54309处开始的所有本地存储消息(598)的响应消息。订户589可以创建包括在通道流位置54005处开始的所有本地存储消息(599)的响应消息。这里,订户584具有多于特殊消息中所请求的消息的本地存储消息(594)。订户584可以创建包括在由特殊消息指定的起始通道流位置53520处开始的本地存储消息的响应消息。

订户584、586、588和589可以将其各自的响应消息发送至其相应的mx节点。代替将响应消息存储到通道流501,相应的mx节点可以基于“data/message_history_response”动作以及响应消息中所指定的mx节点531的标识符、通过内部网络218来将响应消息发送至mx节点531。例如,mx节点533将来自订户586的响应消息(包括来自通道流位置53520~54431的消息)发送至mx节点531(546)。mx节点535将来自订户588的响应消息(包括来自通道流位置54309~54431的消息)发送至mx节点531(548)。mx节点537将来自订户589的响应消息(包括来自通道流位置54005~54431的消息)发送至mx节点531(546)。在一些实现中,mx节点可以存储响应消息以供将来使用。

例如,在接收到响应消息之后,mx节点531选择包括特殊消息中所请求的大多数消息的特定响应消息。例如,由于订户586的响应消息包括所请求的所有通道消息(即,从通道流位置53520开始的消息),因此mx节点531可以选择来自订户586的响应消息。在来自订户586的响应消息不存在的情况下(例如,在到订户586的连接566断开的情况下),由于订户584的响应消息包括(通过特殊消息所请求的)多于来自其他订户的响应消息的消息,因此mx节点581可以选择来自订户584的响应消息。

同时,mx节点531可以例如使用先前参考图3b所述的方法从通道流501中的有效通道细流(例如,5127和5128)检索消息。mx节点531可以将从有效通道细流检索到的消息与所选择的(例如,来自订户586的)响应消息中的通道消息进行组合,并将组合消息(以与通道流501中相同的顺序)发送到订户582。mx节点531可以通过移除重复消息(例如,有效通道细流中所存储的来自通道流位置54121的消息)来组合所检索到的消息和特定响应消息中的消息。以这种方式,订户582可以看到通道foo的连续消息流,而不会丢失(或重复)先前接收到的通道流位置53519处的消息之后的消息。

如上所述,mx节点531可以例如通过如图5中的箭头542所指示地将特殊消息存储到通道流501来将请求消息历史的特殊消息发送至通道foo的所有其他当前用户。在各种实现中,消息传送系统100可以选择通道foo的可能以最多消息历史进行响应的一个或多个订户,并将特殊消息发送至所选择的订户。例如,在从订户582接收到初始请求之后,mx节点531可以(通过内部网络218)查询其它mx节点,或者在从其自己连接的订户接收到初始请求之后,mx节点531可以选择通道foo的一个或多个当前订户。mx节点531可以选择如下这样的特定当前订户,其中该特定当前订户在比指定值(例如,十分钟)长、或者足够长以“回溯”至来自订户582的初始请求中的起始通道流位置53520的时间段内(通过其相应的mx节点而)具有到通道foo的当前连接会话。然后,mx节点531可以将特殊消息发送给特定订户。如果特定订户没有直接连接到mx节点531,则mx节点531可以通过内部网络218来将特殊消息发送至该特定订户。

在各种实现中,通道管理器214(或消息传送系统100的其它软件组件)可以标识通道foo的“领导者”订户,其中该“领导者”订户(通过其相应的mx节点而)具有到通道foo的最长当前连接会话。与具有到通道foo的较短当前连接会话的其他订户相比,领导者订户可以具有更多的本地存储消息。当从订户582接收到初始请求时,mx节点531可以向通道管理器214查询领导订户。然后,mx节点531(通过内部网络218)向领导者订户发送用于请求通道foo的消息历史的特殊消息。基于该特殊消息,领导者订户可以(向mx节点531)发回包括本地存储在领导者订户处的、在初始请求中的起始通道流位置53520之处或之后开始的消息的响应消息。

mx节点531还可以选择具有(通过其相应的mx节点)到通道foo的短于阈值(例如,20毫秒)的连接延迟的特定订户,使得该特定订户更有可能以及时的方式提供响应消息(具有消息历史)。这里,连接延迟可以是mx节点和连接至该mx节点的订户之间的往返时间的一半。其它连接延迟也是可以的。mx节点531还可以选择特定订户以仅将特殊消息从其自己所连接的订户发送至通道foo,这是因为将特殊消息发送至其自己所连接的订户中的一个订户并从该订户接收响应消息不会引起与跳过另一mx节点相关联的附加延时。

图6是用于维护消息传送系统中的通道的订户的消息的持久性的另一示例性方法的流程图。例如,该方法可以使用消息传送系统100及其组件来实现。该方法以维护多个不同的通道开始,其中各通道包括有顺序的多个消息,并且各通道的消息根据顺序被存储在一个或多个相应缓冲器中,各缓冲器具有相应存活时间(步骤602,通道管理器214,q节点522、524)。该方法从第一用户(例如,订户582)接收用于指示针对不同通道中的特定通道的、在该特定通道的顺序中的一位置处开始的消息的请求的第一消息(步骤604,mx节点531)。该方法标识与顺序中的该位置相对应的特定消息,其中特定消息存储在特定通道的较早缓冲器中,该较早缓冲器具有已经期满的存活时间(步骤606,mx节点531)。基于特定消息的标识的方法向订阅特定通道的一个或多个第二用户发送针对请求的第二消息(步骤608,mx节点531)。该方法从第二用户中的特定的一个用户(例如,订户586)接收响应消息,该响应消息包括特定通道的顺序中的该位置之处或之后的一个或多个消息(步骤610,mx节点531)。该方法根据顺序而从特定通道中的具有尚未期满的存活时间的一个或多个缓冲器检索消息(步骤612,mx节点531)。该方法根据顺序来组合所检索到的消息以及响应消息中的消息(步骤614,mx节点531)。该方法将所组合的消息发送至第一用户(步骤616,mx节点531)。

本说明书中所描述的主题和操作的实施例可以在数字电子电路中、或者在计算机软件、固件或硬件中实现,其中硬件包括本说明书中所公开的结构及其结构等同物、或者它们中的一个或多个的组合。本说明书中所描述的主题的实施例可以被实现为一个或多个计算机程序,即计算机程序指令的一个或多个模块,其编码在计算机存储介质上以供数据处理设备执行或用于控制数据处理设备的操作。可选地或附加地,程序指令可被编码在人工生成的传播信号(例如,机器生成的电、光或电磁信号)上,其中该信号被生成用于对信息进行编码,从而传输到适当的接收器设备以供数据处理设备执行。计算机存储介质可以是计算机可读存储设备、计算机可读存储基板、随机或串行存取存储器阵列或装置、或者它们中的一个或多个的组合,或者被包括在其中。此外,虽然计算机存储介质不是传播信号,但是计算机存储介质可以是编码在人工生成的传播信号中的计算机程序指令的源或目的地。计算机存储介质也可以是一个或多个单独的物理组件或介质(例如,多个cd、磁盘、或其它存储装置),或者被包括在其中。

本说明中所描述的操作可以被实现为数据处理设备对一个或多个计算机可读存储装置上所存储的或者从其它源接收到的数据所进行的操作。

术语“数据处理设备”包含用于处理数据的所有种类的设备、装置和机器,举例而言包括可编程处理器、计算机、片上系统或者前述的多个或组合。设备可以包括专用逻辑电路,例如,fpga(现场可编程门阵列)或asic(专用集成电路)。除硬件以外,设备还可以包括为所考虑的计算机程序创建执行环境的代码,例如构成处理器固件、协议栈、数据库管理系统、操作系统、跨平台运行时环境、虚拟机或它们中的一个或多个的组合的代码。设备和执行环境可以实现各种不同的计算模型基础架构,诸如web服务、分布式计算和网格计算基础架构。

计算机程序(也称为程序、软件、软件应用、脚本或代码)可以以包括编译语言或解释语言、声明语言、过程语言或功能语言等的任何形式的编程语言来编写,并且其可以以任何形式进行部署,包括被部署为独立程序或者被部署为模块、组件、子例程、对象或者适合在计算环境中使用的其它单元。计算机程序可以但不必与文件系统中的文件相对应。程序可以被存储在用于保存其它程序或数据(例如,标记语言资源中所存储的一个或多个脚本)的文件的一部分中,被存储在专用于所考虑的程序的单个文件中,或者被存储在多个协同文件(例如,用于存储一个或多个模块、子程序或代码的一部分的文件)中。计算机程序可以被部署为在一个计算机上、或者在位于一个网站处或跨多个网站分布并且通过通信网络互连的多个计算机上执行。

本说明书中所描述的处理和逻辑流可以利用一个或多个可编程处理器来进行,其中这些一个或多个可编程处理器执行一个或多个计算机程序以通过对输入数据进行操作并生成输出来进行动作。处理和逻辑流也可以利用专用逻辑电路来进行,并且设备也可以被实现为专用逻辑电路,其中该专用逻辑电路例如为fpga(现场可编程门阵列)或asic(专用集成电路)。

举例而言,适合执行计算机程序的处理器包括通用微处理器和专用微处理器两者、以及任何种类的数字计算机中的任意一个或多个处理器。一般地,处理器将会从只读存储器或随机存取存储器或这两者接收指令和数据。计算机的必要元件是用于根据指令进行动作的处理器以及用于存储指令和数据的一个或多个存储器装置。一般地,计算机还将包括用于存储数据的一个或多个大容量存储装置(例如,磁盘、磁光盘、或光盘等),或者可操作地连接以从一个或多个大容量存储装置接收数据或者向一个或多个大容量存储装置传输数据或者两者兼有。然而,计算机无需具有这种装置。此外,计算机可以嵌入在另一装置中,例如智能电话、移动音频或视频播放器、游戏机、全球定位系统(gps)接收器或便携式存储装置(例如,通用串行总线(usb)闪存驱动器)等。适合存储计算机程序指令和数据的装置包括所有形式的非易失性存储器、介质和存储器装置,举例而言包括例如eprom、eeprom和闪存存储器装置等的半导体存储器装置、例如内部硬盘或可移动盘等的磁盘、磁光盘、以及cd-rom和dvd-rom盘。处理器和存储器可以由专用逻辑电路补充或者并入专用逻辑电路中。

为了提供与用户的交互,本说明书中所描述的主题的实施例可以在计算机上实现,其中该计算机具有用于向用户显示信息的例如crt(阴极射线管)或lcd(液晶显示器)监视器等的显示装置、以及用户可以向计算机提供输入所经由的键盘和例如鼠标或追踪球等的指示装置。其它种类的装置也可以用于提供与用户的交互;例如,被提供至用户的反馈可以是任何形式的感觉反馈,例如,视觉反馈、听觉反馈或触觉反馈;并且来自用户的输入可以以任何形式接收,包括声音、语音或触觉输入。另外,计算机可以通过向用户所使用的装置发送资源并且从该装置接收资源来与用户进行交互;例如,通过响应于从用户的客户端装置上的web浏览器接收到的请求向该web浏览器发送web页面,来与用户进行交互。

本说明书中所描述的主题的实施例可以在计算系统中实现,其中该计算系统包括后端组件(例如数据服务器等),或者包括中间组件(例如应用服务器等),或者包括前端组件(例如,具有用户能够与本说明书中所描述的主题的实现进行交互所经由的图形用户界面或web浏览器的客户端计算机)、或者包括一个或多个这样的前端组件、中间组件或后端组件的任意组合。系统的组件可以通过任何形式或介质的数字数据通信(例如,通信网络)而互连。通信网络的示例包括局域网(“lan”)和广域网(“wan”)、互联网(例如,因特网)、以及对等网络(例如,自组织对等网络等)。

计算系统可以包括客户端和服务器。客户端和服务器一般彼此远离,并且通常通过通信网络进行交互。客户端和服务器的关系借助于运行在各个计算机上并且彼此具有客户端-服务器关系的计算机程序而产生。在一些实施例中,服务器将数据(例如,html页面)发送至客户端装置(例如,为了向与客户端装置进行交互的用户显示数据并从该用户接收用户数据)。可以在服务器处从客户端装置接收该客户端装置处所生成的数据(例如,用户交互的结果)。

一个或多个计算机的系统可被配置为通过在系统上安装操作中使系统进行动作的软件、固件、硬件或它们的组合,来进行特定的操作或动作。一个或多个计算机程序可被配置为通过包括在由数据处理设备执行时使该设备进行动作的指令,来进行特定的操作或动作。

虽然本说明书包含许多特定实现细节,但这些细节不应被解释为对所要求保护的本发明的范围的限制,而应被解释为特定于特定发明的特定实施例的特征描述。本说明书在单独实施例的上下文中所描述的某些特征还可以在单个实施例中组合实现。相反,在单个实施例的上下文中所描述的各种特征还可以在多个实施例中单独实现或者以任何合适的子组合实现。此外,尽管以上可以将特征描述为以某些组合起作用并且甚至最初如此要求保护这些特征,但是在一些情况下可以从组合中消除所要求保护的组合中的一个或多个特征,并且所要求保护的组合可以针对子组合或子组合的变形。

类似地,虽然在附图中以特定顺序描绘了操作,但是这不应该被理解为要求以所示的特定顺序或者以序列顺序来进行这些操作、或者进行所有所示操作以实现期望结果。在某些情形中,多任务和并行处理可以是有利的。此外,上述实施例中的各种系统组件的分离不应被理解为在所有实施例中都要求这种分离,并且应当理解,所描述的程序组件和系统通常可以一起集成在单个软件产品中或者封装到多个软件产品中。

因此,已经描述了主题的特定实施例。其它实施例在所附权利要求书的范围内。在一些情况下,权利要求书中所列举的动作可以以不同的顺序进行,并且仍然实现期望结果。另外,附图中所描绘的处理并非必须需要所示的特定顺序或序列顺序来实现期望的结果。在某些实现中,多任务和并行处理可以是有利的。

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