基于容错FPGA的事务系统的正好一次事务语义的制作方法

文档序号:18822721发布日期:2019-10-09 01:03阅读:192来源:国知局
基于容错FPGA的事务系统的正好一次事务语义的制作方法

本申请要求于2018年3月22日提交的印度专利申请号201821010571的优先权。上述申请的全部内容通过引用结合在此。

本文的公开内容一般涉及事务系统,并且更具体地,涉及为基于容错现场可编程门阵列(fieldprogrammablegatearray(fpga))的事务系统提供正好一次(exactly-once)事务语义的框架。



背景技术:

期望事务应用程序响应来自客户端或消息源的传入消息。数据库服务器系统是事务处理的主要示例。当数据库服务器在其内部实现方式(基于行到基于列、自定义数据结构、键值存储器)以及甚至技术(基于磁盘的存储到存储器中的存储(in-memorystorage))上不断发展时,因此其应用程序也在不断发展。从纯客户端-服务器系统到多层到实时流分析-所有这些应用程序都需要与数据库服务器进行事务处理。无论应用程序如何发展,对事务数据库的需求仍然存在。并且当应用程序发展时,可能会有许多类别的应用程序,其需要处理速度、高吞吐量、高可用性而同时处理事务正好一次,无论有多少组件发生故障,无论故障事件的序列如何。当应用程序本身变得复杂时,拥有提供这些特征的框架简化了这些应用程序的设计,从而使能高性能。



技术实现要素:

本公开的实施例呈现技术改进,作为本发明人在传统系统中认识到的一个或多个上述技术问题的解决方案。

在一个方面,提供了一种基于现场可编程门阵列(fpga)的事务系统,包括:多个fpga,所述多个fpga包括主动fpga和剩余的被动fpga,所述多个fpga中的每个被配置为与多个主机和至少一个客户端协作,所述多个fpga经由传输控制协议(tcp)连接而与所述至少一个客户端连接,所述多个fpga中的每个都具有易失性存储器。在实施例中,所述多个fpga包括:改进式传输控制协议单元(mtcpu),其被配置为:由所述主动fpga的mtcpu接收来自所述至少一个客户端的对应于传入请求的tcp数据包;将所述tcp数据包附加至少一个时间戳作为非确定性参数;由所述主动fpga的mtcpu将所述tcp数据包发布到所述被动fpga,并且然后在由所述被动fpga接收到所述tcp数据包的内部确认之后,将所述传入请求的tcp确认发送到所述至少一个客户端;由所述主动fpga的mtcpu控制所述传入请求以及在可配置延迟之后由应用程序的并发执行引起的重新提交的请求的调度,其中所述重新提交的请求优先于所述传入请求;并且通过准备对应于(a)响应或(b)所述响应和一个或多个通知的tcp数据包、并在接收到来自所述多个主机的内部确认时将准备好的tcp数据包发送到所述至少一个客户端来优化性能;消息解析单元(mpu),其被配置为:由所述主动fpga的mpu检测基于相关联的请求标识符接收到的重复请求;由所述主动fpga的mpu基于相关联的客户端标识符和相关联的请求标识符检索所述重新提交的请求;并且将从所述mtcpu按序列接收到的tcp数据包解析并转换成消息格式,其与所述至少一个客户端与所述多个fpga和所述多个主机之间的网络相关联;并且按所述序列以所述消息格式发送所述传入请求;事务处理单元(tpu),其被配置为:托管处理来自所述mpu的传入请求或重新提交的请求的应用程序,并生成(a)所述响应或(b)所述响应以及与其相关联的一个或多个通知;并且接收由来自所述应用程序的并发执行引起的重新提交的请求,并经由所述mpu发送给所述mtcpu进行调度;事务提交单元(tcu),其被配置为:接收(a)所述响应或(b)所述响应以及来自所述tpu的一个或多个通知;生成消息,所述消息包括所述传入请求或所述重新提交的请求以及(a)所述响应或(b)所述响应和所述一个或多个通知;并且将所述消息发送到:(i)所述多个主机,以执行去往所述至少一个客户端的提交和发送中的至少一个,以及(ii)mtcpu以用于优化性能,其中准备好的tcp数据包构成(a)消息中的至少一部分或(b)所述消息中的一个或多个;以及监视单元(mu),其被配置为:如果检测到主动fpga故障,则监视并发起fpga故障转移过程。

在另一方面,提供了一种方法,包括:建立从至少一个客户端到每个现场可编程门阵列(fpga)的传输控制协议(tcp)连接,并且基于fpga的事务系统中的每个主机包括在其间发送消息的多个fpga、多个主机和至少一个客户端,其中所述消息中的每个包括来自所述至少一个客户端的传入请求和到所述至少一个客户端的(a)响应或(b)所述响应和与其相关联的一个或多个通知,并且其中传入请求和对应的响应表示事务;取决于所述多个主机中的可用主机的数量,基于预先配置的模式切换阈值而在操作的高性能模式和操作的保守模式之间切换所述基于fpga的事务系统的操作模式,其中(i)所述高性能模式涉及将所述消息保存在与所述多个主机中的每个相关联的易失性存储器中,并且然后将其内部确认发送到所述多个fpga中的对应fpga,并且(ii)所述保守模式涉及将所述消息保存到与所述多个主机中的每个相关联的非易失性存储器中,并且然后将其内部确认发送到所述多个fpga中的对应fpga;当操作的高性能模式切换到操作的保守模式时,在切换时段期间将来自所述易失性存储器的消息保存到所述多个主机的非易失性存储器中;延迟将(a)所述响应或(b)所述响应和所述一个或多个通知发送到所述至少一个客户端,直到在所述切换时段期间将所述相关联的消息保存到所述非易失性存储器中结束为止或基于预先配置的时间延迟,以确保作为在传入请求之前到达所述多个主机的相关联的重复请求的替代而由所述多个主机接收传入请求;并且延迟向所述多个fpga发送所述内部确认,直到将所述相关联的消息保存到所述非易失性存储器中结束为止。

在实施例中,所述多个主机的易失性和非易失性存储器被实施为键值存储器,并且其中所述传入请求中的每个都利用客户端标识符和请求标识符进行标记,其中所述请求标识符是由与所述至少一个客户端相关联的中间件针对每个后续传入请求递增的唯一序列号;对应的响应利用所述请求标识符进行标记;传入请求和对应的响应表示事务;并且对应于所述传入请求的通知利用通知标识符进行标记,所述通知标识符包括:相关联的客户端标识符、相关联的请求标识符和所述事务内的通知的序列号。

在实施例中,上面描述的方法还包括由所述多个fpga通过以下方式检测来自所述至少一个客户端的所有重复请求:针对列表中不可用的每个传入请求并且如果相关联的序列号大于从对应的客户端接收到的最大序列号,则在所述多个fpga中的每个中附加请求标识符的列表,其与在所述多个fpga中正处理的传入请求相关联;如果在所述列表中相关联的请求标识符可用,则丢弃传入请求;如果相关联的请求标识符在所述列表中不可用,则从应用程序获得(a)响应或(b)与所述传入请求相对应的一个或多个通知这二者中的至少一个;向所述多个主机发送(a)所述响应或(b)所述响应和所述一个或多个通知并且从所述列表中删除相关联的请求标识符;取决于所述操作模式,将包括所述传入请求或所述重新提交的请求的消息与(a)所述响应或(b)所述响应以及与其相关联的一个或多个通知存储在所述多个主机中的适当键值存储器中;如果相关联的请求标识符在请求标识符的列表中不可用并且如果所述相关联的序列号小于从所述对应客户端接收到的最大序列号,则将(a)所述响应或(b)所述响应和来自所述多个主机的易失性或非易失性存储器的一个或多个通知发送到所述至少一个客户端,从而由所述多个fpga检测作为重复请求的传入请求;并且在接收到关于由对应客户端消耗(a)所述响应或(b)所述响应和所述一个或多个通知的确认时,从所述易失性存储器中删除所述消息并保存在所述多个主机的非易失性存储器中。

在实施例中,上面描述的方法还包括:如果在预先配置的时间内没有从所述至少一个客户端接收到关于接收所述通知的确认,则通过重新发送所述一个或多个通知来以正好一次语义将所述一个或多个通知发送到所述至少一个客户端。

在实施例中,上面描述的方法还包括通过以下方式提供每个事务的确定性执行:将对应于所述传入请求的tcp数据包附加至少时间戳作为非确定性参数,其中所述tcp数据包构成(a)消息的至少一部分或(b)所述消息中的一个或多个;由所述主动fpga将所述tcp数据包发布到所述被动fpga,并且然后在由所述被动fpga接收到所述tcp数据包的内部确认之后,将所述传入请求的tcp确认发送到所述至少一个客户端;在所述主动fpga中接收由应用程序并发执行引起的重新提交的请求;由所述主动fpga仅将具有用于重新提交的请求的非确定性参数的请求标识符发布到所述被动fpga;将所述重新提交的请求作为键值存储器而存储在所述多个fpga的易失性存储器中;并且通过在所述主动fpga中将所述重新提交的请求优先于所述传入请求,而在可配置延迟之后调度所述传入请求以及所述重新提交的请求的执行。

