CN116627775A - 有状态的服务器无感知函数的写优化方法和装置 - Google Patents
有状态的服务器无感知函数的写优化方法和装置 Download PDFInfo
- Publication number
- CN116627775A CN116627775A CN202310904722.9A CN202310904722A CN116627775A CN 116627775 A CN116627775 A CN 116627775A CN 202310904722 A CN202310904722 A CN 202310904722A CN 116627775 A CN116627775 A CN 116627775A
- Authority
- CN
- China
- Prior art keywords
- log
- condition
- read operation
- target object
- server
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 230000006870 function Effects 0.000 title claims abstract description 206
- 230000008447 perception Effects 0.000 title claims abstract description 121
- 238000000034 method Methods 0.000 title claims abstract description 53
- 238000005457 optimization Methods 0.000 title claims abstract description 15
- 238000003860 storage Methods 0.000 claims abstract description 81
- 238000005096 rolling process Methods 0.000 claims description 5
- 238000010563 solid-state fermentation Methods 0.000 description 133
- 238000010586 diagram Methods 0.000 description 9
- 238000004590 computer program Methods 0.000 description 7
- 230000008569 process Effects 0.000 description 7
- 238000012545 processing Methods 0.000 description 4
- 230000009471 action Effects 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 2
- 230000002085 persistent effect Effects 0.000 description 2
- 230000010076 replication Effects 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 239000002131 composite material Substances 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 230000000737 periodic effect Effects 0.000 description 1
- 230000002688 persistence Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3065—Monitoring arrangements determined by the means or processing involved in reporting the monitored data
- G06F11/3072—Monitoring arrangements determined by the means or processing involved in reporting the monitored data where the reporting involves data filtering, e.g. pattern matching, time or event triggered, adaptive or policy-based reporting
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3065—Monitoring arrangements determined by the means or processing involved in reporting the monitored data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/1805—Append-only file systems, e.g. using logs or journals to store data
- G06F16/1815—Journaling file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/1873—Versioning file systems, temporal file systems, e.g. file system supporting different historic versions of files
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本公开提供了一种有状态的服务器无感知函数的写优化方法和装置,涉及计算机技术领域,旨在免除写操作记录日志的情况下,实现严格一次语义。所述方法包括:在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;获取外部存储节点上所述目标对象的版本号;在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
Description
技术领域
本公开涉及计算机技术领域,特别是涉及一种有状态的服务器无感知函数的写优化方法和装置。
背景技术
服务器无感知计算在云应用开放中得到越来越广泛的关注。在服务器无感知计算中,因为计算和存储解耦合的资源架构,部署的函数可以根据实时需求进行弹性伸缩。服务器无感知计算中的计算资源可以独立于长期的存储资源进行细粒度的配置。该架构能够很好地适配无状态的服务器无感知函数。
由于可能出现的负载平衡和资源弹性伸缩,有状态的服务器无感知函数(Stateful Serverless Function,SSF)的本地状态无法保证在函数调用之间持久化地保存。因此,为了在多个函数之间共享状态,SSF需要依赖外部存储进行状态管理。
SSF在执行过程中可能出现的故障,给将SSF的状态管理卸载到外部存储给应用层面的容错带来了挑战。虽然SSF能够被分解为无状态函数和外部状态,但实现SSF的容错并不等同于分别实现每个部分的容错。无状态函数的容错可以通过重新执行先前因故障而失败的函数来实现,而外部状态的容错可以通过对外部状态进行持久化来实现。然而简单将二者结合无法在应用层面提供容错。假设一个SSF先对外部状态执行了一个写入操作,然后遭遇故障。重新执行这个函数会重复先前写操作,从而导致应用状态出现不一致,例如重复增加了计数器或者多次从消息队列中获取消息。
相关技术为了实现严格一次语义,通常通过记录日志来实现,其核心思路是将重新执行所提供的至少一次语义与幂等性相结合。在每次对外部状态进行写操作时,都会记录一次日志,从而导致大量的开销。
发明内容
鉴于上述问题,本公开实施例提供了一种有状态的服务器无感知函数的写优化方法和装置,以便克服上述问题或者至少部分地解决上述问题。
根据本公开实施例的第一方面,提供一种有状态的服务器无感知函数的写优化方法,所述方法包括:
在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;
将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;
获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号;
在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;
在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
可选地,所述方法还包括:
在所述有状态的服务器无感知函数针对所述目标对象进行读操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
获取所述有状态的服务器无感知函数对应的历史日志流;
根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括所述读操作的日志;
在所述历史日志流中包括所述读操作的日志的情况下,将所述读操作的日志记录的读取结果,作为所述读操作的返回值,并将所述读操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
在所述历史日志流中不包括所述读操作的日志的情况下,读取所述外部存储节点上所述目标对象的实时取值,并根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志;
在所述条件记录接口的判断结果为记录所述读操作的日志的情况下,对所述读操作的日志进行记录,并将所述读操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息。
可选地,所述方法还包括:
在有状态的服务器无感知函数调用其他有状态的服务器无感知函数的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
获取所述其它有状态的服务器无感知函数的标识;
获取所述有状态的服务器无感知函数对应的历史日志流;
根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括当前调用日志;
在所述历史日志流中包括所述当前调用日志的情况下,获取所述当前调用日志中记录的所述其它有状态的服务器无感知函数的执行结果,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述历史日志流中不包括所述当前调用日志的情况下,重新调用所述其它有状态的服务器无感知函数,并获取所述其它有状态的服务器无感知函数返回的执行结果,根据所述执行结果和所述步骤序号,通过条件记录接口判断是否记录所述当前调用日志;
在所述条件记录接口的判断结果为记录所述当前调用日志的情况下,对所述当前调用日志进行记录,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述条件记录接口的判断结果为不记录所述当前调用日志的情况下,输出错误信息。
可选地,所述方法还包括:
在执行所述有状态的服务器无感知函数之前,对所述有状态的服务器无感知函数的步骤序号进行初始化,得到初始化步骤序号;
根据所述有状态的服务器无感知函数的标识,查询日志存储节点中是否存在所述有状态的服务器无感知函数的日志;
在所述日志存储节点中存在所述有状态的服务器无感知函数的日志的情况下,将所述有状态的服务器无感知函数的日志中,序列号最小的日志确定为初始化日志;
在所述日志存储节点中不存在所述有状态的服务器无感知函数的日志的情况下,根据所述初始化步骤序号,生成所述初始化日志;
将所述初始化日志的序列号,确定为所述有状态的服务器无感知函数的初始化内部序列号。
可选地,所述方法还包括:
通过垃圾回收器检查执行完毕的有状态的服务器无感知函数;
通过垃圾回收器删除执行完毕的有状态的服务器无感知函数的相关日志,所述相关日志包括:读操作日志、函数调用日志和初始化日志。
可选地,所述根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志,包括:
将所述实时取值和所述步骤序号输入所述条件记录接口,得到所述条件记录接口以所述实时取值为日志内容,生成的所述读操作的日志,以及根据所述步骤序号确定的条件偏移量;
在所述读操作的日志在所述历史日志流中的实际偏移量,与所述条件偏移量不同的情况下,将所述判断结果确定为不记录所述读操作的日志;
在所述实际偏移量与所述条件偏移量相同的情况下,将所述判断结果确定为记录所述读操作的日志。
可选地,所述在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息,包括:
在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,对所述条件记录接口生成的所述读操作的日志进行回滚,并输出所述错误信息。
可选地,在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,所述方法还包括:
根据所述步骤序号,在所述历史日志流中进行检索,得到所述步骤序号对应的日志;
获取所述步骤序号对应的日志的序列号。
根据本公开实施例的第二方面,提供一种有状态的服务器无感知函数的写优化装置,所述装置包括:
序列号获取模块,用于在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;
版本号确定模块,用于将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;
版本号获取模块,用于获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号;
更新模块,用于在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;
跳过模块,用于在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
可选地,所述装置还包括:
第一增加模块,用于在所述有状态的服务器无感知函数针对所述目标对象进行读操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
第一获取模块,用于获取所述有状态的服务器无感知函数对应的历史日志流;
第一查询模块,用于根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括所述读操作的日志;
第一确定模块,用于在所述历史日志流中包括所述读操作的日志的情况下,将所述读操作的日志记录的读取结果,作为所述读操作的返回值,并将所述读操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
第一判断模块,用于在所述历史日志流中不包括所述读操作的日志的情况下,读取所述外部存储节点上所述目标对象的实时取值,并根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志;
第一记录模块,用于在所述条件记录接口的判断结果为记录所述读操作的日志的情况下,对所述读操作的日志进行记录,并将所述读操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第一输出模块,用于在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息。
根据本公开实施例的第三方面,提供一种电子设备,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如第一方面所述的有状态的服务器无感知函数的写优化方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得所述电子设备能够执行如第一方面所述的有状态的服务器无感知函数的写优化方法。
本公开实施例包括以下优点:
本公开实施例中,在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号;在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。如此,通过写操作的版本号和目标对象的版本号的大小关系,可以避免进行多次相同的写操作,从而保证严格一次语义;在执行写操作的过程中,无需记录写操作的日志,可以大大节省开销。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对本公开实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本公开实施例中写性能最优日志协议的原型系统的模块图;
图2是本公开实施例中一种有状态的服务器无感知函数的写优化方法的步骤流程图;
图3是本公开实施例中写操作的流程图;
图4是本公开实施例中读操作的流程图;
图5是本公开实施例中函数调用操作的流程图;
图6是本公开实施例中函数初始化的流程图;
图7是本公开实施例中一种有状态的服务器无感知函数的写优化装置的结构示意图。
具体实施方式
为使本公开的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本公开作进一步详细的说明。
为了在节省开销的情况下面向SSF提供严格一次语义,本公开设计了一个写性能最优的日志协议,该日志协议可以完全免除记录写操作日志的需要。本公开基于该日志协议实现了一个原型系统,如图1所示,该原型系统包括:调度器、函数执行节点、外部存储节点和日志存储节点。
调度器用于将SSF调度到函数执行节点运行,以及负责监测SSF的运行进度。如果发现某个SSF或其执行环境出现故障,则会重新执行该SSF。具体地,调度器采用的调度策略可以由服务器无感知计算框架自行选择,不影响本公开所述日志协议的效果。本公开的日志协议可以提供幂等性,调度器提供至少一次语义,从而实现严格一次语义。调度器提供至少一次语义是通过:调度器对SSF的运行进度进行监测,例如与函数执行节点定期进行信号传递;如果发现某个SSF或其执行环境出现故障,则重新将该SSF调度到某个可用的函数执行节点执行。
函数执行节点包括实现了本公开日志协议的程序库,负责将SSF调用请求实例化并执行。该程序库面向SSF提供了数据访问接口以及函数控制流接口,SSF通过数据访问接口对外部存储节点进行读操作和/或写操作,SSF通过函数控制流接口调用其他SSF。这些接口和普通的、不包含日志的接口具有相同的形式,但会在内部通过日志访问接口记录日志,从而保证幂等性。
外部存储节点可以提供原生的读操作和/或写操作,支持多版本存储。本公开实施例中,外部存储节点用于存储单一版本的目标对象。在对目标对象的状态进行更新时,是对当前目标对象的状态进行覆盖。外部存储节点可以进行数据分片和复制。本公开的日志协议不依赖于外部存储节点的组织形式。
日志存储节点提供日志访问接口,主要包括条件记录接口和日志查询接口。日志存储节点的可以为每个日志赋予一个单调递增的序列号,从而将日志组织成一条具有全序关系的线性日志流。日志的标签可以对总体的日志流进行逻辑上拆分,得到数个具有共同标签的支流。日志查询接口可以对某条支流进行选择性的查询。这一功能可以通过日志存储节点上的日志索引来实现。日志存储节点可以进行分片和复制。
通过日志存储节点的条件记录接口记录日志时,用户需要为每个日志提供一个或多个标签;这些标签在逻辑上将总体的日志流划分成了多个日志支流,每个日志支流中的日志具有某个共同的标签,并且依然根据序列号排序。
条件记录接口的输入可以包括:一个或多个标签、条件标签、条件偏移量和日志内容,条件记录接口的输出可以包括:序列号和判断结果。条件记录接口输入的标签可以为任意用户提供的标签,条件标签是当前调用该条件接口的SSF的标识对应的标签,条件偏移量是当前SSF内部的步骤序号,日志内容可以是任意用户提供的内容。条件记录接口会首先尝试性地记录一个日志,并为该日志赋予一个序列号。之后,根据条件标签,将该日志置于相应的日志支流之中,可以得到该日志在日志支流中的实际偏移量(即该日志在支流内部排在第几个)。最后,将实际偏移量和输入的条件偏移量进行比较,如果二者相同,则条件记录接口调用成功,判断结果为真,输出先前赋予该日志的序列号,并将该日志插入日志流中;否则,条件记录接口调用失败,判断结果为假,对之前尝试性记录的日志进行回滚,并输出一条错误信息;可选地,可以根据用户输入的条件偏移量对应的日志支流中进行检索,输出相应偏移量处的日志所对应的序列号。
日志查询接口的输入可以包括:查询标签和查询序列号,日志查询接口的输出可以包括:目标序列号和目标日志内容。输入的查询标签可以是任意用户提供的标签,也可以是当前调用该接口的SSF的标识。日志查询接口会在查询标签所对应的日志支流上进行后向检索,得到小于等于该查询序列号的、最大的目标序列号,并输出该目标序列号和该目标序列号对应的日志的日志内容。
SSF可能面临两种破坏幂等性的竞争情况。第一种竞争情况是:SSF曾出现故障而后重新执行,则在重新执行时会与先前的SSF实例出现竞争,有可能重复先前已经完成的操作,例如,一个SSF内部具有5个步骤,前3个步骤已经执行,在第4个步骤时出现错误,则重新执行SSF;此时,重新执行的SSF的前3个步骤会与先前的SSF的前3个步骤进行竞争。在此种竞争情况中,在执行第二个SSF时,前一个SSF中已经执行的步骤,若存在对应的日志,则对应的日志已经存在日志流中,此时通过日志查询接口进行查询,若查询到日志流中存在对应的日志,则可以确定SSF之间存在竞争。
第二种竞争情况是:SSF可能因为网络故障等因素,导致服务器无感知计算框架误以为SSF执行失败,并启动一个新的实例来服务同一个SSF调用;而实际情况前一个SSF正在执行,则在第二个SSF执行时,存在两个SSF并发执行,该两个SSF彼此之间存在竞争,可能导致同一个操作同一时间被执行两次。在此种竞争情况中,两个SSF并发执行,其中稍晚执行的SSF执行时,稍前执行的SSF对应的日志可能还未插入日志流中,因此,通过日志查询接口无法判断SSF之间是否存在竞争;可以通过条件查询接口依据条件偏移量处与实际偏移量是否一致,判断是否存在竞争。
日志存储节点和外部存储节点可以部署在两个分开的服务器集群,也可以根据实际需求将日志存储节点合并到外部存储节点中,由外部存储节点实现日志访问接口。
本公开中的原型系统还可以包括与日志协议配套的垃圾回收器,垃圾回收器可以回收已经完成的SSF的存储占用,避免存储资源的需求无限增长。垃圾回收器是一个服务器无感知函数,由服务器无感知计算框架进行调用。调用的频率可以根据需求进行设置,也可以设置为周期性调用。
本公开中,每个SSF实例维护了三个内部变量:步骤序号、内部序列号和历史日志流。在每次对外部状态进行读操作或函数调用操作时,步骤序号增加1。内部序列号是SSF内部使用的序列号,在记录的日志更新时,根据更新后的各个日志的序列号,对内部序列号进行更新。在进行写操作时,SSF的内部序列号可以作为写操作的版本号,根据写操作的版本号和目标对象的版本号判断是否进行写操作。历史日志流是SSF曾经记录过的各个日志。
参照图2所示,示出了本公开实施例中一种有状态的服务器无感知函数的写优化方法的步骤流程图,如图2所示,该有状态的服务器无感知函数的写优化方法具体可以包括步骤S11~步骤S15。
在步骤S11中:在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号。
目标对象可以为SSF进行操作的任一对象。在函数执行节点中,SSF可以针对目标对象进行写操作。因为根据SSF的步骤序号可以查找对应的日志,而写操作的日志不进行记录,因此在执行写操作时不对步骤序号增加1。内部序列号是SSF维护的变量之一,可以直接获取到SSF的内部序列号。
在步骤S12中:将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号。
在进行写操作时,将SSF的内部序列号作为写操作的版本号,根据写操作的版本号判断是否进行当前写操作。
在步骤S13中:获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号。
外部存储节点中存储了单一版本的目标对象,并维护目标对象的版本号。在进行写操作时,可以从外部存储节点中获取目标对象的版本号。
在步骤S14中:在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号。
在写操作的版本号大于目标对象的版本号的情况下,证明当前的写操作还未执行,因此,可以执行当前的写操作,根据当前的写操作对应的目标对象的状态,对外部存储节点中目标对象的状态进行更新,以当前的写操作对应的目标对象的状态,覆盖外部存储节点中目标对象的状态。
在步骤S15中:在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
在写操作的版本号不大于目标对象的版本号的情况下,证明当前的写操作对应的目标对象的状态已经写入了外部存储节点,因此,可以直接跳过当前的写操作。
图3是本公开实施例中写操作的流程图。采用本公开实施例的技术方案,通过写操作的版本号和目标对象的版本号的大小关系,可以避免进行多次相同的写操作,从而保证严格一次语义;在执行写操作的过程中,无需记录写操作的日志,可以大大节省开销。
日志协议中还规定了读操作的执行方法。图4是本公开实施例中读操作的流程图。可选地,在上述技术方案的基础上,SSF在执行读操作时,可以包括步骤S21~步骤S27。
在步骤S21中:在所述有状态的服务器无感知函数针对所述目标对象进行读操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1。
在函数执行节点中,SSF在针对目标对象执行读操作时,首先将步骤序号增加1。
在步骤S22中:获取所述有状态的服务器无感知函数对应的历史日志流。
日志存储节点中存储了各个日志,其中,一个SSF对应的日志包括该SSF的标识;可以是将SSF的标识作为该日志的日志标签。根据SSF的标识在日志存储节点中进行查询,可以获取到SSF对应的历史日志流。
可以获取SSF的标识,并根据SSF的标识在日志存储节点中进行查询,得到SSF的历史日志流。SSF的历史日志流为日志存储节点中记录的总日志流的一个支流,本申请中的总日志流是线性的、序列号单调递增的日志流,支流为该线性的日志流中的部分节点组成的日志流。SSF的历史日志流中的各个历史日志为:当前存储在日志存储节点中的、该SSF所有曾经记录过的日志。SSF的历史日志流中的各个历史日志包括该SSF的标识。
在步骤S23中:根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括所述读操作的日志。
因为日志的序列号是根据步骤序号确定的,因此,可以根据SSF的步骤序号,在历史日志流中进行检索,从而确定历史日志流中是否包括读操作的日志。
在历史日志流中进行查询,在历史日志流中任一日志的序列号,大于等于该读操作的日志的序列号的情况下,证明该读操作的日志已经被记录,历史日志流中包括该读操作的日志。
在步骤S24中:在所述历史日志流中包括所述读操作的日志的情况下,将所述读操作的日志记录的读取结果,作为所述读操作的返回值,并将所述读操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号。
历史日志流中包括读操作的日志,证明读操作已经完成,此时的情况可能是该SSF曾出现故障而后重新执行,在重新执行时与先前的SSF实例出现竞争,有可能重复先前已经完成的读操作。
此时,无需再次进行读操作,可以直接将历史日志流中该读操作的日志记录的读取结果,作为读操作的返回值,并将读操作的日志的序列号,确定为SSF的内部序列号。
在步骤S25中:在所述历史日志流中不包括所述读操作的日志的情况下,读取所述外部存储节点上所述目标对象的实时取值,并根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志。
SSF的历史日志流中不包括读操作的日志,证明读操作还未完成。此时的情况可能是该SSF第一次执行该读操作,也可能是SSF因为网络故障等因素,导致服务器无感知计算框架误以为SSF执行失败,并启动一个新的SSF实例来服务同一个SSF调用,而实际情况是两个SSF示例并发执行,彼此之间存在竞争,导致同一个读操作同一时间被执行两次。因此,在SSF的历史日志流中不包括读操作的日志的情况下,还需要判断该SSF是第一次执行该读操作,还是非第一次执行该读操作。
在读操作还未完成的情况下,首先需要执行当前的读操作,读取外部存储节点上目标对象的实时取值,并根据步骤序号和读取到的实时取值,记录读操作的日志。
在两个SSF示例并发执行读操作的情况下,只需记录一个读操作的日志。因此,为了防止将并发执行的两个SSF各自对应的读操作的日志都进行记录,可以通过条件记录接口判断是否记录读操作的日志。
所述根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志,可以包括步骤S251~步骤S253。
在步骤S251中:将所述实时取值和所述步骤序号输入所述条件记录接口,得到所述条件记录接口以所述实时取值为日志内容,生成的所述读操作的日志,以及根据所述步骤序号确定的条件偏移量。
条件记录接口会先尝试性地记录日志,最后日志是否真实地要记录,根据条件记录接口的判断结果进行确定。
条件记录接口在尝试性地记录读操作的日志时,将输入条件记录接口的实时取值作为日志内容,生成读操作的日志,并根据步骤序号,为生成的读操作的日志确定序列号。其中,一个SSF的步骤序号和该SSF的日志的序列号是一一对应的,二者之间的映射关系可以根据需求进行设置。
条件记录接口根据输入的步骤序号,可以确定条件偏移量。条件偏移量是SSF内部的步骤序号,例如,步骤序号为3,则条件偏移量为3。
在步骤S252中:在所述读操作的日志在所述历史日志流中的实际偏移量,与所述条件偏移量不同的情况下,将所述判断结果确定为不记录所述读操作的日志。
读操作的日志在历史日志流中的实际偏移量,是指将该读操作日志置于该历史日志流中,该读操作的日志在该历史日志流中的排序。
在实际偏移量与条件偏移量不同的情况下,证明该步骤序号对应的日志位置处已经存在其他日志,可能是并行执行的两个SSF中的前一个SSF对应的读操作的日志已经占据了该位置,也就是说,前一个SSF对应的读操作的日志会先被插入历史日志流中,此时,当前的SSF为后一个SSF,因此,当前的SSF对应的读操作的日志无需进行记录,所以将判断结果确定为假,无需记录读操作的日志。
在步骤S253中:在所述实际偏移量与所述条件偏移量相同的情况下,将所述判断结果确定为记录所述读操作的日志。
在实际偏移量与条件偏移量相同的情况下,证明该步骤序号对应的日志位置处不存在其他日志,当前的SSF为第一个执行的SSF,因此,当前SSF对应的读操作的日志需要被记录,所以将判断结果确定为真,需要记录读操作的日志。
在步骤S26中:在所述条件记录接口的判断结果为记录所述读操作的日志的情况下,对所述读操作的日志进行记录,并将所述读操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号。
在条件记录接口的判断结果为需要记录读操作的日志的情况下,则将尝试性记录的读操作的日志作为真实的读操作的日志进行记录,并将读操作的日志插入历史日志流,将读操作的日志的序列号确定为SSF的内部序列号。
在步骤S27中:在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息。
在条件记录接口的判断结果为需要记录读操作的日志的情况下,则将尝试性记录的读操作的日志进行回滚,并输出错误信息。
可选地,在条件记录接口的判断结果为不记录所述读操作的日志的情况下,还可以根据步骤序号,在历史日志流中进行检索,得到该步骤序号对应的日志,从而得到该日志对应的序列号,并根据该日志的序列号更新SSF的内部序列号。
如此,可以通过日志查询接口和条件记录接口,判断是否存在两种破坏幂等性的竞争情况,从而确定是否记录日志,以保证步骤序号和日志的序列号的一一对应关系,进而在之后的读操作步骤时,可以读取到准确的目标对象。
日志协议中还规定了函数调用操作的执行方法。图5是本公开实施例中函数调用操作的流程图。可选地,在上述技术方案的基础上,SSF在执行函数调用操作时,可以包括步骤S31~步骤S38。
在步骤S31中:在有状态的服务器无感知函数调用其他有状态的服务器无感知函数的情况下,将所述有状态的服务器无感知函数的步骤序号增加1。
在函数执行节点中,SSF通过函数控制流接口调用其他SSF,在调用其它SSF时,首先将步骤序号增加1。
在步骤S32中:获取所述其它有状态的服务器无感知函数的标识。
为了保证其它SSF的标识在多次重复执行时也始终取值相同,生成标识的算法应当是确定性算法。
在步骤S33中:获取所述有状态的服务器无感知函数对应的历史日志流。
可以获取SSF的标识,并根据SSF的标识在日志存储节点中进行查询,得到SSF的历史日志流,具体可以参见步骤S22。
在步骤S34中:根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括当前调用日志。
因为日志的序列号是根据步骤序号确定的,因此,可以根据SSF的步骤序号,在历史日志流中进行检索,从而确定历史日志流中是否包括当前调用操作的日志。
在历史日志流中进行查询,在历史日志流中任一日志的序列号,大于等于该读操作的日志的序列号的情况下,证明当前调用操作的日志已经被记录,历史日志流中包括该调用操作的日志。
在步骤S35中:在所述历史日志流中包括所述当前调用日志的情况下,获取所述当前调用日志中记录的所述其它有状态的服务器无感知函数的执行结果,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号。
历史日志流中包括当前调用日志,证明当前调用操作已经完成,可以从当前调用日志中获取该其它SSF的执行结果,并将当前调用日志的序列号确定为SSF的内部序列号。
在步骤S36中:在所述历史日志流中不包括所述当前调用日志的情况下,重新调用所述其它有状态的服务器无感知函数,并获取所述其它有状态的服务器无感知函数返回的执行结果,根据所述执行结果和所述步骤序号,通过条件记录接口判断是否记录所述当前调用日志。
SSF的历史日志流中不包括当前调用日志,可能是被调用的其它SSF中途遭遇故障,需要重新调用该其它SSF,并根据重新调用的其它SSF的执行结果,尝试性生成当前调用日志。根据执行结果和步骤序号,通过条件记录接口判断尝试性生成的当前调用日志是否需要记录。
在步骤S37中:在所述条件记录接口的判断结果为记录所述当前调用日志的情况下,对所述当前调用日志进行记录,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号。
在条件记录接口的判断结果为需要记录当前调用日志的情况下,则将尝试性记录的当前调用日志作为真实的当前调用日志,插入历史日志流,并将当前调用日志的序列号确定为SSF的内部序列号。
在步骤S38中:在所述条件记录接口的判断结果为不记录所述当前调用日志的情况下,输出错误信息。
在条件记录接口的判断结果为不需要记录当前调用日志的情况下,则将尝试性记录的当前调用日志进行回滚,并输出错误信息。
如此,可以对函数调用嵌套的层数进行归纳法论证,可知任意层数的嵌套调用都具有幂等性。对函数调用结果进行日志记录不影响幂等性,其作用主要是在重新执行时可以尽量避免重复深层次的嵌套。
可选地,在上述技术方案的基础上,需要保证重复执行SSF时,初始的内部序列号相同,可以通过初始化操作进行实现。图6是本公开实施例中函数初始化的流程图。函数初始化可以包括:在执行所述有状态的服务器无感知函数之前,对所述有状态的服务器无感知函数的步骤序号进行初始化,得到初始化步骤序号;根据所述有状态的服务器无感知函数的标识,查询日志存储节点中是否存在所述有状态的服务器无感知函数的日志;在所述日志存储节点中存在所述有状态的服务器无感知函数的日志的情况下,将所述有状态的服务器无感知函数的日志中,序列号最小的日志确定为初始化日志;在所述日志存储节点中不存在所述有状态的服务器无感知函数的日志的情况下,根据所述初始化步骤序号,生成所述初始化日志;将所述初始化日志的序列号,确定为所述有状态的服务器无感知函数的初始化内部序列号。
初始化流程先于SSF代码执行。在进行初始化时,可以根据SSF的标识,从日志存储节点获取SSF对应的历史日志流,并进行存储。在后续执行读操作和函数调用操作时,则可以直接获取SSF对应的历史日志流。
步骤序号被初始化为0,并在后续步骤中用作条件记录接口的条件偏移量。之后,通过SSF的标识在日志存储节点中进行查询,获取当前SSF所有曾经记录过的日志,作为历史日志流。如果不曾记录过日志,则使用条件记录接口记录一条初始化日志。该日志的序列号用于初始化内部序列号。如果曾经记录过日志,则所有日志中序列号最小的那个必定是初始化日志,使用该条日志的序列号初始化内部序列号。这保证了SSF无论重复执行多少次,都会使用同样的初始内部序列号。
在上述技术方案的基础上,为了节省存储资源,还可以进行垃圾回收,具体可以包括:通过垃圾回收器检查执行完毕的有状态的服务器无感知函数;通过垃圾回收器删除执行完毕的有状态的服务器无感知函数的相关日志,所述相关日志包括:读操作日志、函数调用日志和初始化日志。
对于所述日志协议来说,需要回收的存储占用包括日志存储节点上的由读操作记录的日志和由函数调用操作记录的日志,以及初始化日志。上述所有日志的生命周期(即在日志存储节点或外部存储节点中驻留的时间)与SSF的生命周期(即SSF从开始执行到完整结束这段时间)相同。因此,在删除上述日志时,垃圾回收器仅需定期检查有哪些SSF完整结束。对于这些SSF,一次性地删除所有相关日志。垃圾回收器是一个服务器无感知函数,可以由服务器无感知计算框架周期性地调用。
本公开的技术方案中,所述写性能最优的日志协议不需要写操作记录日志;相对的,所有读操作都需要记录日志,保存读操作返回的结果。所述日志协议对于外部存储节点上的每个目标对象,同一时间只需要保存单个版本,但是需要维护其版本号。在执行写操作时,所述日志协议会为其赋予一个版本号;更新目标对象时,根据版本号执行条件更新。具体的,将写操作版本号与外部存储节点上保存的当前版本号进行对比。如果写操作版本号大于当前版本号,则更新目标对象和当前版本号;否则跳过本次写操作。这一机制保证了写操作“至多一次”的语义,即幂等性。在所述日志协议下,所有写操作执行下来的效果等效于将写操作按照其版本号排序、依次执行。需要注意的是,上述机制的保证幂等性的前提是:写操作被赋予的版本号具有确定性,即无论SSF重新执行多少次或者以何种并发方式执行,SSF中每个步骤的写操作必须始终使用同样的版本号。
由于写操作不记录日志,自身无法提供确定性,因此必须依赖已有日志的内容,以确定的方式推断版本号。具体的,所述日志协议复用了先前读操作日志的序列号作为版本号,即利用读操作日志持久化的性质保证写操作始终使用相同的版本号进行更新。在这一方案下,SSF内部的使用的序列号是单调递增的,从而写操作的版本号也是单调递增的,从而保证了每个SSF的写操作都会按照其在SSF内部的先后顺序执行。此外,由于读操作会读取实时数据,后续的读操作一定可以观测到先前写操作的结果。
本公开提供的写性能最优的日志协议,在对每次读操作记录日志的前提下,该日志协议可以完全免除写操作记录日志的需要。在保证幂等性的同时,该协议下写操作的运行时开销能够逼近理论上的下界(即不具备严格一次语义、直接更新目标对象的开销)。为了验证所述日志协议的效果,本公开实现了原型系统并使用多种合成负载和应用负载对系统进行了测试。实验结果表明本公开相比于现有技术方案可以将SSF的端到端延迟缩短30%,以及将因记录日志所带来的额外开销缩小2-6倍。
本公开设计的写性能最优日志协议面向的问题场景是:如何在SSF之间高效地共享状态。其中共享的状态是一般性的、可修改的应用状态。在该场景下,所述日志协议具有理论上的最优性,不存在替代方案。在部分场景中,共享状态可能是只读的(即不可修改、只可读取的),或者已经对状态管理进行了封装、对外提供幂等性。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本公开实施例并不受所描述的动作顺序的限制,因为依据本公开实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本公开实施例所必须的。
图7是本发明实施例的一种有状态的服务器无感知函数的写优化装置的结构示意图,如图7所示,所述装置包括序列号获取模块、版本号确定模块、版本号获取模块、更新模块和跳过模块,其中:
序列号获取模块,用于在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;
版本号确定模块,用于将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;
版本号获取模块,用于获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号;
更新模块,用于在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;
跳过模块,用于在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
可选地,所述装置还包括:
第一增加模块,用于在所述有状态的服务器无感知函数针对所述目标对象进行读操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
第一获取模块,用于获取所述有状态的服务器无感知函数对应的历史日志流;
第一查询模块,用于根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括所述读操作的日志;
第一确定模块,用于在所述历史日志流中包括所述读操作的日志的情况下,将所述读操作的日志记录的读取结果,作为所述读操作的返回值,并将所述读操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
第一判断模块,用于在所述历史日志流中不包括所述读操作的日志的情况下,读取所述外部存储节点上所述目标对象的实时取值,并根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志;
第一记录模块,用于在所述条件记录接口的判断结果为记录所述读操作的日志的情况下,对所述读操作的日志进行记录,并将所述读操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第一输出模块,用于在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息。
可选地,所述装置还包括:
第二增加模块,用于在有状态的服务器无感知函数调用其他有状态的服务器无感知函数的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
标识获取模块,用于获取所述其它有状态的服务器无感知函数的标识;
第二获取模块,用于获取所述有状态的服务器无感知函数对应的历史日志流;
第二查询模块,用于根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括当前调用日志;
第二确定模块,用于在所述历史日志流中包括所述当前调用日志的情况下,获取所述当前调用日志中记录的所述其它有状态的服务器无感知函数的执行结果,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第二判断模块,用于在所述历史日志流中不包括所述当前调用日志的情况下,重新调用所述其它有状态的服务器无感知函数,并获取所述其它有状态的服务器无感知函数返回的执行结果,根据所述执行结果和所述步骤序号,通过条件记录接口判断是否记录所述当前调用日志;
第二记录模块,用于在所述条件记录接口的判断结果为记录所述当前调用日志的情况下,对所述当前调用日志进行记录,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第二输出模块,用于在所述条件记录接口的判断结果为不记录所述当前调用日志的情况下,输出错误信息。
可选地,所述装置还包括:
初始化模块,用于在执行所述有状态的服务器无感知函数之前,对所述有状态的服务器无感知函数的步骤序号进行初始化,得到初始化步骤序号;
日志查询模块,用于根据所述有状态的服务器无感知函数的标识,查询日志存储节点中是否存在所述有状态的服务器无感知函数的日志;
初始化日志确定模块,用于在所述日志存储节点中存在所述有状态的服务器无感知函数的日志的情况下,将所述有状态的服务器无感知函数的日志中,序列号最小的日志确定为初始化日志;
初始化日志生成模块,用于在所述日志存储节点中不存在所述有状态的服务器无感知函数的日志的情况下,根据所述初始化步骤序号,生成所述初始化日志;
初始化内部序列号确定模块,用于将所述初始化日志的序列号,确定为所述有状态的服务器无感知函数的初始化内部序列号。
可选地,所述装置还包括:
检查模块,用于通过垃圾回收器检查执行完毕的有状态的服务器无感知函数;
删除模块,用于通过垃圾回收器删除执行完毕的有状态的服务器无感知函数的相关日志,所述相关日志包括:读操作日志、函数调用日志和初始化日志。
可选地,所述第一判断模块具体用于:
将所述实时取值和所述步骤序号输入所述条件记录接口,得到所述条件记录接口以所述实时取值为日志内容,生成的所述读操作的日志,以及根据所述步骤序号确定的条件偏移量;
在所述读操作的日志在所述历史日志流中的实际偏移量,与所述条件偏移量不同的情况下,将所述判断结果确定为不记录所述读操作的日志;
在所述实际偏移量与所述条件偏移量相同的情况下,将所述判断结果确定为记录所述读操作的日志。
可选地,所述第一输出模块具体用于:
在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,对所述条件记录接口生成的所述读操作的日志进行回滚,并输出所述错误信息。
可选地,在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,所述装置还包括:
日志检索模块,用于根据所述步骤序号,在所述历史日志流中进行检索,得到所述步骤序号对应的日志;
日志序列号获取模块,用于获取所述步骤序号对应的日志的序列号。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本公开实施例的实施例可提供为方法、装置或计算机程序产品。因此,本公开实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本公开实施例是参照根据本公开实施例的方法、装置、电子设备和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本公开实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本公开实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本公开所提供的一种有状态的服务器无感知函数的写优化方法和装置,进行了详细介绍,本文中应用了具体个例对本公开的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本公开的方法及其核心思想;同时,对于本领域的一般技术人员,依据本公开的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本公开的限制。
Claims (10)
1.一种有状态的服务器无感知函数的写优化方法,其特征在于,所述方法包括:
在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;
将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;
获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号;
在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;
在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述有状态的服务器无感知函数针对所述目标对象进行读操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
获取所述有状态的服务器无感知函数对应的历史日志流;
根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括所述读操作的日志;
在所述历史日志流中包括所述读操作的日志的情况下,将所述读操作的日志记录的读取结果,作为所述读操作的返回值,并将所述读操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
在所述历史日志流中不包括所述读操作的日志的情况下,读取所述外部存储节点上所述目标对象的实时取值,并根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志;
在所述条件记录接口的判断结果为记录所述读操作的日志的情况下,对所述读操作的日志进行记录,并将所述读操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在有状态的服务器无感知函数调用其他有状态的服务器无感知函数的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
获取所述其它有状态的服务器无感知函数的标识;
获取所述有状态的服务器无感知函数对应的历史日志流;
根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括当前调用日志;
在所述历史日志流中包括所述当前调用日志的情况下,获取所述当前调用日志中记录的所述其它有状态的服务器无感知函数的执行结果,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述历史日志流中不包括所述当前调用日志的情况下,重新调用所述其它有状态的服务器无感知函数,并获取所述其它有状态的服务器无感知函数返回的执行结果,根据所述执行结果和所述步骤序号,通过条件记录接口判断是否记录所述当前调用日志;
在所述条件记录接口的判断结果为记录所述当前调用日志的情况下,对所述当前调用日志进行记录,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述条件记录接口的判断结果为不记录所述当前调用日志的情况下,输出错误信息。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在执行所述有状态的服务器无感知函数之前,对所述有状态的服务器无感知函数的步骤序号进行初始化,得到初始化步骤序号;
根据所述有状态的服务器无感知函数的标识,查询日志存储节点中是否存在所述有状态的服务器无感知函数的日志;
在所述日志存储节点中存在所述有状态的服务器无感知函数的日志的情况下,将所述有状态的服务器无感知函数的日志中,序列号最小的日志确定为初始化日志;
在所述日志存储节点中不存在所述有状态的服务器无感知函数的日志的情况下,根据所述初始化步骤序号,生成所述初始化日志;
将所述初始化日志的序列号,确定为所述有状态的服务器无感知函数的初始化内部序列号。
5.根据权利要求1-4任一所述的方法,其特征在于,所述方法还包括:
通过垃圾回收器检查执行完毕的有状态的服务器无感知函数;
通过垃圾回收器删除执行完毕的有状态的服务器无感知函数的相关日志,所述相关日志包括:读操作日志、函数调用日志和初始化日志。
6.根据权利要求2所述的方法,其特征在于,所述根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志,包括:
将所述实时取值和所述步骤序号输入所述条件记录接口,得到所述条件记录接口以所述实时取值为日志内容,生成的所述读操作的日志,以及根据所述步骤序号确定的条件偏移量;
在所述读操作的日志在所述历史日志流中的实际偏移量,与所述条件偏移量不同的情况下,将所述判断结果确定为不记录所述读操作的日志;
在所述实际偏移量与所述条件偏移量相同的情况下,将所述判断结果确定为记录所述读操作的日志。
7.根据权利要求6所述的方法,其特征在于,所述在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息,包括:
在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,对所述条件记录接口生成的所述读操作的日志进行回滚,并输出所述错误信息。
8.根据权利要求2所述的方法,其特征在于,在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,所述方法还包括:
根据所述步骤序号,在所述历史日志流中进行检索,得到所述步骤序号对应的日志;
获取所述步骤序号对应的日志的序列号。
9.一种有状态的服务器无感知函数的写优化装置,其特征在于,所述装置包括:
序列号获取模块,用于在有状态的服务器无感知函数针对目标对象进行写操作的情况下,获取所述有状态的服务器无感知函数当前的内部序列号;
版本号确定模块,用于将所述有状态的服务器无感知函数当前的内部序列号,确定为所述写操作的版本号;
版本号获取模块,用于获取外部存储节点上所述目标对象的版本号,所述外部存储节点用于存储单一版本的所述目标对象,并维护所述目标对象的版本号;
更新模块,用于在所述写操作的版本号大于所述目标对象的版本号的情况下,更新所述目标对象,并将所述目标对象的版本号更新为所述写操作的版本号;
跳过模块,用于在所述写操作的版本号不大于所述目标对象的版本号的情况下,跳过所述写操作。
10.根据权利要求9所述的装置,其特征在于,所述装置还包括:
第一增加模块,用于在所述有状态的服务器无感知函数针对所述目标对象进行读操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1;
第一获取模块,用于获取所述有状态的服务器无感知函数对应的历史日志流;
第一查询模块,用于根据所述有状态的服务器无感知函数的步骤序号,查询所述历史日志流中是否包括所述读操作的日志;
第一确定模块,用于在所述历史日志流中包括所述读操作的日志的情况下,将所述读操作的日志记录的读取结果,作为所述读操作的返回值,并将所述读操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
第一判断模块,用于在所述历史日志流中不包括所述读操作的日志的情况下,读取所述外部存储节点上所述目标对象的实时取值,并根据所述实时取值和所述步骤序号,通过条件记录接口判断是否记录所述读操作的日志;
第一记录模块,用于在所述条件记录接口的判断结果为记录所述读操作的日志的情况下,对所述读操作的日志进行记录,并将所述读操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第一输出模块,用于在所述条件记录接口的判断结果为不记录所述读操作的日志的情况下,输出错误信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310904722.9A CN116627775B (zh) | 2023-07-24 | 2023-07-24 | 有状态的服务器无感知函数的写优化方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310904722.9A CN116627775B (zh) | 2023-07-24 | 2023-07-24 | 有状态的服务器无感知函数的写优化方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116627775A true CN116627775A (zh) | 2023-08-22 |
CN116627775B CN116627775B (zh) | 2023-09-29 |
Family
ID=87642163
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310904722.9A Active CN116627775B (zh) | 2023-07-24 | 2023-07-24 | 有状态的服务器无感知函数的写优化方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116627775B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101369904A (zh) * | 2007-08-17 | 2009-02-18 | 华为技术有限公司 | 传递业务发现信息的方法、系统及业务发现功能实体 |
CN109739684A (zh) * | 2018-11-20 | 2019-05-10 | 清华大学 | 基于向量时钟的分布式键值数据库的副本修复方法与装置 |
CN114567445A (zh) * | 2022-02-28 | 2022-05-31 | 苏州国芯科技股份有限公司 | 一种验签数据传输方法、装置、设备及介质 |
CN115238006A (zh) * | 2022-07-28 | 2022-10-25 | 腾讯科技(深圳)有限公司 | 检索数据同步方法、装置、设备及计算机存储介质 |
US20230020262A1 (en) * | 2021-07-16 | 2023-01-19 | Samsung Electronics Co., Ltd. | Nonvolatile memory devices having enhanced write drivers therein |
-
2023
- 2023-07-24 CN CN202310904722.9A patent/CN116627775B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101369904A (zh) * | 2007-08-17 | 2009-02-18 | 华为技术有限公司 | 传递业务发现信息的方法、系统及业务发现功能实体 |
CN109739684A (zh) * | 2018-11-20 | 2019-05-10 | 清华大学 | 基于向量时钟的分布式键值数据库的副本修复方法与装置 |
US20230020262A1 (en) * | 2021-07-16 | 2023-01-19 | Samsung Electronics Co., Ltd. | Nonvolatile memory devices having enhanced write drivers therein |
CN114567445A (zh) * | 2022-02-28 | 2022-05-31 | 苏州国芯科技股份有限公司 | 一种验签数据传输方法、装置、设备及介质 |
CN115238006A (zh) * | 2022-07-28 | 2022-10-25 | 腾讯科技(深圳)有限公司 | 检索数据同步方法、装置、设备及计算机存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116627775B (zh) | 2023-09-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8949853B2 (en) | Using stages to handle dependencies in parallel tasks | |
CA3141329A1 (en) | Request link tracking method and service request processing method | |
CN115129736B (zh) | 基于规则引擎的规则事件动态加载与更新方法及相关设备 | |
CN111708586B (zh) | 应用启动配置项加载方法、装置、计算机设备和存储介质 | |
CN110096522B (zh) | 一种支持关系型检索的区块链数据处理方法、装置及设备 | |
US10831565B2 (en) | Fault tolerant adapter system to consume database as a service | |
US20110202564A1 (en) | Data store switching apparatus, data store switching method, and non-transitory computer readable storage medium | |
CN109885642B (zh) | 面向全文检索的分级存储方法及装置 | |
CN113760847A (zh) | 日志数据处理方法、装置、设备及存储介质 | |
CN112612850A (zh) | 数据同步方法及装置 | |
CN113157411B (zh) | 一种基于Celery的可靠可配置任务系统及装置 | |
CN114238085A (zh) | 接口测试方法、装置、计算机设备、存储介质 | |
CN116627775B (zh) | 有状态的服务器无感知函数的写优化方法和装置 | |
CN110362305B (zh) | 一种表单组件状态切换方法及装置 | |
CN116662290B (zh) | 有状态的服务器无感知函数的读优化方法和装置 | |
US8607201B2 (en) | Augmenting visualization of a call stack | |
CN110109986B (zh) | 任务处理方法、系统、服务器及任务调度系统 | |
CN112860844A (zh) | 案件线索处理系统、方法、装置和计算机设备 | |
US10324819B1 (en) | Runtime performance introspection | |
CN111858234A (zh) | 一种任务执行方法、装置、设备、介质 | |
CN113364892A (zh) | 跨多集群服务的域名解析方法、相关方法、装置和系统 | |
US11017032B1 (en) | Document recovery utilizing serialized data | |
CN114185619B (zh) | 基于分布式作业的断点补偿方法、装置、设备及介质 | |
CN111652750B (zh) | 一种用户群组的管理方法、装置、设备及存储介质 | |
CN112433716B (zh) | 基于非侵入式监控的运行时组件动态交互模型构造方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |