请求处理方法及装置与流程

文档序号:18189399发布日期:2019-07-17 05:31阅读:124来源:国知局
请求处理方法及装置与流程
本公开涉及计算机
技术领域
,特别涉及一种请求处理方法及装置。
背景技术
:在当前的客户端/服务器(client/server,c/s)通信架构中,终端的服务需求量越来越大,为了能够快捷地给各个终端提供服务,服务器通常需要并行处理多个终端的请求,例如,对服务器已存储的内容进行读操作或写操作。其中,写操作涉及内容的修改,读操作不涉及内容的修改。目前,为了避免在并行处理请求的过程中所处理数据被破坏,一般基于锁机制处理请求,在锁机制下,服务器会执行被分配锁的请求对应的操作,或暂时挂起未被分配锁的请求。以读写锁(read/writelock)处理请求为例,读锁用于确保请求对应的读操作正确执行,写锁用于确保对应的写操作正确执行,服务器可以从请求队列中获取一个请求a,该请求队列用于存放已接收到的客户端的请求。当请求a对应读操作时,如果当前没有为任何请求分配写锁,才可以为请求a分配读锁,并基于请求a进行读操作,例如,当前仅为请求b分配了读锁,则服务器可以并行处理请求a和请求b。当请求a对应写操作时,如果当前没有为任何请求分配锁,才可以为请求a分配写锁,并基于请求a进行写操作,直到请求a处理完成,释放请求a的写锁之后可以获取下一个请求,这是由于写操作一般涉及数据的修改,为了保证数据的一致性,在基于某一请求进行写操作的过程中,会暂停处理其他请求,则不会再为其他请求分配锁。在实现本公开的过程中,发明人发现现有技术至少存在以下问题:以上基于读写锁处理请求的过程中,将操作简单地划分为读写操作导致并行处理的限制性高,处理效率低。技术实现要素:本公开实施例提供了一种请求处理方法及装置,能够解决现有技术中并行处理的限制性高,处理效率低的问题。所述技术方案如下:第一方面,提供了一种请求处理方法,所述方法包括:获取终端的第一请求;基于所述第一请求对应的操作类型和操作路径,在所述第一请求符合处理条件的情况下,为所述第一请求分配锁,所述操作类型是指所述第一请求指示的需要执行的操作类型,所述操作路径是指所述第一请求指示的操作对象的存储路径;基于所述锁执行所述第一请求对应的操作;其中,所述处理条件包括所述第一请求对应的操作和各个第二请求对应的操作不相冲突;所述第二请求为所述第一请求分配锁时,已被所述服务器分配了锁的请求。在第一方面的第一种可能实现方式中,所述基于所述第一请求对应的操作类型和操作路径,在所述第一请求符合处理条件的情况下,为所述第一请求分配锁,包括:基于所述第一请求对应的操作类型和操作路径,在冲突映射关系集合中查询所述第一请求对应的操作与所述各个第二请求中的至少一个请求对应的操作之间的冲突情况,所述冲突映射关系集合用于指示在所述服务器的文件系统的树结构中可执行的任两个操作之间的冲突情况,所述冲突映射关系集合包括多条映射规则,所述映射规则包括两个请求的操作类型、两个请求的操作路径的关系与所述两个请求的冲突情况三者之间的映射;在所述第一请求符合处理条件的情况下,为所述第一请求分配所述锁。该实现方式中,通过已配置的冲突映射关系集合,可以直接查询到第一请求对应的操作与各个第二请求对应的操作之间的冲突情况,从而可以高效地为第一请求分配锁,提高了处理效率。在第一方面的第二种可能实现方式中,所述映射规则还包括两个请求的操作类型与所述两个请求的冲突情况之间的映射,和两个请求的操作路径的关系与所述两个请求的冲突情况之间的映射中的至少一种。在第一方面的第三种可能实现方式中,多条映射规则包括下述规则中的至少一条:在所述第二操作路径包括但不等于所述第一操作路径、所述第一操作类型用于进行读操作以及所述第二操作类型用于进行写操作的情况下,所述第一操作与所述第二操作不相冲突;在所述第一操作路径包括但不等于所述第二操作路径、所述第一操作类型用于进行读操作以及所述第二操作类型用于对节点的属性进行写操作的情况下,所述第一操作与所述第二操作不相冲突;所述第一操作路径包括所述第二操作路径、所述第一操作类型用于进行读操作以及所述第二操作类型用于对节点进行写操作的情况下,所述第一操作与所述第二操作相冲突;在所述第一操作路径和所述第二操作路径之间具有包含关系、所述第一操作类型用于对节点进行写操作以及所述第二操作类型用于对节点进行写操作的情况下,所述第一操作与所述第二操作相冲突;其中,所述第一操作路径为所述第一操作的操作路径,所述第二操作路径为所述第二操作的操作路径,所述第一操作类型为所述第一操作的操作类型,所述第二操作类型为所述第二操作的操作类型;节点是指所述服务器的文件系统的树结构中的数据或数据所在的目录;所述第一操作为所述第一请求对应的操作,所述第二操作为任一第二请求对应的操作;或者,所述第一操作为任一第二请求对应的操作,所述第二操作为所述第一请求对应的操作。该实现方式中,提供了多种用于判断操作之间是否冲突的映射规则,通过比较操作路径之间的包含关系,并分析操作类型所作用于属性或节点、用于读操作或写操作,全面地涵盖了各种请求对应的操作,使得判断冲突的结果更加准确。在第一方面的第四种可能实现方式中,多条映射规则还包括下述规则中的至少一条:在第一操作路径和第二操作路径之间不具有包含关系的情况下,第一操作与第二操作不相冲突;在第一操作类型和第二操作类型均用于进行读操作的情况下,所述第一操作与所述第二操作不相冲突;在所述第一操作类型和所述第二操作类型均用于对节点的属性进行操作的情况下,所述第一操作与所述第二操作不相冲突。在第一方面的第五种可能实现方式中,所述基于所述锁执行所述第一请求对应的操作之后,所述方法还包括:释放所述第一请求的锁;记录所述第一请求到的处理过程对应的日志;将响应结果返回给终端,所述响应结果为操作执行后响应于所述第一请求的数据。该实现方式中,既可以释放锁之后直接返回响应结果,从而为与该请求相冲突的请求预留出处理资源,使得与该请求相冲突的请求能够尽快被处理,而且能够尽快将响应结果返回给终端;也可以通过先释放锁,再记录日志,最后返回响应结果,为与该请求相冲突的请求预留出处理资源,使得与该请求相冲突的请求能够尽快被处理,而且能够保持返回给终端的响应结果与日志的一致性。在第一方面的第六种可能实现方式中,所述处理条件还包括:各个第二请求的数量不大于预设的并行度。该实现方式中,基于所配置的预设的并行度,可以灵活地限制处理请求的并行级数。在第一方面的第七种可能实现方式中,所述获取终端的第一请求之后,所述方法还包括:在所述第一请求不符合处理条件的情况下,将所述第一请求添加到请求队列;直到与所述第一请求对应的操作相冲突的操作执行完成,为所述第一请求分配锁。第二方面,提供了一种请求处理装置,所述装置包括至少一个模块,该至少一个模块用于实现如上述第一方面或第一方面中任意一种可能实现方式所提供的请求处理方法。第三方面,提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,所述指令被处理器执行以完成如上述第一方面或第一方面中任意一种可能实现方式所提供的请求处理方法。第四方面,提供了一种服务器,所述服务器包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机可执行指令,所述处理器执行所述计算机可执行指令时实现如上述第一方面或第一方面中任意一种可能实现方式所提供的请求处理方法。本公开实施例中,锁用于确保请求对应的操作正确执行,服务器会执行被分配锁的请求对应的操作,或者暂时挂起未被分配锁的请求,直到该请求符合处理条件时为该请求分配锁。操作路径是指请求指示的操作对象的存储路径,操作路径由至少一个节点构成,操作对象为节点或者节点的属性。节点的属性是指描述节点的基本信息,例如,节点的副本数、节点的归属者或访问权限等。操作类型是指请求指示的需要执行的操作类型,根据请求指示的操作类型,可以调用处理该请求所需的操作代码,例如,该服务器应用于分布式文件系统(hadoopdistributedfilesystem,hdfs),操作代码可以包括属性获取函数get()、创建函数create()、删除函数delete()、节点获取函数list()或重命名函数rename()等操作函数,还可以包括设置副本数、归属者、访问权限等操作命令。其中,虽然请求可能调用不同的操作代码,但如果两个请求需调用并执行不同的操作代码时具有相同的冲突情况,也可以将这两个请求的操作类型确定为同一操作类型,相同的冲突情况定义如下:与请求a对应的操作相冲突的操作也与请求b对应的操作相冲突以及与请求a对应的操作不相冲突的操作也与请求b对应的操作不相冲突的情况下,请求a和请求b具有相同的冲突情况;其中,请求a和请求b均为任一请求。例如,请求a需调用的操作命令为设置副本数,请求b需调用的操作命令为设置访问权限,两个请求都是对数据或目录某一属性的修改,并不涉及数据或目录本身的修改,则两个请求均没有和其他操作相冲突的情况,因此,可以将这两个请求对应的操作类型均确定为更新(update)操作类型。具体将哪些操作代码对应的操作类型确定为同一操作类型,可以人为进行配置,本公开实施例对此不做限定。处理条件是指服务器为请求分配锁的条件,至少包括:第一请求对应的操作和第二请求对应的操作不相冲突。由于服务器可能正在处理其他请求,如,写操作(如创建数据)或者读操作(如获取数据)。而为了避免并发地操作破坏数据的一致性,并行执行的请求对应的操作需要满足不相冲突的条件。在实际的应用场景中,根据实际的并行处理需求,也可以配置其他的处理条件,例如,处理条件还包括:各个第二请求的数量不大于预设的并行度。该预设的并行度是指服务器可并行处理的最大请求数,该预设的并行度不大于服务器配置的中央处理器(centralprocessingunit,cpu)数,每个cpu在同一时刻可以处理一个请求。包含关系的定义:操作路径l包括操作路径m上的所有节点,或者操作路径m包括操作路径l上的所有节点的情况下,操作路径l与操作路径m之间具有包含关系;其中,操作路径m和操作路径l均为任一操作的操作路径。本公开实施例通过基于请求的操作类型和操作路径,可以判断请求对应的操作是否和已经在执行的操作相冲突,并且在不相冲突的情况下,为该请求分配与其操作类型和操作路径对应的锁,从而可以基于分配的锁执行请求对应的操作,由于不同请求对应的操作往往分散于不同的操作路径上,在综合考虑了操作类型和操作路径的基础上,更加细化了请求对应的操作,使得请求对应的操作之间相冲突的可能性更低,读操作和写操作、写操作和写操作之间也可能并行进行,进而使得可并行处理的请求更多,提高了并行处理效率。附图说明图1是本公开实施例提供的一种请求处理方法的实施环境示意图;图2是本公开实施例提供的一种服务器的结构示意图;图3是本公开实施例提供的一种请求处理方法的流程图;图4是本公开实施例提供的一种文件系统的树结构图;图5是本公开实施例提供的一种处理请求的流程图;图6是本公开实施例提供的一种请求处理装置的框图。具体实施方式为使本公开的目的、技术方案和优点更加清楚,下面将结合附图对本公开实施方式作进一步地详细描述。图1是本公开实施例提供的一种请求处理方法的实施环境示意图。参见图1,该实施环境中包括:至少一个服务器101和至少一个终端102。该服务器101用于为终端102提供网络服务,在一种实现方式下,服务器101可以包括请求读取模块(requestreaders)、请求处理模块(requestprocessors)和响应返回模块(responsesender)。该请求读取模块用于读取终端的请求;请求处理模块用于处理请求,生成响应结果;响应返回模块用于将响应结果返回给终端。在实际的应用场景中,终端102可以安装该服务器101提供的应用,使得终端102可以基于所安装的应用与服务器101进行交互,如,请求将终端本地的数据上传到服务器,或者,请求从服务器获取数据。本公开实施例中,服务器101可以应用于各种数据存储结构,以hdfs为例,数据可以按照hdfs的树结构进行存储,树结构上的每个节点可以为一个数据或目录,每个目录下可以存储数据或子目录,每个节点还会相应存储属性,如副本数、归属者或访问权限等。图2是本公开实施例提供的一种服务器的结构示意图。参见图2,该服务器包括处理器222,以及由存储器232所代表的存储器资源,例如动态随机存取存储器(dynamicrandomaccessmemory,dram),非易失性存储器(nonvolatilememory,nvm)等组成的存储资源池,该存储器232用于存储可由处理器222的执行的指令,例如应用程序、请求获取模块所获取的请求、请求处理模块所处理的数据、响应返回模块所返回的响应结果等,该存储器232还可以存储用于判断两个操作之间是否相冲突的映射规则以及处理请求时需操作的数据等。存储器232中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理器222主要指cpu内核部分,可以是一个cpu内核,也可以是多个cpu内核的集合,在本发明实施例中,所述处理器105是多个cpu内核的集合,该处理器222被配置为执行指令,以执行下述请求处理方法,包括获取请求、分配锁、记录日志以及返回响应结果等步骤。服务器还可以包括一个电源组件226被配置为执行服务器的电源管理,一个有线或无线网络接口250被配置为将服务器连接到网络,以使服务器通过网络与终端连接,获取到终端的请求,并将响应结果返回给终端。服务器还可以包括一个输入输出(i/o)接口258。服务器可以操作基于存储在存储器232的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或类似。本公开实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,所述指令被处理器执行以完成上请求处理方法。图3是本公开实施例提供的一种请求处理方法的流程图。参见图3,该方法可以应用于终端和服务器交互的过程中,包括以下步骤:301、服务器获取终端的第一请求。其中,第一请求用于请求服务器为终端服务,根据该服务器所提供的服务项目,该请求的有多种,例如,该服务器用于提供多媒体资源服务,该请求可能用于请求获取视频资源;或者,该服务器用于提供社交服务,该请求可能用于请求登记个人信息;又或者,该服务器用于提供网络支付服务,该请求可能用于请求向好友转账。具体地,该请求所包括的内容根据请求的协议格式确定。例如,该请求可以包括登录该终端的用户标识、服务器地址及请求执行的事件信息等。本公开实施例中,终端可以基于所安装的客户端,基于用户操作生成请求,并将请求发送至服务器,使得服务器获取到该请求。在实际的应用场景中,服务器需要为大量终端提供服务,短时间内可能接收到多个请求,但服务器并行处理的能力有限,在一种可能实现的方式中,服务器可以将接收到的请求存放在请求队列中,并按照预设顺序从请求队列中获取请求。该预设顺序用于指示处理请求的顺序,可以根据实际的服务需求确定。例如,该预设顺序为按照请求时间从先到后的顺序,或者,该预设顺序为按照请求的优先级从高到低的顺序。302、服务器基于第一请求对应的操作类型和操作路径,在冲突映射关系集合中查询第一请求对应的操作与各个第二请求中的至少一个请求对应的操作之间的冲突情况,冲突映射关系集合用于指示在服务器的文件系统的树结构中可执行的任两个操作之间的冲突情况,冲突映射关系集合包括多条映射规则,映射规则包括两个请求的操作类型、两个请求的操作路径的关系与两个请求的冲突情况三者之间的映射。例如,图4是本公开实施例提供的一种文件系统的树结构图,操作路径为hdfs中的节点所构成的路径,“/”表示根目录,“foo”和“bat”表示根目录下的子目录,“a”和“b”表示“foo”目录下的子目录或数据,“c”表示“bat”目录下的子目录或数据,“x”表示“bat”目录下的子目录,“d”表示“x”目录下的子目录或数据,假设需要在/foo目录下创建“a”,则a的操作路径为/foo。该步骤中,服务器可以从第一请求中提取出用户标识,根据用户标识确定操作路径;根据所请求执行的事件信息获取需调用的操作代码,确定出操作类型。进而,服务器可以将第一请求对应的操作类型和操作路径以及第二请求对应的操作类型和操作路径作为索引,在冲突映射关系集合中进行查询,并获取与该第一请求和第二请求的操作信息匹配的冲突情况。在实际的应用场景中,为了提高判断效率,进而提高处理效率,冲突映射关系集合既可以人为地配置,也可以事先依据多条映射规则生成冲突映射关系,使得实际判断过程可以直接查询该第一请求对应的操作与各个正在处理的请求对应的操作之间的冲突情况,该多条映射规则用于判断在服务器的文件系统的树结构中可执行的任两个操作之间的冲突情况。该多条映射规则包括下述1-4中的至少一个。需要说明的是,下述映射规则1-4的标号仅用于标示不同的映射规则,而与规则的执行顺序无关。1、第二操作路径包括但不等于第一操作路径的情况下,则判断第一操作类型和第二操作类型的功能,第一操作类型用于进行读操作以及第二操作类型用于进行写操作的情况下,确定第一操作与第二操作不相冲突。该判断过程中,第二操作路径包括但不等于第一操作路径的情况下,第一操作所操作的节点或属性会位于第二操作路径上。由于节点间为树状数据结构,在第二操作类型用于进行写操作的情况下,需要对第二操作路径上的各个节点进行读操作,才能最终到达第二操作所操作的节点,也就是第二操作类型也会用于对第一操作所操作的节点进行读操作。然而,由于第一操作类型用于对节点或节点的属性进行读操作,则两个读操作之间不相冲突。与映射规则“1”同理,第一操作路径包括但不等于第二操作路径的情况下,则判断第一操作类型和第二操作类型的功能,第二操作类型用于进行读操作,第一操作类型用于进行写操作的情况下,确定第一操作与第二操作不相冲突。需要说明的是,本公开实施例不限定第二操作路径包括但不等于第一操作路径的情况下,第一操作类型用于进行写操作或第二操作类型用于进行读操作的情况下如何处理,例如,服务器可以继续执行其他映射规则,或者,为使冲突映射规则更为严格,提高请求处理的容错率,也可以直接确定第一操作和第二操作相冲突。2、第一操作路径包括但不等于第二操作路径的情况下,则判断第一操作类型和第二操作类型的功能,第一操作类型用于进行读操作以及第二操作类型用于对节点的属性进行写操作的情况下,确定第一操作与第二操作不相冲突。该判断过程中,第一操作路径包括第二操作路径的情况下,则第二操作所操作的节点会位于第一操作路径上,则第一操作类型也会用于对第二操作所操作的节点进行读操作,由于第二操作类型用于对节点的属性进行写操作,因此并不会造成对同一节点进行读操作和写操作的冲突。与映射规则“2”同理,第二操作路径包括但不等于第一操作路径的情况下,则判断第一操作类型和第二操作类型的功能,第二操作类型用于进行读操作,第一操作类型用于对属性进行写操作的情况下,确定第一操作与第二操作不相冲突。需要说明的是,本公开实施例不限定第一操作路径包括但不等于第二操作路径的情况下,第一操作类型用于进行写操作或第二操作类型不用于对节点的属性进行写操作的情况下如何处理,例如,服务器可以继续执行其他映射规则,或者,为使冲突映射规则更为严格,提高请求处理的容错率,也可以直接确定第一操作和第二操作相冲突。3、第一操作路径包括第二操作路径的情况下,则判断第一操作类型和第二操作类型的功能,第一操作类型用于进行读操作以及第二操作类型用于对节点进行写操作的情况下,确定第一操作与第二操作相冲突。该判断过程中,第一操作路径包括第二操作路径的情况下,则第二操作所操作的节点会位于第一操作路径上,则第一操作类型也会用于对第二操作所操作的节点进行读操作,由于第二操作类型用于对节点进行写操作,因此造成了对同一节点进行读操作和写操作的冲突。与映射规则“3”同理,第二操作路径包括第一操作路径的情况下,则判断第一操作类型和第二操作类型的功能,第二操作类型用于进行读操作以及第一操作类型用于对节点进行写操作的情况下,确定第一操作与第二操作相冲突。需要说明的是,本公开实施例不限定第一操作路径包括第二操作路径的情况下,第一操作类型用于进行写操作或第二操作类型不用于对节点进行写操作的情况下如何处理,例如,服务器可以继续执行其他映射规则。4、第一操作路径和第二操作路径之间具有包含关系的情况下,判断第一操作类型和第二操作类型的功能,第一操作类型用于对节点进行写操作以及第二操作类型用于对节点进行写操作的情况下,确定第一操作与第二操作相冲突。该判断过程中,在第一操作路径和第二操作路径之间具有包含关系的情况下,则存在一个操作a所操作的节点位于另一个操作b的操作路径上,因此,如果两个操作类型均用于写操作,操作b也会对操作a所操作的节点进行读操作,导致与操作a对该节点的写操作相冲突。需要说明的是,本公开实施例不限定第一操作路径和第二操作路径之间具有包含关系的情况下,第一操作类型不用于对节点进行写操作或第二操作类型不用于对节点进行写操作的情况下如何处理,例如,服务器可以继续执行其他映射规则。上述映射规则1-4为两个请求操作类型、两个请求的操作路径的关系与所述两个请求的冲突情况三者之间的映射,事实上,映射规则还可以包括两个请求的操作类型与两个请求的冲突情况之间的映射,和两个请求的操作路径的关系与两个请求的冲突情况之间的映射中的至少一种,具体参见映射规则5-7。其中,映射规则5为两个请求的操作路径的关系与两个请求的冲突情况之间的映射,映射规则6和7均为两个请求的操作类型与两个请求的冲突情况之间的映射。需要说明的是,下述映射规则5-7的标号也仅用于标示不同的映射规则,而与规则的执行顺序无关。5、判断第一操作路径和第二操作路径之间是否具有包含关系,如果否,确定第一操作与第二操作不相冲突。其中,第一操作作为第一请求对应的操作,第二操作作为正在处理的请求对应的操作;或者,第一操作作为第二请求对应的操作,第二操作作为第一请求对应的操作。本公开实施例以第一种情况为例,第一操作路径为第一请求对应的操作路径,第二操作路径为第二请求对应的操作。该判断过程中,服务器可以比较两个操作路径,如果任一操作路径中的节点包括另一操作路径全部的节点,可以确定两个操作路径具有包含关系,否则,确定两个操作路径不具有包含关系。例如,第一操作路径为/foo,第二操作路径为/bar/x/d,则可以确定两个操作路径不具有包含关系,确定两个操作不相冲突。又例如,第一操作路径/foo,第二操作路径为/foo/x/d,则可以确定两个操作路径具有包含关系。需要说明的是,本公开实施例不限定第一操作路径和第二操作路径之间具有包含关系的情况下如何处理,例如,服务器可以继续执行其他映射规则,或者,为使冲突映射规则更为严格,提高请求处理的容错率,也可以直接确定第一操作和第二操作相冲突。6、判断第一操作类型和第二操作类型的功能,第一操作类型和第二操作类型均用于进行读操作的情况下,确定第一操作与第二操作不相冲突。该判断过程中,根据已配置的操作类型和读/写操作之间的关系,服务器可以确定该操作类型用于读操作或写操作,如果两个操作类型均为对节点或节点的属性的读操作,则不涉及数据或目录的修改,可以确定两个操作不相冲突。其中,节点是指数据或数据所在的目录。参见表1,本公开实施例提供了一种操作类型和读/写操作之间的关系。表1需要说明的是,本公开实施例不限定第一操作类型或第二操作类型用于进行读操作的情况下如何处理,例如,服务器可以继续执行其他映射规则,或者,为使冲突映射规则更为严格,提高请求处理的容错率,也可以直接确定第一操作和第二操作相冲突。7、判断第一操作类型和第二操作类型的功能,第一操作类型和第二操作类型均用于对节点的属性进行操作的情况下,确定第一操作与第二操作不相冲突。该判断过程中,服务器可以根据已配置的操作类型和操作对象之间的关系,判断操作类型用于对节点的属性或节点进行操作。参见表1,get()用于对属性进行操作,list()用于对节点进行操作。由于节点可以具备多项属性,对同一项属性进行读写操作的概率很低,进而可视为对属性的两个操作不会冲突。需要说明的是,本公开实施例不限定第一操作类型或第二操作类型用于对节点进行操作的情况下如何处理,例如,服务器可以继续执行其他映射规则,或者,为使冲突映射规则更为严格,提高请求处理的容错率,也可以直接确定第一操作和第二操作相冲突。本公开实施例对冲突映射关系的具体形式不做限定。例如,基于图4所示的文件系统树状图,并依据上述映射规则1-4生成的冲突映射关系集合以表2所示的冲突映射关系表:表2是否冲突get(a)list(a)create(c)update(c)delete(d)rename(c,d)get(c)ffffftlist(c)fftfftcreate(a)ftffffupdate(a)ffffffdelete(d)ffffttrename(a,b)ttffff该表2以冲突映射关系集合包括两个请求的操作类型、两个请求的操作路径的关系与两个请求的冲突情况三者之间的映射这一映射规则为例进行说明,对于该冲突映射关系集合所包括的多条映射规则中的其他映射规则,以两个请求的操作类型与所述两个请求的冲突情况之间的映射这一映射规则为例,其冲突映射关系表如表3所示:表3是否冲突get()list()get()fflist()ff以两个请求的操作路径的关系与两个请求的冲突情况之间的映射这一映射规则为例,其冲突映射关系表如表4所示表4是否冲突/foo/a/foo/b/foo/c/foo/dfff/bar/efff/bar/gfff需要说明的是,上述映射规则可以采用任意方式相结合,而在实际应用中采用多条映射规则中的哪几条映射规则,本公开实施例不做限定。例如,采用表2和表3对应的映射规则,则服务器可以在表2和表3中依次进行查询,以得到第一请求与至少一个第二请求的冲突情况。还要说明的是,上述冲突映射关系表是示例性的,并不代表该文件系统中全部节点之间冲突情况。其中,括号中的路径已省略为最终的操作节点;t表示冲突,f表示不冲突;create(a)表示在a目录下创建子节点;rename(c,d)表示将c移动到d目录下;delete(d)表示删除d目录下的子节点。而且,在不同的数据结构中,服务器提供的操作类型和其数量可能不同,则需要实现的映射规则可能不同。例如,服务器可提供的操作类型数为n,用于进行读操作的操作类型数为m,则至少需要实现(n-m)*n/2种映射规则,以服务器应用于hdfs为例,n可以为6,m可以为2,则至少需要实现12种不同的映射规则。结合表2,假设第二请求对应的操作为get(/bar/c),第一请求对应的操作为create(/bar/c),基于表2可知,第一请求对应的操作和第二请求对应的操作不相冲突,可以在锁分配表中为第一请求分配锁。在实际的应用场景中,随着服务器中节点的更新,可以依据已配置的映射规则相应地更新冲突映射关系集合,使得冲突映射关系集合总是符合当前的处理需求。例如,当创建第一节点时,根据映射规则在冲突映射关系集合中添加已配置的操作与对第一节点的操作之间的冲突情况;或者,当删除第二节点时,根据映射规则在冲突映射关系集合中删除与对第二节点的操作相关的冲突情况。具体地,假设在a目录下创建子节点q后,为使后续在操作q时的判断效率更高,根据映射规则添加get(q)、update(q)、rename(q,_)和delete(q)等操作与其他操作的冲突情况。又例如,为了节省冲突映射关系集合占用的存储资源,在删除x目录下的子节点d后,可以删除get(d)、update(d)、rename(d,_)等操作与其他操作的冲突情况。其中,“_”表示任意目录。需要说明的是,为了提高处理效率,在查询过程中,当查询到第一请求对应的操作与任一第二请求对应的操作相冲突时,即可停止查询过程,并暂时挂起第一请求。303、服务器在第一请求符合处理条件的情况下,为第一请求分配锁。锁用于确保请求对应的操作正确执行,服务器正在处理的请求均已被分配锁,也就说如果请求没有被分配锁,服务器会将该请求加入请求队列,等待该请求被分配锁后开始处理。可见,正在处理的请求数相当于已分配的锁的数量。本公开实施例不限定锁的形式和相应的分配锁的方式。在一种可能实现的方式中,分配锁可以是在锁分配列表中添加被处理请求的操作信息,该锁分配列表用于记录已分配锁的请求的操作信息,该操作信息至少包括操作类型和操作路径。该锁分配列表如表5所示:表5操作get(/bar/x/d)create(/foo/b)delete(/foo/e)其中,一个操作可以由操作类型和操作路径唯一确定,该锁分配表的大小相当于正在执行的操作数,也相当于已分配锁的数量。事实上,无论采用何种形式的锁或以何种方式分配锁,能够确保所分配锁的操作正确执行即可。对于第一请求不符合处理条件的情况,本公开实施例不限定其处理方式,例如,在第一请求不符合处理条件的情况下,服务器将第一请求添加到请求队列;直到与第一请求对应的操作相冲突的操作执行完成,为第一请求分配锁。需要说明的是,如果当前不存在第二请求,也就不会存在与第一请求对应的操作相冲突的操作,则服务器可以无需进行步骤302,直接为第一请求分配锁即可。还要说明的是,步骤302和303是本公开实施例基于第一请求对应的操作类型和操作路径,在第一请求符合处理条件的情况下,为第一请求分配锁的可选步骤,事实上,为了减少冲突映射关系集合的占用,也可以采用实时计算的方式判断操作之间的冲突情况:服务器基于已配置的映射规则、以及第一请求对应得到操作类型和操作路径,判断第一请求对应的操作与各个第二请求中至少一个请求对应的操作之间的冲突情况,在第一请求符合处理条件的情况下,为第一请求分配锁。304、服务器基于锁执行第一请求对应的操作。该步骤中,服务器基于已分配的锁,通过可用的一个cpu开始执行第一请求对应的操作,基于该cpu调用第一请求对应的操作代码,执行并完成第一请求对应的操作。例如,第一请求对应的操作为获取用户的头像数据,则cpu可以调用list()函数,基于该用户的头像数据所在的操作路径,获取到该用户的头像数据。需要说明的是,执行该第一请求对应的操作的同时,已运行的cpu可以继续处理第二请求,使得服务器可以并行处理请求。305、服务器释放第一请求的锁。该步骤中,当服务器完成第一请求对应的操作后,根据分配锁的方式,可以按照对应的释放锁的方式释放第一请求的锁。例如,对应表1所举例的分配锁的方式,服务器可以从锁分配表中删除该第一请求的操作信息。306、服务器记录第一请求的处理过程对应的日志,并将响应结果返回给终端,该响应结果为操作执行后响应于第一请求的数据。其中,日志用于备份节点更新事件,通常在完成写操作后需要进行记录,使得服务器重启或故障后可以根据日志恢复出已更新的节点,该节点更新事件如节点创建事件、节点删除事件或节点修改事件,可以包括更新后的节点、节点更新时间和被更新节点相关的用户标识等。该步骤中,服务器可以基于已完成的第一请求对应的操作,生成响应结果,并将响应结果返回给终端。对于不同的应用场景,响应结果包括的内容和形式可以不同。例如,在用户a请求向用户b转账的场景中,服务器在执行转账操作后,可以将转账成功消息返回给用户a所在终端,该转账成功消息可以包括已转账数额、用户b的用户标识和交易单号等,又例如,在用户a请求获取视频资源的场景中,服务器可以在执行获取视频流的操作后,将视频流返回给用户a所在终端。本公开实施例中,当第一请求对应的操作为写操作时,在执行第一请求对应的操作过程中,服务器可以在缓冲区中生成与本次处理过程对应的日志内容,如数据更新时间、更新后的节点等。当释放第一请求的锁后,服务器可以按照日志格式,将缓冲区中的日志内容写入磁盘中,从而持久化已更新的节点。具体地,服务器可以在应用程序缓冲区中生成日志内容,并调用缓冲区刷入(flush)命令将应用程序缓冲区中的日志内容刷入系统内核缓冲区。当将响应结果返回给终端后,服务器可以调用磁盘刷入(sync)命令将系统内核缓冲区中的日志内容写入磁盘。需要说明的是,为了降低运行负担,sync命令可以等待内核缓冲区中所存储的日志内容达到预设大小后,将多个日志内容一次性写入磁盘,该预设大小理应不大于内核缓冲区的存储容量。需要说明的是,该步骤的处理时序是可选的,为使得终端从发送请求到获取响应结果的时间更短,可以忽略日志的记录进度,在释放第一请求的锁之后,直接返回响应结果。然而,考虑到缓冲区中的数据不稳定,一旦服务器故障,缓冲区中的日志内容会丢失,而节点更新事件还没有备份,则不能根据日志恢复出最近更新的节点,因此,为了保证已更新的节点和响应结果的一致性,应当在记录第一请求的处理过程对应的日志后,将响应结果返回给终端。该处理方式中,服务器可以基于已完成的第一请求对应的操作,生成响应结果,将响应结果添加到响应队列中,直到将缓冲区中的日志内容写入磁盘后,将响应队列中的响应结果返回给终端。需要说明的是,步骤305至步骤306是本公开实施例基于已分配的锁处理请求的可选步骤,事实上,本公开实施例不限定分配锁之后何时释放锁、记录日志或者返回响应结果的执行时序,而且,当请求对应读操作时,也无需记录日志。例如,服务器也可以在记录第一请求的处理过程对应的日志并返回响应结果后,再释放锁,相较于分配读写锁的处理方式,也能提高并行处理效率。本公开实施例通过基于请求的操作类型的操作路径,可以判断请求对应的操作是否和已经在执行的操作相冲突,并且在不相冲突的情况下,为请求分配与其操作类型和操作路径对应的锁,从而可以基于分配的锁执行请求对应的操作,由于不同请求对应的操作往往分散于不同的操作路径上,在综合考虑了操作类型和操作路径的基础上,更加细化了请求对应的操作,使得请求对应的操作之间相冲突的可能性更低,读操作和写操作、写操作和写操作之间也可能并行进行,进而使得可并行处理的请求更多,提高了并行处理效率。以hdfs的应用场景为例,由于并发的请求对应的操作路径往往分散于不同的目录树中的不同子树,相较于现有技术中采用的读写锁机制,采用本公开实施例的映射规则可以实现更多的可并行操作,从而大大提升处理并行度和吞吐量。而且,本公开实施例可以充分利用服务器多cpu的高并行能力,由于操作和操作之间冲突的可能性更低,使得可并行处理的请求更多,被利用的cpu更多,进而使得cpu的利用率更高。而但对于现有技术来说,其在执行写操作时会完全阻塞其他请求,则cpu的利用率大大降低,以节点的读写操作比例为4:1为例,采用现有技术的读写锁机制的处理并行度在1.5左右,然而,服务器通常可配备32个以上的cpu,导致浪费了超过95%的cpu的能力。采用本公开实施例的处理方式,综合考虑了细化的操作类型和请求实际对应的操作路径,使得处理并行度受读写操作的限制很小,相较于现有技术可提升20倍左右。基于上述处理过程,参见图5,本公开实施例提供了一种处理请求的流程图。该处理流程中,服务器可以从请求队列中获取请求,并检测该请求与正在处理的请求是否冲突,如果冲突,则将该请求置于等待状态,并在等待时间结束后重新检测该请求是否与已分配锁的请求是否冲突;如果不冲突,则为该请求分配锁,进而判断该请求是否对应读操作,如果是读操作,可以直接执行该操作,并在完成操作后释放锁,生成响应结果并返回给终端。如果是写操作,也可以执行该操作,并在执行该操作的过程中在缓冲区生成日志内容,当执行操作结束后释放锁,并将缓冲区的日志内容刷入磁盘中,再从响应队列中获取响应结果,并返回给终端。图6是本公开实施例提供的一种请求处理装置的框图,参见图6,该请求处理装置包括:获取模块601,用于获取终端的第一请求;分配模块602,用于基于第一请求对应的操作类型和操作路径,在第一请求符合处理条件的情况下,为第一请求分配锁,操作类型是指第一请求指示的需要执行的操作类型,操作路径是指第一请求指示的操作对象的存储路径;处理模块603,用于基于锁执行第一请求对应的操作;其中,处理条件包括第一请求对应的操作和各个第二请求对应的操作不相冲突;第二请求为第一请求分配锁时,已被所述服务器分配了锁的请求。本公开实施例通过基于请求的操作类型的操作路径,可以判断请求对应的操作是否和已分配锁的请求对应的操作相冲突,并且在不相冲突的情况下,为请求分配与其操作类型和操作路径对应的锁,从而可以基于分配的锁执行请求对应的操作,由于不同请求对应的操作往往分散于不同的操作路径上,在综合考虑了操作类型和操作路径的基础上,更加细化了请求对应的操作,使得请求对应的操作之间相冲突的可能性更低,读操作和写操作、写操作和写操作之间也可能并行进行,进而使得可并行处理的请求更多,提高了并行处理效率。在一种可能实现方式中,分配模块602用于执行步骤302和303。在一种可能实现方式中,映射规则还包括两个请求的操作类型与两个请求的冲突情况之间的映射,和两个请求的操作路径的关系与两个请求的冲突情况之间的映射中的至少一种。在一种可能实现方式中,多条映射规则包括下述规则中的至少一条:在第二操作路径包括但不等于第一操作路径、第一操作类型用于进行读操作以及第二操作类型用于进行写操作的情况下,第一操作与第二操作不相冲突;在第一操作路径包括但不等于第二操作路径、第一操作类型用于进行读操作以及第二操作类型用于对节点的属性进行写操作的情况下,第一操作与第二操作不相冲突;在第一操作路径包括第二操作路径、第一操作类型用于进行读操作以及第二操作类型用于对节点进行写操作的情况下,第一操作与第二操作相冲突;在第一操作路径和第二操作路径之间具有包含关系、第一操作类型用于对节点进行写操作以及第二操作类型用于对节点进行写操作的情况下,第一操作与第二操作相冲突;其中,第一操作路径为第一操作的操作路径,第二操作路径为第二操作的操作路径,第一操作类型为第一操作的操作类型,第二操作类型为第二操作的操作类型;节点是指服务器的文件系统的树结构中的数据或数据所在的目录;第一操作为第一请求对应的操作、第二操作为任一第二请求对应的操作,或者,第一操作为任一第二请求对应的操作、第二操作为第一请求对应的操作。在一种可能实现方式中,多条映射规则还包括下述规则中的至少一条:在第一操作路径和第二操作路径之间不具有包含关系的情况下,第一操作与第二操作不相冲突;在第一操作类型和第二操作类型均用于进行读操作的情况下,第一操作与第二操作不相冲突;在第一操作类型和第二操作类型均用于对节点的属性进行操作的情况下,第一操作与第二操作不相冲突。在一种可能实现方式中,处理模块603用于执行上述步骤305和306。在一种可能实现方式中,处理条件还包括:各个第二请求的数量不大于预设的并行度。在一种可能实现方式中,该装置还包括添加模块,用于执行上述步骤303;分配模块602用于执行步骤303。需要说明的是:上述实施例提供的请求处理装置在处理请求时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的请求处理装置与请求处理方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。以上所述仅为本公开的可选实施例,并不用以限制本公开,凡在本公开的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1