在实施例中,上面描述的方法还包括通过以下方式为所述事务系统提供高可用性:将所述多个fpga中的一个识别为主动fpga并将所述多个主机中的一个识别为主动主机,将来自所述多个fpga的剩余fpga和来自所述多个主机的剩余主机分别识别为被动fpga和被动主机以实现冗余;在所述多个主机和所述多个fpga之间没有内部消息的情况下,在预设心跳阈值内由所述主动fpga向所述被动fpga和所述多个主机中的每个发起心跳请求,其另外用作分别指示在所述多个fpga和所述多个主机中的活动fpga和活动主机的心跳;由用作监视服务器的主动主机向所述被动主机和所述被动fpga发起心跳请求;由所述监视服务器基于所述心跳请求的状态而向所述多个fpga中的每个和所述多个主机中的每个广播所述活动fpga和所述活动主机的列表;如果(i)所述至少一个客户端经由所述被动fpga触发fpga故障转移过程或(ii)所述监视服务器在所述预设心跳阈值内未从所述主动fpga接收到指示其故障的心跳请求,则向下一个被动fpga发起fpga故障转移过程,其中来自所述多个fpga的预定序列并且在所述活动fpga和活动主机的列表中被广播的下一个被动fpga被识别为下一个主动fpga;如果所述被动主机中的任何一个在所述预设心跳阈值内未从所述主动主机接收到指示其故障的心跳请求,则由被动主机从所述多个主机的预定序列发起主机故障转移过程,并且将来自所述多个主机的预定序列并在活动fpga和活动主机的列表中被广播的被动主机进一步识别为所述下一个主动主机;在分别完成所述fpga故障转移过程或所述主机故障转移过程之后,由所述主动fpga或所述监视服务器向所述活动fpga、所述活动主机和所述至少一个客户端中的每个广播所述下一个主动fpga或所述下一个主动主机;并且终止等待使用心跳确定出的、关于基于由所述监视服务器发送的活动主机和活动fpga的列表的另外主机和fpga的故障的内部确认或消息。

在实施例中,上面描述的方法还包括通过执行以下中的一个或多个来在主动fpga故障转移期间维持跨所述多个fpga和所述多个主机的一致状态(320):解析由所述多个fpga从所述主动fpga接收到的所有tcp数据包;由所述多个fpga丢弃不完整的消息;比较由所述被动fpga和所述主动fpga接收到的tcp数据包的数量,并将丢失的tcp数据包从所述主动fpga拷贝到所述被动fpga;并且处理所述多个fpga中的重新提交的消息。

在又一方面,提供了一种基于现场可编程门阵列(fpga)的事务系统(没有主机),包括:多个fpga,包括主动fpga和剩余的被动fpga,所述多个fpga中的每个被配置为经由传输控制协议(tcp)连接而与至少一个客户端协作,所述多个fpga中的每个都具有一个或多个存储设备,其是易失性存储器和非易失性存储器的组合并且被实施为键值存储器,所述多个fpga包括:改进式传输控制协议单元(mtcpu),其被配置为:由所述主动fpga的mtcpu接收来自所述至少一个客户端的对应于传入请求的tcp数据包;将所述tcp数据包附加至少一个时间戳作为非确定性参数;由所述主动fpga的mtcpu将所述tcp数据包发布到所述被动fpga,并且然后将所述传入请求的tcp确认发送到所述至少一个客户端;由所述主动fpga的mtcpu控制所述传入请求以及在可配置延迟之后由应用程序的并发执行引起的重新提交的请求的调度,其中所述重新提交的请求优先于所述传入请求;并且将(a)响应或(b)所述响应和一个或多个通知发送到所述至少一个客户端;消息解析单元(mpu),其被配置为:由所述主动fpga的mpu检测基于相关联的请求标识符接收到的重复请求;由所述主动fpga的mpu基于相关联的客户端标识符和相关联的请求标识符检索所述重新提交的请求;并且将从所述mtcpu按序列接收到的tcp数据包解析并转换成消息格式,其与所述至少一个客户端和所述多个fpga之间的网络相关联;事务处理单元(tpu),其被配置为:托管处理来自所述mpu的传入请求或重新提交的请求的应用程序,并生成(a)所述响应或(b)所述响应和所述一个或多个通知;并且接收由来自所述应用程序的并发执行引起的重新提交的请求,并经由所述mpu发送到所述mtcpu进行调度;事务提交单元(tcu),其被配置为:接收(a)所述响应或(b)所述响应以及从所述tpu发送的一个或多个通知;生成消息,其包括所述传入请求或所述重新提交的请求和(a)所述响应或(b)所述响应和所述一个或多个通知,其中所述tcp数据包构成(a)消息的至少一部分或(b)所述消息中的一个或多个;并且将所述消息发送到所述mtcpu;以及监视单元(mu),其被配置为:如果检测到主动fpga故障,则监视并发起fpga故障转移过程。

在实施例中,在基于fpga的事务系统(没有主机)中,所述多个fpga还被配置为:取决于所述多个fpga中的可用fpga的数量,基于预先配置的模式切换阈值而在操作的高性能模式和操作的保守模式之间切换所述基于fpga的事务系统的操作模式,其中(i)所述高性能模式涉及将所述消息保存在与所述多个fpga中的每个相关联的易失性存储器中,并且然后将tcp确认发送到所述至少一个客户端,并且(ii)所述保守模式涉及将所述消息保存在与所述多个fpga中的每个相关联的非易失性存储器中,并且然后向所述至少一个客户端发送tcp确认;当操作的高性能模式切换到操作的保守模式时,在切换时段期间将来自所述易失性存储器的消息保存到所述非易失性存储器中;并且延迟将(a)所述响应或(b)所述响应和所述一个或多个通知发送到所述至少一个客户端,直到所述消息保存到所述非易失性存储器中结束为止。

在实施例中,在基于fpga的事务系统(没有主机)中,所述传入请求中的每个都利用客户端标识符和请求标识符进行标记,其中所述请求标识符是由与所述至少一个客户端相关联的中间件针对每个后续传入请求递增的唯一序列号;其中对应的响应利用所述请求标识符进行标记;其中传入请求和对应的响应表示事务;并且其中对应于所述传入请求的通知利用通知标识符进行标记,所述通知标识符包括:相关联的客户端标识符、相关联的请求标识符和所述事务内的通知的序列号。

在实施例中,在基于fpga的事务系统(没有主机)中,被包括在用作监视服务器的主动fpga中的mu被配置为,在所述被动fpga和所述主动fpga之间没有内部消息的情况下在预设心跳阈值内向所述被动fpga发起心跳请求,其另外用作指示在所述多个fpga内的活动fpga的心跳,被包括在所述主动fpga中的mu还被配置为将所述活动fpga的列表广播到所述多个fpga中的每个;并且其中包括在每个被动fpga中的mu被配置为,如果(i)所述被动fpga中的任何一个在预设心跳阈值内没有从主动fpga接收到指示其发生故障的心跳请求,其中来自所述多个fpga的预定序列并且在活动fpga的列表中被广播的被动fpga被识别为所述下一个主动fpga,或(ii)所述至少一个客户端经由所述被动fpga触发所述fpga故障转移过程,则发起fpga故障转移过程以将其自身转换为主动fpga。

在实施例中,在基于fpga的事务系统(没有主机)中,所述多个fpga通过以下连接:(i)外围组件互连高速(pcie)网络、(ii)pcie和infiniband网络的组合、或(iii)通过融合以太网的远程直接存储器存取(rdma)(roce)网络和infiniband网络的组合。

应当理解,前面的一般性描述和下面的详细描述都只是示例性和说明性的,并不是对要求保护的本发明的限制。

附图说明

包含在本公开中并构成本公开的一部分的附图示出了示例性实施例,并且与说明书一起用于解释所公开的原理:

图1示出了如本领域中已知的服务器和多个客户端之间的消息交换。

图2a示出了根据本公开的实施例的基于现场可编程门阵列(fpga)的事务系统的示例性框图。

图2b示出了根据本公开另一实施例的基于fpga的事务系统的示例性框图。

图3a至图3c是示出了根据本公开的实施例的用于在基于容错fpga的事务系统中实现正好一次事务语义的计算机实现的方法的示例性流程图300。

图4a是根据本公开的实施例的图2a的基于fpga的事务系统的示例性架构。

图4b是根据本公开的实施例的图2a的基于fpga的事务系统的另一示例性架构。

图5是根据本公开的实施例的构成图2a的基于fpga的事务系统的fpga的示例性微架构。

图6a是根据本公开的实施例的在主动fpga内处理不需要重新提交的事务的消息的示例性序列。

图6b是根据本公开的实施例的在主动fpga内处理在重新提交之后已经重新提交、重新调度和提交的事务的消息的示例性序列。

图7a是根据本公开的实施例的当处理不需要重新提交的事务的消息时用于消息接收中的容错的示例性操作序列。

图7b是根据本公开的实施例的当处理已经重新提交的事务的消息时用于消息接收中的容错的示例性操作序列。

图8是根据本公开的实施例的当两个主机是活动的时用于事务的提交(commit)中的容错的示例性操作序列。

图9是根据本公开的实施例的当一个主机是活动的时用于事务的提交中的容错的示例性操作序列。

图10是根据本公开的实施例的用于客户端通知中的容错的示例性操作序列。

图11是根据本公开的实施例的示例性可用性监视的图示。

图12是根据本公开的实施例的当主动fpga发生故障时采取的示例性恢复动作的图示。

图13是根据本公开的实施例的当主机发生故障时的示例性事件序列的图示。

图14是根据本公开的实施例的当客户端发生故障并且在恢复时发送已经提交的旧请求消息的示例性事件序列的图示。

图15是根据本公开的实施例的当处理客户端的确认时的示例性事件序列的图示。

图16是根据本公开的实施例的实现向客户端正好一次递送通知的操作序列的图示。

图17是根据本公开的实施例的fpga卡的示例性框图。

图18是根据本公开的实施例的拥有全部都具有冗余网络连接性的2个主机、3个fpga卡和2个客户端的基于fpga的事务系统的示例性表示。

图19a是根据本公开的实施例的没有主机的基于fpga的事务系统的示例性高级表示。

图19b是没有图19a的主机的基于fpga的事务系统的示例性详细表示。

具体实施方式

参考附图描述示例性实施例。在附图中,附图标号的最左边的一个或多个数字标识首次出现附图标号的图。在任何方便的地方,贯穿附图使用相同的附图标号来指代相同或相似的部分。虽然本文描述了所公开原理的示例和特征,但是在不脱离所公开实施例的精神和范围的情况下,修改、改编和其他实现是可能的。旨在将以下详细描述视为仅是示例性的,其真实范围和精神由所附权利要求指示。

