消息传送系统的多速消息通道的制作方法

文档序号:17536998发布日期:2019-04-29 14:05阅读:147来源:国知局
消息传送系统的多速消息通道的制作方法

本申请要求2016年7月6日提交的美国专利申请no.15/202,908的优先权,其全部内容通过引用而并入于此。



背景技术:

本说明书涉及数据通信系统,特别地涉及用于实现多速消息通道的系统。

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



技术实现要素:

一般来说,本说明书中所描述的主题的一个方面可以体现在如下的方法中,该方法包括如下的动作:从多个发布者接收多个不同通道中的第一通道的消息,其中各通道包括按顺序的多个消息;根据所述顺序将所述第一通道的消息存储在一个或多个第一缓存器中,各第一缓存器具有相应的存活时间;对于一个或多个连接,基于所述第一通道的数据类型和所确定的所述连接的延时来确定相应的采样率;通过第一连接从订户接收对所述第一通道的消息的请求;根据所述顺序和所述采样率来选择所述第一缓存器中的消息;以及根据所述顺序,使用所述第一连接将所选择的消息发送至所述订户。该方面的其它实施例包括相应的系统、设备和计算机程序。

这些和其它方面可以可选地包括以下特征中的一个或多个特征。该方面还可以包括使用所述第一连接的往返延迟时间来确定该第一连接的延时。该方面还可以包括基于所述第一通道的一个或多个消息向所述订户的延迟或缺失传递的指示来确定所述第一连接的延时。该方面还可以包括从所述订户接收所述指示。确定所述第一连接的延时可以还基于所述多个不同通道中的第二通道的一个或多个消息向所述订户的延迟或缺失传递的第二指示。该方面还可以包括:基于一个或多个消息或者所选择的消息向所述订户的延迟或缺失传递来确定所述第一连接的第二延时;以及基于所述第二延时来调整所述第一连接的相应的采样率。调整所述第一连接的采样率还包括相对于从所选择的消息的先前确定的延时到所述第二延时的变化相反地改变所述相应的采样率。基于数据类型来确定相应的采样率还包括:标识所述第一通道的消息的时变数据字段;从所述第一通道的两个或更多个消息获得所述时变数据字段中的相应数据值;以及确定所述相应数据值相对于时间的变化幅度,并基于所述变化幅度来确定特定连接的相应的采样率。

可以实施本说明书中所描述的主题的特定实施例,以实现以下优点中的一个或多个优点。在网络连接由于中间路由器或移动基站处的消息累积、或者由于连接问题而不稳定的情况下,连接的延时恶化。这对于期望以及时的方式(即,以可接受的延时)接收通过所述连接而传输的消息的应用而言可能引起问题。在连接的延时较差的情况下,这里的特定实施例描述了用于对数据传输进行调步(pacing)、对数据传输进行采样或两者兼有的技术,以适应连接延时。对于依赖于定期接收消息的应用,这会得到更好的性能,因为这些应用将不会被成群到达的消息或对于实时应用而言太迟到达的消息所压倒。

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

附图说明

图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节点还可以例如通过从各消息中移除公共头部来对该组消息进行压缩。

图5是用于在消息传送系统100的订户网络连接存在问题的情况下向该订户提供消息的示例性方法的数据流图。在图5中,订户512与消息传送系统100中的mx节点522建立连接532。可以使用例如tcp/ip协议或具有错误恢复的其它合适协议来发送通过连接532而发送的消息。替代地,协议可以是udp或不提供分包的可靠传递的其它协议。

连接532可以遍历一个或多个有线和/或无线网络。mx节点522可以经由内部网络218来与消息传送系统100中的通道管理器214和一个或多个q节点进行通信(530)。在该示例中,订户512通过向mx节点522发送订阅请求来订阅消息传送系统100的命名为foo的通道。在接收到订阅请求的情况下,mx节点522向通道管理器214发送对通道foo的通道流中的通道细流的读取授权的请求。

通过说明的方式,如图5所示,假设在当前时刻,通道foo的通道流502包括有效通道细流5256和5257。通道细流5255和5255之前的通道细流是无效的,这是因为它们各自的ttl已经期满。通道管理器214向mx节点522提供对(例如,驻留在消息传送系统100中的q节点526上的)通道细流5256的读取授权。mx节点522可以例如使用前面参考图3b所述的用于从通道细流读取数据的方法来从q节点526检索通道细流5256中的消息(例如,m51、m52、m53、m54等),并使用连接532向订户512提供检索到的消息。