利用目前的技术水平,难以实现每秒超过数百万条消息的低延迟和高吞吐量,同时在可能的故障面前实现高可用性。容错检查和控制可能会限制性能。在现场可编程门阵列(fpga)上构建应用程序所需的工程工作量很高,并且让应用程序开发人员关注非功能性问题会增加时间,从而导致市场延迟并使应用程序变得复杂。典型的事务型应用程序是传统的订单处理在线系统、用于证券交易所交易的订单匹配应用程序、实时流分析、物联网(internetofthings(iot))应用程序和实时推荐系统等。

本公开提供了一种使用fpga的事务框架,其可以在不妨碍性能的情况下递送容错和正好一次的消息传递语义。该框架可以显着减少应用程序开发时间,这是因为开发人员不再需要构建容错和正好一次特征。他们只需要确保应用程序处理是高性能的。

客户端通常通过传输控制协议/互联网协议(tcp/ip)连接。这样的系统可以具有多个层-例如,前端层(其复用客户端连接)和后端层(其托管数据库)。后端系统是服务器系统。服务器系统包括有状态的任何服务器,并且要求永远维护服务器的状态-这意味着应该应用程序永远不会丢失它去继续任何有意义的操作。客户端本身可能不是真实用户,而是高频交易引擎,其下订单以利用亚秒级交易机会。这意味着系统务必响应具有低延迟的事务。与此同时,可能有数千个这样的共同定位的客户端连接在一起下订单-换句话说,他们务必支持高吞吐量的事务。更重要的是,不应该有停机,理想情况是在市场营业时间期间-这些场景下的停机可能会转化为数百万美元的业务损失。

服务器典型地具有标准传输控制协议(tcp)接口。因此,对于每秒百万次订单的大量突发传入请求,服务器以微秒级快速响应是必要的。鉴于组件的故障,服务器需要具有容错能力或提供高可用性。服务器需要确保没有消息丢失,并且应该没有重复消息,尤其是在故障期间组件故障转移的情况下。服务器上需要的其他特征包括容忍客户端故障、支持正好一次事务语义以及支持客户端先前事务和消息的查询。

图1示出了如本领域中已知的服务器和多个客户端之间的消息交换。期望事务系统生成对每个传入请求的响应。响应不需要是同步的,即客户端可以一个接一个地向服务器发送请求,并且服务器可以以任何顺序将响应发送回客户端,其标识了正在响应的请求。传入请求和对应的响应消息的配对可以被称为事务(transaction)。传入请求也可以称为传入消息或命令。作为传入请求的处理的一部分,除了生成响应之外,可以存在为一个或多个客户端生成通知或警报的额外处理。对于事务处理,通知可能看起来是异步的,但它始终是事务处理的结果。来自客户端的传入请求不一定总是导致通知-它可能是由于来自另一个客户端的请求而发生的,在这种情况下,第一个客户端的请求似乎被延迟了(与请求消息无关)。通知可以发送到任何客户端,并由应用程序语义确定。尽管图1可能暗示客户端在发送下一个请求之前等待对请求的响应,但是客户端实际上可以在不等待响应的情况下发送下一个请求。从这个意义上讲,请求和响应也是异步的。

事务和通知是通过其序列号来识别的。客户端中间件可以生成作为唯一序列号的请求标识符(rn),如图1中示出的。对于传入请求的请求标识符(rn)针对由客户端发送的每个后续请求递增。客户端标识符(clid)和请求标识符(rn)唯一地标识事务系统中的请求。服务器使用与传入请求相同的序列号(rn)来标记响应-从而使得可以标识事务。发送给客户端的每个通知都标记有唯一标识符。此通知标识符对于客户端是唯一的。对于另一个客户端的相同通知可以具有唯一标识该客户端的序列号的不同标识符。通知标识符包括客户端标识符(clid)、与触发请求相关联的请求标识符(rn)以及事务内的通知序列(n、n+1、n+2等)。客户端应用程序处理了响应后,它会确认返回到服务器的响应或通知。系统此刻可以释放它分配给事务的资源(存储器/存储)。

现在参考附图,并且更具体地参考图2至图19b,其中类似的附图标记贯穿附图表示对应的特征,示出了优选实施例,并且在以下示例性系统和方法的上下文中描述了这些实施例。

图2a和图2b分别示出了根据本公开的两个实施例的基于现场可编程门阵列(fpga)的事务系统100和200的示例性框图,其中图2a的基于fpga的事务系统100的服务器系统包括与多个主机协作的多个fpga,而图2b的基于fpga的事务系统200的服务器系统仅包括多个fpga。图3a至图3c是示出了根据本公开的实施例的用于在基于容错fpga的事务系统中实现正好一次事务语义的方法300的示例性流程图。现在将参考图2a的系统100详细解释方法300的步骤。稍后将在说明书中解释图2b的实施例。尽管可以按连续的顺序描述处理步骤、方法步骤或技术等,但是这样的处理、方法和技术可以被配置为以交替顺序工作。可以经由一个或多个适当的接口(例如,应用程序接口(api))执行至少一些步骤。

根据本公开的实施例,图2a的基于fpga的事务系统100表示基于fpga的事务系统,其包括多个fpga和多个主机,作为在服务器处实现的中间件框架的一部分。在本公开的上下文中,可以注意到,对fpga的任何引用指示出可以托管一个或多个fpga的fpga卡以及在下文中称为fpga的易失性存储器的内部存储器。每个主机都具有实现为键值存储器的非易失性存储器和易失性存储器。存储器可以包括本领域中已知的任何计算机可读介质,包括例如易失性存储器(诸如静态随机存取存储器(sram)和动态随机存取存储器(dram))和/或非易失性存储器(诸如只读存储器(rom)、可擦除可编程rom、闪速存储器、硬盘、光盘和磁带)。在本公开的上下文中,表达“存储器”和“存储”可以互换使用,并且对“数据库”的任何引用意味着被托管在“存储器”上的数据库。客户端上可能还存在中间件框架,以支持正好一次语义和容错要求。在本公开的上下文中,表达“正好一次语义(exactly-oncesemantics)”和“正好一次事务语义(exactly-oncetransactionsemantics)”可以互换使用。在任何实施例中,客户端处的中间件框架可以用软件实现。在实施例中,客户端和服务器之间的连接可以以标准tcp/ip网络堆栈的形式建立。在实施例中,可以在最低层处使用以太网。

根据本公开,在不牺牲软件平台中存在的进程间通信的延迟的情况下,fpga作为平台的使用使能提取事务处理功能中可用的最大并行性。服务器和客户端之间预先建立的tcp连接消除了否则可能存在于事务系统中的握手延迟。以ddr、sram、fpga内部存储器或其组合形式托管在易失性存储器中的数据库也使能低延迟。

根据本公开,为了提供高可用性,确保组件的冗余。因此,从多个fpga,fpga中的一个被识别为主动(active)fpga,并且剩余的fpga被识别为被动(passive)fpga。多个fpga被配置为与多个主机和至少一个客户端协作。客户端与多个fpga中的每个建立传输控制协议(tcp)连接。在多个主机当中,主机中的一个被识别为主动主机,而剩余的是被动主机。客户端还与多个主机中的每个建立tcp连接。冗余确保了当组件之一发生故障时,事务处理自动地故障转移到多个组件的预定序列中的备用被动组件。多个组件的预定序列旨在确保被动组件之间不存在作为主动组件接管的冲突。根据本公开,为了实现冗余,应用状态需要确认确定性执行。除了稍后在描述中讨论的其他状况(诸如有序锁定)外,有必要使进入每个被复制组件的事务序列相同,以实现跨组件的一致性,从而实现真正的冗余和高可用性。

根据本公开,无论任何发生故障,为了支持正好一次事务语义,下文中描述的方法和系统确保了客户端应用程序获得以其为目的的消息正好一次,其中消息中没有间隙,并且无关乎任何故障而没有消息递送两次。因此,本公开的基于fpga的事务系统提供具有以下属性的正好一次语义:

-传入请求的最多一次执行

-没有虚构响应

-没有重复的响应

-响应的至少一次接收正好一次属性跨越其中组件可用或不可用的状态,即如果组件发生故障并且然后恢复,则它应该返回到在故障之前的确切的事务状态。

为了实现正好一次语义,在发送或传输之前将消息记录到非易失性存储器中。这适用于客户端和服务器两者。如果接收方未接收到消息,则可以查询日志以检索并重新发送该消息。只有在确定出客户端应用程序已经消耗了事务的响应(客户端通过发送确认来通知)时,才会删除日志中的条目。在这种正好一次实现中的事务放缓,延迟和吞吐量受到服务器端非易失性存储的i/o速度的限制。非易失性存储技术的速度比易失性存储技术低10倍。此外,所有组合的客户端的事务率务必由服务器支持,并且这可能导致严重的处理瓶颈并且可能影响事务系统的性能。因此,根据本公开,代替写入非易失性存储器,可以对易失性存储器进行写入,并且进一步可以通过在由其相应处理组件控制的两个或更多个单独的易失性存储器中并行写入相同的消息来复制该写入。然后,所有组件的易失性存储器可以具有相同的内容并且可以并行更新。如果由于某种原因,其中一个处理组件发生故障,则其他组件中的数据可以是可用的并用于继续处理,并且从而证明所述的复制用作对非易失性存储器的写入。因此,冗余提供的高可用性可以抵御故障。再者,在使用非易失性存储器时,这种对故障的弹性可用于在故障情况下掩盖以进行恢复。此外,并行性的使用可以在提供容错的同时获得性能。