连接532可能发生的一个问题是由于沿着连接532的一个或多个网络链路上的不稳定性而引起的中间路由器或移动基站处的消息累积。这可能导致累积的消息一起到达订户512处,潜在地导致客户端装置上的不稳定应用行为。例如,如果消息包含股票报价器应用的股票价格信息,则这种行为可能导致一段时间的股票突然报价活动、然后是一段时间的无活动。可能发生的第二个问题是沿着连接532存在可能导致订户512所接收到的消息减少的暂时延迟的情况。对于实时应用,减慢可能导致订户512装置上运行的应用变得过时。

mx节点522和订户512之间的连接532的健康可以基于连接532的延时来确定。为了计算延时,首先针对连接532确定往返时间(rtt)。rtt是以从mx节点522向订户512发送消息开始、并在mx节点522从订户512接收到消息已被接收的确认时结束所经过的时间的测量。可以针对所有订户连接确定rtt。rtt可以采用多种方式来计算。一种方式是使用诸如“ping”等的实用程序,其中该实用程序将探测连接532并确定rtt。rtt还可以从tcp协议所维持的信息获得。例如,tcp具有可通过网络驱动器的扩展而接入的内部rtt估计设施。以相同的方式,可以使用确认中的tcp/ip分包序列号来确定rtt。最后,计算rtt的另一种方式是在订户512和mx节点522之间使用应用级消息传送。例如,包含发送消息的时间的消息可以从mx节点522发送至订户512。当订户512上运行的应用接收到消息时,其以包含自初始消息的时间的确认消息向mx节点522作出响应。在接收到确认消息时,mx节点522可以从当前时间减去确认中所包含的消息的时间以确定rtt。确定rtt的最后这种方式具有以下优点:其考虑了应用可能经历的任何延迟而非完全在网络协议(例如,tcp/ip)级的延迟。

一旦确定连接532的rtt,就计算连接532的延时。延时提供了对连接532的健康指示。在一些实现中,延时是rtt/2。在其它实现中,延时是平均rtt除以2。例如,平均rtt是在诸如5分钟等的时间段内确定的rtt计算的平均值。在一些实现中,该时间段的长度可以基于在给定连接上每秒发送的消息数。例如,该时间段可以等于c[1/(每秒的消息)],其中c是2~100之间的恒定值。计算该时间段的其它方式也是可以的。

存在用以缓解连接532的延时的几种方式。一种方法是调步,其要求mx节点522减慢连接532上的向订户512发送消息的速率。例如,可以调节从mx节点522向订户512发送消息的速率,以使得该速率不超过延时。以下更详细介绍的另一种方法是采样。采样通过仅将消息的子集发送给订户512来减少被发送至订户512的消息数。可以使用这些技术其中之一或两者。

代替通过连接532将从通道foo的通道细流检索到的所有消息发送至订户512,mx节点522可以基于连接532的延时来对所检索到的消息进行采样,并通过连接532将采样消息发送至订户512。例如,如果连接532的延时是200毫秒,则mx节点522可以使用连接532以每隔一个的方式向订户512发送所检索到的消息。如图5所示,mx节点522可以向订户512发送所检索到的消息m51、m53、m55等(542)。作为另一示例,如果连接532的延时是400毫秒,则mx节点522可以使用连接532以每四个消息发送一个的方式向订户512发送所检索到的消息。mx节点522可以使用连接532向订户512发送所检索到的一个消息并跳过所检索到的三个消息(例如,m51、m55、m59等)。以这种方式,订户512可以通过跳过通道中的以其它方式将不会按时到达订户512的一些消息,来以与向通道foo1发布采样消息相同的速度接收通道foo的采样消息。这里注意,mx节点522以与消息被存储在通道细流5256中相同的顺序(即,以与消息被存储在通道foo的流中相同的顺序)发送采样消息。

在各种实现中,mx节点522可以基于连接532的当前延时来动态地调整针对所检索到的消息的采样率。例如,mx节点522可以确定连接532的200毫秒的延时,并基于所确定的200毫秒的延时使用连接532以每隔一个的方式(即,采样率为50%)向订户512发送所检索到的消息。在稍后的时间,mx节点522可以确定连接532的80毫秒的延时,然后使用连接532向订户512发送所检索到的每个消息(即,采样率为100%),这是因为连接532不是向订户512传递所检索到的消息的瓶颈。在该示例中,如果mx节点522在稍后的时间判断为连接532的延时已经增加至400毫秒,则mx节点522可以使采样率减小至25%并使用连接532每四个消息发送一个的方式向订户512发送所检索到的消息。也就是说,mx节点522可以动态地将(所检索到的消息的)采样率相对于连接532的延时的变化反向调整。

在一些实现中,采样率还可以基于通道foo的数据类型。例如,通道foo的消息可以是如上所述的股票报价。由于股票报价在特定的时间段(例如,1秒)内可能不会显著变化,因此采样率可以与该特定时间段相同或类似,例如,对于通道foo的每十个消息(股票报价)进行一次采样。采样消息可以仍然代表通道foo的整体消息。其它数据类型也是可以的。例如,通道foo的消息可以是特定房间的每一分钟的温度读数。由于温度读数在20分钟的时间段内可能不会显著变化,因此采样率可以是二十个消息中的一个消息,而采样到的温度读数仍然可以代表房间的整体温度。例如,mx节点532可以检查通道foo的消息,并在这些消息中标识与诸如温度读数或股票报价等的时变数据值相接触的数据字段。mx节点532从通道foo的多个消息获得时变数据字段中的值,确定这些值相对于时间的变化幅度,并相应地确定连接532的采样率。在以上的温度读数的示例中,例如,如果mx节点532判断为温度读数的变化在30分钟的时间段内小于5%,则mx节点532可以确定每三十个消息(读数)中的一个消息的采样率。在一些实现中,通道foo的一些消息可以标记有数据类型或优先值,这些数据类型或优先值表示这些消息在传递至订户512时不能被跳过(例如,系统或控制消息等)。在这种情况下,这些消息的采样率可以是100%。

在一些实现中,mx节点522还可以基于通道foo的一个或多个消息向订户512的延迟或缺失传递的指示来确定连接532的延时。例如,订户512上运行的应用可以检查其所接收到的通道foo的各消息以获得(针对该通道的)发布时间的时间戳或消息序列号。如果应用检测到(例如,从消息的时间戳到其在订户512处的到达时间的)传递延迟在增加,例如在连接532的延时大于消息被发布至通道foo的速率的情况下,应用可以向mx节点522发送与延迟有关的指示。如果应用(例如,基于接收到的消息的不连续序列号而)检测到通道foo的一个或多个缺失消息,则该应用还可以向mx节点522发送缺失传递的指示。

基于缺失或延迟传递的指示,mx节点522可以对要被提供至订户512的消息应用某一采样率(例如,小于100%),使得订户512可以跟上消息被发布至通道foo的速度。mx节点522还可以基于指示来调整(减小)连接532的现有采样率。例如,mx节点522可以确定50%的采样率(例如,小于1/1.8)来使用连接532向订户512提供通道foo的消息。

在一些实现中,mx节点522可以基于消息传送系统100中的另一通道的一个或多个消息向订户512的延迟或缺失传递的指示,来确定连接532的延时。例如,订户512上运行的应用可以发送表明名为“bar”的另一通道中的每两个消息中有一个消息不会到达订户512的指示。在这种情况下,mx节点522可以确定50%的采样率来使用连接532向订户512提供通道foo的消息。

图6是用于向消息传送系统100的订户提供消息的示例性方法的流程图。例如,该方法可以使用消息传送系统100中的mx节点(例如,mx节点204、mx节点522)来实现。该方法以从多个发布者接收多个不同通道中的第一通道的消息开始,其中各通道包括按顺序的多个消息(602)。该方法根据顺序将第一通道的消息存储在一个或多个第一缓存器中,各第一缓存器具有相应的存活时间(604)。对于一个或多个连接,该方法基于第一通道的数据类型和所确定的连接的延时来确定相应的采样率(606)。该方法通过第一连接从订户接收对第一通道的消息的请求(608)。该方法根据顺序和采样率来选择第一缓存器中的消息(610)。该方法根据顺序,使用第一连接将所选择的消息发送至订户(612)。

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