事务系统的故障还包括客户端故障。为了确保正好一次语义,即使客户端应用程序发生故障,也应该在消息方面看到相同的状态。递送给客户端应用程序的消息不应丢失或重复。此外,客户端需要能够查询和检索先前的事务和通知,这意味着事务系统需要能够存储和检索它们。在本公开的实施例中,客户端中间件支持恢复以使事务为正好一次。一旦应用程序将消息传递给客户端中间件,消息就会在生成序列号之后并在通过tcp向fpga发送确认(tcp确认-在数据包级别的客户端和服务器之间)之前记录到存储器。在崩溃后重新启动时,客户端中间件会检查其请求和响应日志。所有没有匹配响应的请求都会再次发送到fpga。然后,fpga检查主机并发送已在主机处提交的响应并处理其他传入请求,并将响应发送回客户端。在实施例中,为了高性能,客户端可以使用非易失性存储器来写入,如具有10微秒的存储器访问延迟的intel'stm3d交叉点。根据本公开的实施例,为了支持先前事务的查询,需要最终将所有消息写入非易失性存储器。

根据本公开,当以高性能模式持久化以调谐事务消息和通知消息被持久化到非易失性存储器下的间隔时,可以引入可配置延迟。理想情况下,该值应设置为尽可能低,以帮助将从高性能模式到保守模式的切换时间减少到尽可能低。这样,系统更接近于递送正好一次语义。这个值可能增加的唯一原因是能够批量处理大量事务和通知,以实现持久化到非易失性存储器的高效率。当传入的事务速率非常高时,这可能是必要的-在这种情况下,此设置的低值可能意味着将写入队列延迟添加到事务延迟。

图4a是根据本公开的实施例的图2a的基于fpga的事务系统100的示例性架构。如图4a中看到的,提供了组件的冗余以实现高可用性。尽管示例性架构表示一定数量的组件(冗余因子m),但是可以理解,该数量仅是代表性的并且可以根据需要进行配置。为了便于描述,下文中的描述可以限于附图中示出的组件的数量。由于基于fpga的系统需要基于主机cpu的系统对电源、配置和其他管理任务的支持,因此需要主机。对于某些网络,诸如外围组件互连高速(pcie),这可能是强制性要求。可替选地,如果fpga可以提供这些任务,则可以从架构中删除主机以提供没有主机的架构,如图2b中示意性示出的。根据本公开的方法300的步骤302,从至少一个客户端到每个fpga建立tcp连接,并且每个主机(图4a的示例性图示中的一个客户端)和消息在其间传输,其中每个消息包括来自客户端的传入请求或重新提交的请求,以及(a)响应或(b)该响应和到客户端的一个或多个通知,并且其中传入请求和对应的响应表示如图1示出的事务。在本公开的上下文中,重新提交的请求是由服务器应用程序的并发执行引起的,如稍后在说明书中所解释的。

在图4a中,主机p和主机s分别指的是主要主机或主动主机以及次要主机或被动主机。fpgapp指的是主动fpga并且与主机p相关联。fpgaps指的是第一被动fpga并且与主机p相关联。fpgasp是第二被动fpga并且与主机s相关联。在实施例中,fpgaps位于fpgapp附近,并且因此其与fpgapp的通信与fpgasp相比具有更低的延迟。基于fpga的事务系统100通过tcp/ip/以太网网络堆栈与如示出的客户端进行对接,该tcp/ip/以太网网络堆栈终止于对应的fpga卡上。每个fpga卡和主机可以配置有ip地址和端口。当基于fpga的事务系统100启动时,客户端配置有所有3个fpga卡和所有2个主机的ip地址和端口。客户端开始与fpgapp通信。如果通信发生故障,则客户端开始与fpgaps通信,并且在fpgaps发生故障时,客户端会尝试与fpgasp进行通信。客户端通过tcp连接与fpga和主机通信,并且因此,从客户端到服务器至少存在5个tcp连接。根据实施例,客户端和fpga之间的连接用于在正常稳态场景下发送请求、接收响应和通知。客户端和主机之间的连接用于在临时客户端恢复场景期间重新发送先前的响应和通知(如果有的话)。客户端还可以使用与主机的连接来查询持久化到主机的非易失性存储器中的先前事务消息和通知。取决于主机和客户端之间的查询流量,基于fpga的事务系统100还可以被配置为在稳态场景期间从主机向客户端发送消息。

根据本公开,客户端与主动和被动fpga以及主动和被动主机同时维持连接。虽然只有使用主动fpga和主动主机才能进行主动通信,但其他连接仍保持待机状态,以便在任何主机或fpga发生故障的情况下进行快速故障转移。

除了上面提到的5个tcp连接之外,还可以存在用户数据报协议(udp)多播组,其用于以低延迟从服务器端向客户端发送控制消息。由于udp是有损协议,因此控制消息也作为备份跨tcp连接发送。

取决于图4a的示例性体系结构中的5个服务器端组件的可用性,基于fpga的事务系统100可具有2种功能状态,即可用和不可用。在可用状态中,当所有5个服务器端组件都启动并且所有5个端点的任何配对之间存在网络连接时,还可以存在完全可用状态。在本公开的上下文中,表达“端点(endpoint)”指的是服务器端的fpga或主机,并且还可以互换地称为“组件(component)”。在可用状态中,当一个主机和一个fpga在它们之间具有完全网络连接的情况下启动并且运行时,还可以存在部分可用状态。在不可用状态中,可以存在比部分可用状态更多的组件故障,或部分可用状态中端点之间的连接丢失。

根据本公开的方法300的步骤304,取决于多个主机中的可用主机的数量,基于fpga的事务系统100可以基于预先配置的模式切换阈值(k)在高性能操作模式和保守操作模式之间切换操作模式,其中1<k<=m。在实施例中,高性能模式涉及将消息保存在与多个主机中的每个相关联的易失性存储器中,并且之后将其(在端点之间的)内部确认发送到多个fpga中的对应fpga。在实施例中,保守模式涉及将消息保存在与多个主机中的每个主机相关联的非易失性存储器中,并且然后将其内部确认发送到多个fpga中的对应fpga。

根据本公开的方法300的步骤306,当高性能操作模式切换到保守操作模式时,可以将消息从易失性存储器保存到多个主机的非易失性存储器中。如前面提到的,多个主机与客户端通信。根据本公开的方法300的步骤308,将(a)响应或者(b)响应和一个或多个通知发送到至少一个客户端可以被延迟直到在切换时段期间将相关联的消息保存到非易失性存储器中结束为止,或者基于预先配置的时间延迟,以确保多个主机接收传入请求而不是在传入请求之前到达多个主机的相关联的重复请求。稍后在描述中解释重复请求的检测,并且可以注意到,重复请求和传入请求从两个不同的fpga单元发送到主机,并且像这样,重复请求可能在传入请求之前到达主机。步骤308引入的延迟解释了这个方面。根据本公开的方法300的步骤310,可以延迟向多个fpga发送内部确认,直到将相关联的消息保存到非易失性存储器中结束为止。

图4b是根据本公开的实施例的图2a的基于fpga的事务系统的另一示例性架构。多个fpga和多个主机可以通过以下中的任一个连接(i)外围组件互连高速(pcie)网络、(ii)pcie和infiniband网络的组合、或(iii)通过融合以太网的远程直接存储器存取(rdma)(roce)网络和infiniband网络的组合

图4b中的逻辑交换机(交换机p)可以在不失一般性的情况下利用交换机和链路的集合代替,以实现物理表现。在实施例中,一些物理实现包括:主机p、fpgapp和fpgaps可以经由pcie连接。同样,主机s和fpgasp也可以经由pcie连接。fpga卡可以插入相应主机的pcie插槽中,或它们可以插入具有pcie插槽的pcie扩展盒中。在另一个实施例中,fpgapp和fpgaps可以经由infiniband或以太网或pcie连接到主机s和fpgasp。在实施例中,如果主机基于ibmtmpower8,则通过pcie的opencapi可以是用于代替通过pcie的dma的更高层协议,这是默认的。

图5是根据本公开的实施例的构成图2a的基于fpga的事务系统的fpga的示例性微架构。多个fpga中的每个包括如下文描述的各种功能单元。

改进式传输控制协议单元(mtcpu)被配置为,由活动fpga的mtcpu,从与基于fpga的事务系统100的服务器端处的多个fpga和多个主机进行通信的客户端,而接收对应于传入请求的tcp数据包。tcp数据包被附加至少一个时间戳作为非确定性参数。主动fpga的mtcpu将tcp数据包发布到被动fpga,并且在由被动fpga接收到tcp数据包的内部确认后,将传入请求的内部确认发送到客户端。主动fpga的mtcpu还被配置为调度传入请求以及由fpga托管的应用程序的并发执行引起的重新提交的请求,其中重新提交的请求优先于传入的请求。后面在说明书中引用的图6b中还示出了对请求的重新提交。mtcpu还被配置为:通过准备对应于(a)响应或(b)响应和一个或多个通知的tcp数据包,使得一旦从多个主机接收到内部确认,就可以将准备好的tcp数据包发送到客户端,来优化性能。根据本公开的方法300,不等待内部确认并且然后准备tcp数据包有助于实现低延迟。

消息解析单元(mpu)被配置为检测基于相关联的请求标识符接收到的重复请求。从mtcpu按序列接收到的tcp数据包被解析并转换成与客户端与多个fpga和多个主机之间的网络(线路)相关联的消息格式。然后,以消息格式的传入请求在接收到的序列中被传递给事务处理单元(tpu)。

tpu被配置为托管以下应用程序,其处理来自mpu的传入请求和重新提交的请求以及(a)响应或(b)响应和用于发送到事务提交单元(tcu)的一个或多个通知。tpu还接收由应用程序的并发执行引起的重新提交的请求,并将重新提交的请求发送到mtcpu以经由mpu进行调度。

事务提交单元(tcu)被配置为接收(a)响应或(b)响应以及从tpu发送的一个或多个通知。包括传入请求或重新提交的请求和相关联的(a)响应或(b)响应和一个或多个通知的消息由tcu生成并发送到多个主机以用于提交或发送到客户端。根据本公开,可以由fpga的mctpu执行向客户端发送消息;然而,如果主机和客户端之间的查询流量减少,则基于fpga的事务系统100可以被配置为避免跳到fpga并且一旦提交消息就直接将该消息从主机发送到客户端。

监视单元(mu)被配置为在检测到主动fpga故障的情况下监视并发起fpga故障转移过程。

图6a是根据本公开的实施例的在主动fpga内处理不需要重新提交的事务的消息的示例性序列。箭头指示出处理消息的序列对于不需要重新提交的事务从tcp/ip/以太网接口的入口经历到出口。在被动fpga中,mpu从主动fpga的mtcpu接收数据包(tcp流)。被动fpga中的其余处理与主动fpga中的处理相同。

图6b是根据本公开的实施例的对于在主动fpga内已经重新提交的、重新调度的并在重新提交之后提交的事务的处理消息的示例性序列。箭头示出了由驻留在tpu中并由mtcpu重新调度的应用程序重新提交传入请求并在重新提交后提交的序列。当服务器端应用程序实现在处理开始时其不知道的新的锁定依赖关系时,会发生由该服务器端应用程序重新提交请求。在被动fpga中,从主动fpga的mtcpu接收重新提交的请求以及传入请求。

现在描述涉及根据本公开的方法和系统实现的容错,以确保即使一些组件发生故障也能继续操作。根据本公开的实施例,容错操作涉及通过在其间提供的低延迟高带宽互连链路上将消息的多个拷贝制作到多个端点而实现的消息接收中的容错。考虑到fpga中的并行性,本公开使能在没有大量时间开销的情况下制作多个消息拷贝。当传入请求在以太网(或tcp/iup)链接上递送时,请求将并行拷贝到多个位置。在图4a的示例性架构中,除了其自己的ddr或内部存储器之外,fpgapp中的mtcpu还将输入请求拷贝到fpgaps和fpgasp(通过pcie或rdma)。使用rdma或pciedma的经修改的无锁发布-订阅机制可用于将对应于来自以太网的传入请求的tcp数据包拷贝到用于每个客户端连接的fpgapp存储器、fpgaps和fpgasp存储器中。在从拷贝上的传输层到存储器的内部确认之后,将对传入请求的tcp确认发送到客户端。多个拷贝确保了如果fpgapp出现故障,则在fpgaps或fpgasp中该消息是可用的。因此,消息一旦向发送方(客户端)确认就永远不会丢失。一旦fpgapp仅具有一个pcie连接,则为了通过pcie技术并行拷贝到fpgaps和fpgasp,可以在本公开的系统100的实施例中使用如pcie交换机中可用的dma多播的技术。根据另一个实施例,可以使用从fpgapp到fpgaps和fpgasp的多个infiniband(物理)连接来使能多个拷贝。fpga的tcp堆栈(mtcpu)与所有fpga上的消息解析单元(mpu)进行对接,其中主要输出包括:可用数据的信号发送;客户端连接标识符——其标识已发送数据的连接(客户端ip地址和端口);和传入的消息内容。tcp堆栈(mtcpu)严格按照以太网链路上记录的顺序输出应用程序有效负载的字节流。在fpga上实现的服务器端的中间件负责解析tcp数据包并将它们转换成用于事务处理的消息,如上面参考图5描述的。一旦检测到完整的消息,它们就会被传递(排队)到tpu。正是来自多个客户端的主动fpga中出现的这种tcp数据包的顺序决定了数据库在任何时刻的状态。

图7a是根据本公开的实施例的当处理不需要重新提交的事务的消息时消息接收中的容错的示例性操作序列。图中指示的序列号示出了如下面提到的步骤。

1.mtcpu接收与传入请求相对应的tcp数据包。

2.通过pciedma/infinibandrdma将消息拷贝到fpgaps和fpgasp中的mpu并且通过无锁pubsub机制拷贝到fpgapp中的mpu(以及图7b中解释的非确定性函数的结果)。

3.来自订阅者的确认(无锁pubsub排队机制的一部分)。

4.tcp确认发送回客户端。

5.tcp数据包解析并发送到tpu(可以与步骤3和4并行)。

图7b是根据本公开的实施例的当处理已经重新提交的事务的消息时用于消息接收中的容错的示例性操作序列。图中指示的序列号示出了如下面提到的步骤。

1.应用程序(tpu)重新提交请求并将消息排队到mpu。

2.mpu存储重新提交的请求并将其与客户端标识符相关联,并且请求标识符是序列号,并且在主动fpga中将其传递给mtcpu。

3.配置的延迟后,mtcpu将重新提交的请求发送给所有fpga中的mpu。tcp数据包附加有至少一个时间戳作为非确定性参数。

4.基于客户端标识符和请求标识符,mpu检索重新提交的请求,并将其与由主动fpga转发的非确定性参数一起传递给tpu。如果语义需要它们,则期望应用程序使用这些参数。

5.成功处理重新提交的请求后,响应和通知(如果有的话)将传递给tcu。

根据本公开的实施例,容错操作涉及来自客户端的重复请求检测。如前面解释的,客户端中间件使用客户端标识符和请求标识符来标记每个传入请求。

同样,对应的响应利用请求标识符标记,并且对应的通知利用唯一的通知标识符标记。根据本公开,在客户端中间件生成请求标识符之后,它在发送到服务器(fpga)之前持久化消息。在接收到来自服务器的响应后,客户端中间件持久化该响应。一旦客户端处的应用程序确认该消息,则删除请求和响应。每个传入请求都存储在键值存储器中,其中客户端标识符和请求标识符作为键。请求标识符是唯一的序列号,还记录从客户端接收到的最大序列号。如果客户端在发生故障后恢复,则可能会丢失接收到的一些响应但在其被持久化之前发生故障。结果,客户端可以重新发送它没有得到响应的所有请求。根据本公开的方法300的步骤312,多个fpga检测来自客户端的重复请求(如果有的话)。当服务器端接收到请求时,如果请求标识符在列表中不可用并且如果相关联的序列号比从客户端接收到的最大序列号更大,则它首先检查请求标识符并将其附加到在多个fpga中的每个fpga中维持的请求标识符的列表中。如果请求标识符在列表中可用,则其处理正在进行中并且请求被丢弃或被忽略。然后,从应用程序获得相关联的响应和可选的一个或多个通知,并将其发送到多个主机,随后从列表中删除相关联的请求标识符。然后,取决于操作模式,将请求连同相关联的响应以及可选地由多个主机接收到的一个或多个通知存储在适当的键值存储器中。如果相关联的请求标识符在请求标识符列表中不可用,并且如果它小于从客户端接收到的最大序列号,则该请求被检测为重复请求,而不是处理它,多个fpga将其传递给多个主机以用于从多个主机中的键值存储器检索响应和可选的一个或多个通知,然后将其发送到客户端或特别是客户端中间件。在接收到关于消耗响应的确认以及可选地客户端的一个或多个通知之后,在保存在非易失性存储器中之后,从多个主机的易失性存储器中删除该消息。

根据本公开的方法300的方法的步骤314,如果在来自客户端的预先配置的时间内没有接收到关于一个或多个通知的接收的确认,则一个或多个通知作为正好一次语义的一部分被重新发送到客户端。

如果务必利用冗余实现可用性,则应用程序状态(或其数据库状态)需要确认确定性执行。为确保每个数据库的状态一致,进入每个复制的组件的事务序列必须是相同的。只有这样,当活动组件发生故障时,才有可能故障转移到冗余组件。否则,复制是没有用的。根据本公开的实施例,容错操作涉及通过实现有序锁定跨所有具有相同数据库状态的fpga的复制消息处理。如果对应于传入请求的tcp数据包以相同的序列发送以用于跨所有fpga进行处理,并且如果fpga依次按序列处理消息,则所有fpga与来自客户端的传入请求的接收处于相同的状态。在实践中,有序锁定典型地通过要求事务在进入系统时立即请求所有相关联的锁定来实现(通过服务器应用程序),尽管存在可能是不可能的事务类。如果应用程序需要同时处理消息,则可能发生这种情况。如果应用程序语义允许每个事务以先入先出(fifo)顺序访问其锁定依赖关系,则可以跨每个fpga实现复制状态。换句话说,稍后发布的事务不应该比先前发布的事务更早地访问锁定的数据。锁定授权的这种排序需要由应用程序确保。根据本公开,一旦应用程序获知依赖关系作为事务的部分执行的一部分,就需要重新提交事务。因此,每次应用程序获知新的锁定依赖关系时,方法300提供api以重新提交事务。每次务必重新提交事务时,它都会回滚并安排在下一批要执行的事务中(通过mtcpu),其优先于传入的请求。在客户端应用程序获知其所有锁定依赖关系后,事务最终会提交或中止。

根据本公开的方法300的步骤316,容错操作涉及实现高可用性。首先,通过将多个fpga中的一个识别为主动fpga并将多个主机中的一个识别为主动主机来实现冗余,来自多个fpga和多个主机中的剩余的fpga和剩余主机分别被识别为被动fpga和被动主机。任何故障都必须尽快向管理员发出警报。监视策略由两部分组成-主动fpga监视和专用于监视的主机。主动fpga监视还具有2倍监视策略。如果在预设心跳阈值内存在任何事务,则无需心跳来确认组件是否活动。根据本公开,心跳因此是自适应的。只有在预设心跳阈值内多个主机和多个fpga之间没有内部消息的情况下,主动fpga中包含的mu才会向被动fpga和多个主机中的每个发起心跳请求,其另外充当指示分别在多个fpga和多个主机内的活动fpga和活动主机的心跳。然后,主动主机(监视服务器)更新活动fpga和活动主机的列表,并将其发布到每个组件中。在实施例中,监视服务器是在主动主机中运行的软件组件。如果在预设心跳阈值内没有事务,则主动fpga将心跳请求发送到所有端点,等待针对所有端点的某个预设心跳阈值去恢复,并向监视服务器报告心跳响应的状态。监视服务器配置为在开始时与主机p一起运行。它主动检查自身与主机s和被动fpga的连接性。

根据本公开的实施例,如果客户端经由被动fpga触发fpga故障转移或者如果监视服务器在预设心跳阈值内未从主动fpga接收到指示其故障的心跳请求,则向下一个被动fpga发起fpga故障转移过程。来自多个fpga的预定序列并且在活动fpga和活动主机列表中发布的下一个被动fpga被识别为下一个主动fpga。

根据本公开的实施例,当确定下一个被动fpga将切换到主动fpga时,可以引入可配置的时间延迟。由于fpga故障转移由所有被动fpga执行,因此被动fpga可能也会在fpga故障转移期间崩溃。因此,主动主机可以被配置为等待特定时间以确认来自fpga的故障转移结束。在此时间内,如果默认下基于预定序列要选出作为主动fpga的下一个被动fpga不发送确认,则主动主机以预定序列指定下一个被动fpga,以接管作为主动fpga。

根据本公开的实施例,在任何被动主机在预设心跳阈值内未从主动主机接收到指示其故障的心跳请求的情况下,主机故障转移过程由来自多个主机的预定序列的被动主机发起。来自多个主机的预定序列的并且在发起主机故障转移过程的活动fpga和活动主机的列表中发布的被动主机被进一步标识为下一个主动主机。

根据本公开的实施例,主动fpga的mu被配置为基于由监视服务器发送的、在fpga故障转移过程和主机故障转移过程期间使用心跳确定出的活动主机和活动fpga的列表来立即终止等待内部确认或与附加主机和fpga的故障有关的消息。

根据本公开的方法300的步骤318,实现每个事务的确定性执行以确保以相同的序列将请求发送到所有复制的组件。首先,由mtcpu附加对应于传入请求的tcp数据包,至少具有时间戳作为非确定性参数,其中准备好的tcp数据包构成消息的至少一部分。可替选地,一个或多个消息可以被包括在准备好的tcp数据包中。然后,主动fpga的mtcpu将tcp数据包发布到被动fpga,并且然后一旦接收到由被动fpga接收到tcp数据包的内部确认,就将传入请求的tcp确认发送到客户端。如果接收到由应用程序的周期性执行引起的重新提交的请求,则只有请求标识符以及重新提交的请求的非确定性参数由主动fpga发布到被动fpga。重新提交的请求作为键值存储器而存储在fpga的易失性存储器中,并被调度为与传入请求一起执行但具有更高的优先级。根据本公开,可以提供可配置的执行延迟以考虑可能仍然保持重新提交的请求所期望的锁定的事务。

根据本公开的实施例,容错操作涉及在系统100的两种操作模式中实现事务的提交。在高性能模式中,消息被发送到主机p和主机s。这使用发布-订阅fifo机制来实现。这里的订阅者是主机p和主机s,并且发布者是主动fpga(fpgapp)。订阅者在其收到消息后立即确认消息,并将该消息保存在非易失性存储器中。当收到消息的所有内部确认时,发布者fpgapp将响应和可选的一个或多个通知发送给客户端。主机接收来自所有fpga的消息,并保存从任何fpga接收到的消息,并丢弃从其他fpga接收到的相同消息,但内部确认被发送到所有fpga。这些消息稍后(异步地)持久化到非易失性存储。这也以低延迟实现了高吞吐量。在保守操作模式中,唯一的活动主机可以是主机p或主机s。一旦从多个fpga接收到响应和可选的一个或多个通知,则其在被确认回之前首先被写入非易失性存储。这样可以确保如果最后剩余的主机发生故障,则事务和消息永远不会丢失。在这种情况下,主机也首先持久化从任何fpga接收到的消息,并丢弃从其他fpga接收到的相同消息,但内部确认被发送到所有fpga。类似的提交策略也用于通知。

图8是根据本公开的实施例的当两个主机是活动的时用于事务的提交中的容错的示例性操作序列。在主动fpga的tpu中处理请求后,消息被转发到主机p和主机s。该消息被传递到mtcpu以准备tcp数据包,并且一旦接收到来自主机的确认就发送,从而优化性能。这适用于响应消息和通知。在示出的示例性场景中,除响应之外还生成一个通知。图中指示出的序列号示出了如下面提到的步骤。

1.tpu执行事务。

2.tpu向生成响应的tcu发出信号,并通过无锁定队列将其发布到主机p和主机s。

3.tcu处理作为此事务的一部分而产生的其他异步操作(通知)。

4.tpu向生成通知消息的tcu发出信号,并通过无锁定队列将其发布到主机p和主机s以进行通知。

5.tcu将消息发送到mtcpu。

6.主机p和s在接收到消息后立即对消息进行确认(与5并行)。它将接收到的消息保存在易失性存储器中。

7.在接收到确认后,mtcpu将tcp数据包转发到客户端中间件。

图9是根据本公开的实施例的当一个主机是活动的时用于事务的提交中的容错的示例性操作序列。在主动fpga的tpu中处理请求后,消息将转发到主机p或主机s(无论哪个是活动的)。一旦接收到消息后,主机会在确认接收到发送给fpga的消息之前将消息写入非易失性存储器。同时,消息被传递到mtcpu以准备tcp数据包,并且一旦接收到来自主机的确认就发送,从而优化性能。这适用于响应消息和通知。在示出的示例性场景中,除响应之外还生成一个通知。图中指示出的序列号示出了如下面提到的步骤。

1.tpu执行事务。

2.tpu向生成响应的tcu发出信号,并通过无锁定队列将其发布到主机p或主机s。

3.tcu处理作为此事务的一部分而产生的其他异步操作(通知)。

4.tpu向生成通知消息的tcu发出信号,并通过无锁定队列将其发布到主机p和主机s以进行通知。

5.tcu将消息发送到mtcpu。

6.主机p或主机s将消息写入非易失性存储。

7.主机p或主机s确认该消息。

8.在接收到确认后,mtcpu将tcp数据包转发到客户端中间件。

步骤5与步骤6和步骤7并行执行。

根据本公开的实施例,容错操作涉及实现客户端通知中的容错。多个fpga通过tcp连接将响应和可选的一个或多个通知发送到客户端。客户端中间件接收来自所有fpga的响应和可选的一个或多个通知,但是仅第一个接收到的响应和可选的一个或多个通知被传递到客户端应用程序而其他由于重复而被丢弃。这使能低延迟响应递送以及容错。在实施例中,用于发送响应和可选的一个或多个通知的tcp连接可以与由客户端使用以通过tcp/ip/以太网接口向fpga发送请求的tcp连接相同。

图10是根据本公开的实施例的用于客户端通知中的容错的示例性操作序列。如讨论的,两个fpga都通过tcp/ip向客户端发送消息。客户端中间件获取到达的第一条消息并将其传递给应用程序。来自其他fpga的其余消息被丢弃。

根据本公开的方法300的步骤320,为了在主动fpga故障转移期间维持跨多个fpga和多个主机的一致状态,解析由多个fpga中的每个fpga内的mpu从主动fpga的mtcpu接收到的所有tcp数据包。由多个fpga丢弃不完整的消息。主动fpga的mpu将由被动fpga接收到的tcp数据包数量与主动fpga中的tcp数据包数量进行比较,并且丢失的tcp数据包从主动fpga拷贝到被动fpga,并且然后发起如前面解释的多个fpga中的重新提交的消息的处理。

图11是根据本公开的实施例的示例性可用性监视的图示。箭头指示心跳请求的启动器(initiator)。所有心跳启动器都将其心跳结果发送到为主机p的监视服务器。如果主机p出现故障,则主机s接管为监视服务器。主动fpga(以处于完全可用状态的fpgaps开始)示出为发起大多数心跳消息。心跳中的被动端点具有相同的作用-如果它们不发起心跳,则它们期望接收心跳消息,并且如果它们没有接收到心跳消息,则它们会向监视服务器发出警报。主动主机(以处于完全可用状态的主机p开始)最初配置为监视服务器。如果它发生故障,则主机s接管为监视服务器。它还配置为向除主动fpga之外的所有端点发起心跳请求。如果监视服务器在预设心跳阈值内没有从主动fpga获得心跳请求,则它发起fpga故障转移过程到下一个被动fpga,在其最后它将被激活。类似地,如果被动主机在预设心跳阈值内没有从主动主机获得心跳请求,则它发起主机故障切换过程,使其自身成为主动主机。

可以注意到,为可配置变量、预设心跳阈值设置低值有助于快速检测故障,但同时可能导致可能干扰事务和通知流量的许多心跳消息。预设心跳阈值的功能可以总结如下。

1.由主动fpga使用,以决定是否以及何时向其他端点发送心跳请求。

2.用于间隔由主动fpga和主动主机发送的连续心跳请求。

3.如果在此阈值间隔内未收到心跳,则由主动主机和被动主机使用以分别检测主动fpga和主动主机的可用性。

4.在进行故障转移过程之前,由被动fpga使用以检查主动fpga的可用性。

图12是根据本公开的实施例的当主动fpga发生故障时采取的示例性恢复动作的图示。图中指示出的序列号示出了如下所述的步骤。

1.客户端检测到与主fpgapp通信发生故障。

2.客户端向fpgaps和sp发送故障转移请求消息。

3.fpgaps和fpgasp通过客户端网络(tcp/ip/以太网)使用fpgapp发起心跳序列。(如果心跳成功,则fpgaps会相应地通知客户端-客户端尝试再次与fpgapp连接)。

4.如果心跳不成功,则fpgaps和sp将针对fpga故障转移过程的开始而发信号。此消息作为广播通过服务器端低延迟网络发送到所有端点。

5.通过tcp并且另外地通过udp多播将故障转移消息发信号到所有客户端(下一步无需等待此步骤完成)。

6.fpgaps和sp将传入的fifo队列处理到其mpu,以便完全处理。

7.fpgaps使用fpgasp检查其mpu已处理的消息数。(tcp数据包-最多两个fpga的区别在于一条消息)。如果fpgaps具有一个额外的tcp数据包,则它会将该数据包传递给fpgasp,或反之亦然。

8.fpgaps和fpgasp针对故障转移阶段结束而发信号。此消息作为广播通过低延迟网络发送到所有端点。此消息包含由每个客户端提交的最后一个消息序列号。

9.主机p向fpgaps已接管为新的主动fpga的所有端点发送广播消息。

10.fpgaps使用fpgasp设置发布-订阅者(或点对点,只有一个订阅者)队列。

11.如果仍存在任何重新提交的请求挂起,则新的主动fpga会将它们推送到其mtcpu进行处理,从那里恢复正常处理。

12.一旦所有重新提交的结果都完成处理,fpgaps就将接管为主设备,并通过fpgaps和sp两者将其通告/广播给所有客户端。

13.客户端将请求发送到fpgaps,现在它是主动服务器(tcp连接已经存在-因此消除了握手延迟)。这未在图12中示出。

在上面呈现的场景中,客户端在检测到它无法与fpgapp通信后发起故障转移。

如果主机p首先检测到故障并且开始故障转移,则在这种情况下,步骤序列从步骤5开始,并且依此类推完成。在这种情况下,主机p针对主动故障转移阶段的开始而发信号。如果fpgapp无法与甚至主机之一或甚至其他fpga之一通信,则它将通知客户端尝试故障转移到其他fpga。恢复正在进行时可能会发生另一次故障。假设不存在客户端故障,则存在四种可能的故障-fpgaps、除fpgaps之外的任何其他端点、端点之间的内部连接或从客户端到fpgaps的连接。

如果fpgaps发生故障,则已知客户端也已将故障转移请求发送到fpgasp。当fpga故障转移正在进行时,监视主机通过心跳机制实现fpgaps已发生故障。如果在主动fpga选择之前检测到故障,则监视服务器然后选择fpgasp作为主动fpga。在这种情况下,fpgasp接管并且操作正常进行。如果在已选择主动fpga时发生故障,则客户端中间件会超时并将fpga故障转移请求重新发送到所有被动fpga,在这种情况下,fpgasp也会接收到请求并重新发起故障转移序列。监视服务器还可以检测并向fpgasp发送控制消息以发起故障转移。

当其他端点(fpga或主机)发生故障时,如由监视服务器更新,对于对应的端点,针对内部确认的等待立即终止。如果主机p或s中的一个也发生故障,则除非切换活动完成,否则剩余主机不会确认事务,因此对传入消息和通知的响应会延迟。如果主机p在fpga故障转移期间已发生故障,则主机s在任何情况下都会得到所有消息。因此,在完成切换活动之后,主机s决定哪个fpga是主动fpga并相应地发送消息。

如果来自fpgaps的内部连接发生故障,则它通知客户端故障转移到其他fpga。

如果从客户端到fpgaps的连接发生故障,则存在冗余(在物理连接中)以防止这种情况。如果冗余物理连接发生故障,则需要手动纠正,之后客户端开始通信。根据本公开,即使发生这种情况,也可以处理所有消息正好一次。

在客户端发生故障的情况下,涉及恢复过程,其包括检索旧响应和通知消息。上面提到的广播可以使用pciedma多播和infiniband/roce在主机和fpga的服务器系统内最佳地实现。

通过使用点对点模式tcp连接在内部实现对客户端的广播,其中优先级给予已请求故障转移的那些客户端。在实施例中,还可以进行额外的udp多播,使得大多数客户端可以更快地接收消息。

主机的关键功能之一是保持所有事务和通知的记录。这些永远不会丢失是必要的。因此,fpga会向主机发送消息的拷贝,并在向客户端和管理员发送响应或通知消息之前等待其确认。因此,系统实现了高性能,这是因为在事务和通知处理期间不存在对所涉及的持久化存储的写入。在两个主机都是活动的状态下,冗余将作为持久化存储覆盖。在客户端确认消息或通知后,对持久化存储的写入异步发生。然而,如果主机之一发生故障,则存在这样的风险:当客户端可能接收到响应和通知时,主机上的另一个故障可能导致这些消息丢失。另一个主机(主动或被动)将更改功能,以在向fpga确认之前同步提交每个事务和通知。下面提供了当最后一个剩余主机意识到它是最后一个主机时在最后一个剩余主机上更详细的步骤序列。

1.停止对fpga的事务和通知的所有即时确认。

2.将易失性存储器中的所有事务和通知持久化到非易失性存储器。

3.完成后,只有在将消息持久化到非易失性存储器后才能将所有确认发送到fpga。

重要的是,第二主机在第一主机的故障与直到最后的存储器驻留事务和通知被持久化到非易失性存储器中(以避免易失性存储器中的消息丢失)的时间之间的间隔中不会发生故障。然而,该时间间隔可以设计得尽可能低。在本公开的实施例中,服务器可以设置有备用电池;然后,由电池提供的剩余时间可用于将缓冲的消息持久化到非易失性存储器。

图13是根据本公开的实施例的当主机发生故障时的示例性事件序列的图示。图中指示出的序列号示出了如下面提到的步骤。

1.客户端向fpgapp发送请求消息。

2.fpgapp将请求拷贝到fpgaps和sp。

3.主机p检测到主机s发生故障,并且它发起至同步模式的转换,该同步模式将数据从易失性存储器拷贝到非易失性存储器中。

4.pfppp、ps和sp处理消息发送请求以将事务提交给主机p。(对于这种情况,假设所有fpga已经接收到关于主机s发生故障的信息)。

5.主机p完成从易失性存储器到非易失性存储器的所有消息的持久化。

6.主机p持久化由fpga发送的事务提交消息,并返回fpga确认。

7.fpga将响应消息发送回客户端。

如果部分可用状态中还有一个端点故障,则系统变为不可用。如果最后一个fpga发生故障,则客户端无法发送或接收消息。如果最后一个主机发生故障,则fpga无法发送任何响应消息,并且系统也不可用。

图14是根据本公开的实施例的当客户端发生故障并且在恢复时发送已经提交的旧请求消息的示例性事件序列的图示。这可能在以下条件下发生。

1.主fpga正好在从客户端接收到tcp消息之后但在将确认发送回客户端之前发生了故障。

2.客户端崩溃、恢复、并且在恢复时发现没有接收到对某些消息的响应,并且因此重新发送具有未完成响应的请求消息。(这些消息是由系统发送的,但客户端中间件无法在客户端崩溃之前保存传入的响应和通知(如果有的话))。

图中指示出的序列号示出了如下面提到的步骤。

1.客户端向主动fpga发送请求。

2.主动fpga将与传入请求相对应的tcp数据包拷贝到被动fpga,并将确认(tcp级别)发送回客户端(确认-未明确示出)。

3.mpu检测到旧消息。然后,主动fpga将该消息发送给主机。

4.主机查找响应并将该响应直接传递给客户端。

5.客户端中间件采取第一个响应,丢弃重复项并将响应传递给应用程序。

被动fpga未在图中示出。在实施例中,客户端中间件实现计时器以跟踪请求的发送。当接收到响应后,它会取消计时器。如果时间到期,则它会尝试重新发送请求,并且在成功重新发送时,它会重新发起计时器。这个循环一直持续到接收到响应。另一方面,在服务器端,它适合检测重复请求,并且因此将适当地响应它。

图15是根据本公开的实施例的当由客户端处理确认时的示例性事件序列的图示。除了步骤4之外,客户端确认也遵循与图14中类似的流程。图中指示出的序列号示出了如下面提到的步骤。

1.客户端向主动fpga发送请求消息。

2.主动fpga将与传入请求相对应的tcp数据包拷贝到被动fpga,并将确认(tcp级别)发送回客户端(确认-未明确示出)。

3.mpu检测到这是确认消息。然后它将消息发送到live_hosts(主机p和主机s),其将消息标记为已确认。

图16是根据本公开的实施例的实现向客户端正好一次递送通知的一系列操作的图示。用于发送响应和接收确认的本公开的步骤还用于实现向客户端正好一次递送通知。不同之处在于它是服务器端应用程序,其发起通知。当在发送通知之前由fpga将通知提交给主机时,主机启动通知确认计时器。如果客户端应用程序在此计时器到期之前未确认接收到通知,则主机会重新发送通知。此循环一直持续到客户端最终确认通知为止。在客户端确认通知后,主机发送第二级确认以帮助客户端释放用于通知确认的资源。图中指示出的序列号示出了如下面提到的步骤。

1.所有fpga(上图中只示出了一个)向客户端中间件发送通知消息。

2.客户端中间件将通知消息传递给应用程序并丢弃重复项。

3.客户端应用程序确认通知消息。

4.客户端中间件将确认转发给主动fpga。

5.主动fpga将确认转发给主机。

6.主机发送第二级确认以使能客户端中间件清理用于通知的资源。

客户端中间件通过tcp连接与服务器系统通信。它与系统建立以下tcp连接。

1.一个连接用于向系统发送请求消息(从客户端到主动fpga)并且用于从主动fpga接收响应和通知(如果有的话)。

2.两个备用连接-每个被动fpga各一个。

3.两个主机连接-每个主机一个,用于接收较旧的响应消息和通知。它们也用于查询。如果查询流量减少,这些也可以用于接收响应和通知(如果有的话)。

根据本公开的实施例,本公开的框架支持任何类型的有状态应用。在实施例中,来自应用程序端的使用框架的要求如下:

1.可以经由一个或多个api执行至少一些步骤。

2.执行完成-进入系统的每个事务都需要继续完成,直到它提交或直到由于确定性程序逻辑而中止为止。在任何一种情况下,应用程序都需要使用事务请求的相同客户端标识符生成回到发起客户端的响应。

3.应用程序通过实现有序锁定来并发处理传入请求。需要严格按照其被请求的顺序授予锁定。如果在开始处理事务之前无法确定要锁定的记录,则应用程序需要中止事务,并且一旦确定出使用框架的api,就将请求重新提交到框架。一旦重新提交的事务被注入回系统中,则只有当因变量的值没有改变时,执行才会进行到完成。否则,它务必再次确定它需要锁定的记录,中止当前执行的事务并重新提交请求。可以如由框架api所提供的那样使用非确定性函数的值。在生成通知时,它还应以确定性顺序为每个客户端生成通知。当发送通知时,应用程序需要提供api,触发事务编号和在该触发事务(事务可以跨许多客户端生成许多通知)内生成的通知的序列号(确定性确定出的)。

图17是根据本公开的实施例的fpga卡的示例性框图。示出的实施例被设计成适合客户端所需的可用性、正好一次处理和性能要求。pcie插槽连接器使能将fpga板插入服务器或pcie扩展盒中的pcie插槽。以太网端口1和2用于通过tcp/ip/以太网连接到客户端。还提供了infiniband端口的配对、pcie电缆连接器端口的配对和以太网端口的另一配对。这些端口的仅一个配对可用于特定实现。其他三个配对用于连接端点(fpga和主机)。

图18是根据本公开的实施例的基于fpga的事务系统的示例性表示,其具有2个主机、3个fpga卡和2个客户端,都带有冗余网络连接。示出了2个网络,其中一个网络是以太网网络,其用于将客户端连接到服务器。第二个网络用于服务器组件内的通信。该网络可以是使用rocenic(通过聚合以太网的rdma)使能的infiniband、pcie或以太网。在所有情况下,pcie网络将fpga卡连接到主机。fpga卡安装在pcie扩展盒中,其中具有pcie开关(图中未示出)。在两个网络中,如果一个网络路径在任何两个端点之间下降,则通信将依赖于另一个端点。这两个网络也可以用于并行网络通信,这意味着进一步减少了延迟。每个端点与其连接的每个网络都具有2个连接。如果连接之一发生故障,则可以依赖于使用另一个连接。主机p被配置为包括主机和fpga端点的pcie网络的根集线器。如果它发生故障,则主机s接管为根集线器,其对fpga卡没有影响,这是因为pcie交换机支持此功能。

在实施例中,代替图17中示出的示例性fpga卡,可以使用诸如具有4个qsfp连接插槽的fpga卡的商用硬件。每个qsfp连接器可以连接到以太网网络(并使用roce进行通信)或infiniband网络,其中配置被编程到fpga中。因此,用于互连服务器系统组件的第二个网络可以是infiniband或以太网。

根据本公开的实施例,客户端中间件以软件实现。在实施例中,在多层应用的情况下,客户端本身可以是服务器。例如,在客户端处数据库服务器可以是web服务器,其聚合终端用户的某集合。在股票交易所交易应用程序中,客户端可以是网关服务器,其复用终端用户并向订单匹配服务器发送请求。可替选地,它们可以是高频交易服务器,其基于市场反馈生成请求并将该请求发送到匹配服务器。虽然可以如上面描述的实现服务器,但是客户端(其也是服务器)可能由于客户端中间件的持久化写入而变慢。这样的客户端也与服务器本身位于同一位置。根据本公开的实施例,以下是在这样的客户端的情况下可能的选项,其可以是服务器:

1.使用高速持久化存储技术。

2.以与服务器端的fpga持久化事务和通知相同的方式共享用在服务器端的主机以进行消息的持久化。这要求主机在不减慢任何操作的情况下有足够的资源来提供额外的工作负载。

3.不同于上面第2点那样与主机共享,具有主机的单独集合用于持久化消息。在实施例中,客户端本身可以在fpga上实现,其中客户端中间件也可以在fpga上实现。

根据本公开,主机的主要功能包括:

1.用作pcie网络中的根联合体(rootcomplex),其中主机cpu充当根联合体。

2.提供一种在更大的时间段内缓冲事务数据的装置,这是因为它们具有更大的存储器。

3.将事务和通知保留在存储中以便以后检索。

根据本公开的实施例,如图2b中示出的,系统200仅包括服务于主机功能的fpga,如先前并且参考系统100所解释的。fpga可以被配置为接管为根联合体,从而消除了对主机的需求。fpga卡可以配置有高存储器,并且如果可用存储器可以满足应用程序要求,则可以消除对主机的需求。此外,以作为pcie卡可用的非易失性存储器高速(nvme)形式的存储可以连接到pcie网络,这意味着fpga卡可以再次直接与其通信,从而消除了对主机的需求。消除主机的另一个原因可能是因为fpga本身具有在其中制造的cpu内核。图19a是根据本公开的实施例的没有主机的基于fpga的事务系统的示例性高级表示,并且图19b是没有图19a的主机的基于fpga的事务系统的示例性详细表示。可以注意到,系统设计和构造被简化而不需要主机。根据示出的实施例,主动fpga可以承担主动主机的附加角色,并且被动fpga可以在不损失功能的情况下承担被动主机的附加角色。

根据本公开,对于具有主机或没有主机的实施例,可以注意到增加冗余增加了可用性。在允许的成本内,期望具有尽可能大的m(m+1冗余)值。对于“具有主机”构造,将需要两个m值-一个用于fpga,并且一个用于主机。模式切换因子k的低设置倾向于将高优先级置于正好一次保守模式行为,而使用k的高值系统倾向于高性能模式行为。

在本公开的实施例中,可以供应具有存储的能量储备的备用电源,以在供应至基于fpga的事务系统的主电源发生故障的情况下使用。针对可靠的备用电源(诸如电池)的可用性,k的值可以设置为m。在这样的配置中,系统递送高性能,而同时支持正好一次事务语义。

可以注意到,增加m的值会增加通信要求。发布-订阅机制正在复制请求和响应消息。随着m的增加,订阅者数量增加并导致更高的通信开销,这可能会影响延迟。由于fpga实现使用了大量并行资源,因此这种开销最小(与软件平台相比),并且对于m的略低到中等值可以是可忽略不计的。发布-订阅的瓶颈的另一个来源可能是用于通信的物理端口的有限数量。理想情况下,需要有m个端口。使用交换机中可用的pciedma多播特征可以克服这个瓶颈。假定交换机具有针对pcie、infiniband或roce网络的较大数量的端口,则可以容易地扩展前面描述的硬件结构以支持更大的m值。根据本公开的实施例,fpga卡可以托管在可用的多个pcie扩展盒中,以通过电源隔离实现最大可用性。

书面描述描述了本文的主题,以使能本领域技术人员制造和使用这些实施例。主题实施例的范围由权利要求限定,并且可以包括本领域技术人员想到的其他修改。如果这样的其他修改具有与权利要求的字面语言没有不同的相似元素,或者如果它们包括与权利要求的字面语言无实质差别的等效元素,则这样的其他修改旨在落入权利要求的范围内。

应当理解,保护范围扩展到这样的程序,并且除了其中具有消息的计算机可读装置之外;当程序在服务器或移动设备或任何合适的可编程设备上运行时,这样的计算机可读存储装置包含用于实现该方法的一个或多个步骤的程序代码装置。硬件设备可以是可编程的任何类型的设备,包括例如任何类型的计算机,如服务器或个人计算机等,或其任何组合。该设备还可以包括可以是:例如硬件装置的装置,如例如专用集成电路(asic)、现场可编程门阵列(fpga);或硬件和软件装置的组合,例如asic和fpga;或至少一个微处理器和至少一个存储器,其中软件模块位于其中。因此,该装置可以包括硬件装置和软件装置两者。这里描述的方法实施例可以用硬件和软件实现。该设备还可以包括软件装置。可替选地,例如使用多个cpu,实施例可以在不同的硬件设备上实现。

本文的实施例可包括硬件和软件元素。以软件实现的实施例包括但不限于固件、驻留软件、微代码等。由本文描述的各种模块执行的功能可以在其他模块或其他模块的组合中实现。出于本说明书的目的,计算机可用或计算机可读介质可以是能够包括、存储、传送、传播或传输程序以供指令执行系统、装置或设备使用或与之结合使用的任何装置。

示出的步骤被阐述以解释示出的示例性实施例,并且应该预期正在进行的技术开发将改变执行特定功能的方式。出于说明而非限制的目的,本文提供了这些示例。此外,为了便于描述,这里任意地定义了功能构建块的边界。可以定义可替选的边界,只要适当地执行指定的功能及其关系即可。基于本文包含的教导,替代方案(包括本文描述的那些的等同物、扩展、变化、偏差等)对于相关领域的技术人员将是显而易见的。这样的替代方案落入所公开实施例的范围和精神内。此外,词语“包含”、“具有”、“含有”和“包括”以及其他类似形式旨在在含义上是等同的并且是开放式的,在于这些词中的任何一个之后的一个或多个条目不是意味着是这样的一个或多个条目的详尽列表,或意味着仅限于列出的一个或多个条目。还必须注意,如本文和所附权利要求中所使用的,单数形式“一”、“一个”和“该”包括复数指代,除非上下文另有明确说明。

此外,可以使用一个或多个计算机可读存储介质来实现与本公开一致的实施例。计算机可读存储介质指的是其上可以存储处理器可读的信息或数据的任何类型的物理存储器。因此,计算机可读存储介质可以存储用于由一个或多个处理器执行的指令,包括用于使一个或多个处理器执行与本文描述的实施例一致的步骤或阶段的指令。术语“计算机可读介质”应该被理解为包括有形条目并且不包括载波和瞬态信号,即,是非暂时的。示例包括随机存取存储器(ram)、只读存储器(rom)、易失性存储器、非易失性存储器、硬盘驱动器、cdrom、dvd、闪存驱动器、磁盘和任何其他已知的物理存储介质。

本公开和示例旨在被认为仅是示例性的,其中所公开的实施例的真实范围和精神由所附权利要求指示。

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