CN116662290B - 有状态的服务器无感知函数的读优化方法和装置 - Google Patents

有状态的服务器无感知函数的读优化方法和装置 Download PDF

Info

Publication number
CN116662290B
CN116662290B CN202310904713.XA CN202310904713A CN116662290B CN 116662290 B CN116662290 B CN 116662290B CN 202310904713 A CN202310904713 A CN 202310904713A CN 116662290 B CN116662290 B CN 116662290B
Authority
CN
China
Prior art keywords
log
condition
server
target object
function
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.)
Active
Application number
CN202310904713.XA
Other languages
English (en)
Other versions
CN116662290A (zh
Inventor
金鑫
刘譞哲
祁晟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peking University
Original Assignee
Peking University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Peking University filed Critical Peking University
Priority to CN202310904713.XA priority Critical patent/CN116662290B/zh
Publication of CN116662290A publication Critical patent/CN116662290A/zh
Application granted granted Critical
Publication of CN116662290B publication Critical patent/CN116662290B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/10File systems; File servers
    • G06F16/18File system types
    • G06F16/1805Append-only file systems, e.g. using logs or journals to store data
    • G06F16/1815Journaling file systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/21Design, administration or maintenance of databases
    • G06F16/219Managing data history or versioning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24553Query execution of query operations
    • YGENERAL 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
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE 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/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Linguistics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本公开提供了一种有状态的服务器无感知函数的读优化方法和装置,涉及计算机技术领域,旨在免除读操作日志的情况下,实现严格一次语义。所述方法包括:在有状态的服务器无感知函数针对目标对象进行读操作的情况下,获取所述目标对象的标识;获取所述有状态的服务器无感知函数的内部序列号;根据所述目标对象的标识,从日志存储节点中获取所述目标对象对应的日志支流;根据所述内部序列号在所述日志支流中查询,得到目标日志,所述目标日志的序列号为:小于或等于所述有状态的服务器无感知函数的内部序列号的各个序列号中最大的序列号;获取所述目标日志记录的所述目标对象的版本号;从外部存储节点中读取所述版本号对应的所述目标对象的取值。

Description

有状态的服务器无感知函数的读优化方法和装置
技术领域
本公开涉及计算机技术领域,特别是涉及一种有状态的服务器无感知函数的读优化方法和装置。
背景技术
服务器无感知计算是是云计算的重要发展方向之一,服务器无感知计算以函数为中心,开发者只需专注于编写云函数来实现应用逻辑,而应用的部署则由计算服务的提供者完成。服务器无感知计算中的计算资源可以独立于长期的存储资源进行细粒度的配置。该架构能够很好地适配无状态的服务器无感知函数。
由于可能出现的负载平衡和资源弹性伸缩,有状态的服务器无感知函数(Stateful Serverless Function,SSF)的本地状态无法保证在函数调用之间持久化地保存。因此,为了在多个函数之间共享状态,SSF需要依赖外部存储进行状态管理。
SSF在执行过程中可能出现的故障,给将SSF的状态管理卸载到外部存储给应用层面的容错带来了挑战。虽然SSF能够被分解为无状态函数和外部状态,但实现SSF的容错并不等同于分别实现每个部分的容错。无状态函数的容错可以通过重新执行先前因故障而失败的函数来实现,而外部状态的容错可以通过对外部状态进行持久化来实现。然而简单将二者结合无法在应用层面提供容错。假设一个SSF先对外部状态执行了一个写入操作,然后遭遇故障。重新执行这个函数会重复先前写操作,从而导致应用状态出现不一致,例如重复增加了计数器或者多次从消息队列中获取消息。
相关技术为了实现严格一次语义,通常通过记录日志来实现,其核心思路是将重新执行所提供的至少一次语义与幂等性相结合。在每次对外部状态进行读操作时,都会记录一次日志,在重新执行读操作过程中,SSF会对读操作日志进行回放,从而恢复先前读取的结果,并跳过已完成的操作。上述机制可以提供幂等性,结合重新执行即可得到严格一次语义。然而,相关技术记录日志的方法会高达30%~50%的开销。
发明内容
鉴于上述问题,本公开实施例提供了一种有状态的服务器无感知函数的读优化方法和装置,以便克服上述问题或者至少部分地解决上述问题。
根据本公开实施例的第一方面,提供一种有状态的服务器无感知函数的读优化方法,所述方法包括:
在有状态的服务器无感知函数针对目标对象进行读操作的情况下,获取所述目标对象的标识;
获取所述有状态的服务器无感知函数的内部序列号;
根据所述目标对象的标识,从日志存储节点中获取所述目标对象对应的日志支流;
根据所述内部序列号在所述日志支流中查询,得到目标日志,所述目标日志的序列号为:小于或等于所述有状态的服务器无感知函数的内部序列号的各个序列号中最大的序列号;
获取所述目标日志记录的所述目标对象的版本号;
从外部存储节点中读取所述版本号对应的所述目标对象的取值。
可选地,所述方法还包括:
在所述有状态的服务器无感知函数针对所述目标对象进行写操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1,并获取所述有状态的服务器无感知函数的标识;
根据所述有状态的服务器无感知函数的标识,从所述日志存储节点中获取所述有状态的服务器无感知函数对应的历史日志流;
根据所述步骤序号,查询所述历史日志流中是否包括所述写操作的日志;
在所述历史日志流中包括所述写操作的日志的情况下,将所述写操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
在所述历史日志流中不包括所述写操作的日志的情况下,在所述外部存储节点中写入新版本的目标对象,并根据所述新版本的目标对象的版本号和所述步骤序号,通过条件记录接口判断是否记录所述写操作的日志;
在所述条件记录接口的判断结果为记录所述写操作的日志的情况下,对所述写操作的日志进行记录,并将所述写操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,输出错误信息。
可选地,所述方法还包括:
在所述有状态的服务器无感知函数调用其它有状态的服务器无感知函数的情况下,将所述有状态的服务器无感知函数的步骤序号增加1,并获取所述有状态的服务器无感知函数的标识;
获取所述其它有状态的服务器无感知函数的标识;
根据所述有状态的服务器无感知函数的标识,从所述日志存储节点中获取所述有状态的服务器无感知函数对应的历史日志流;
根据所述步骤序号,查询所述历史日志流中是否包括当前调用日志;
在所述历史日志流中包括所述当前调用日志的情况下,获取所述当前调用日志中记录的所述其它有状态的服务器无感知函数的执行结果,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述历史日志流中不包括所述当前调用日志的情况下,重新调用所述其它有状态的服务器无感知函数,并获取所述其它有状态的服务器无感知函数返回的执行结果,根据所述执行结果和所述步骤序号,通过条件记录接口判断是否记录所述当前调用日志;
在所述条件记录接口的判断结果为记录所述当前调用日志的情况下,对所述当前调用日志进行记录,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
在所述条件记录接口的判断结果为不记录所述当前调用日志的情况下,输出错误信息。
可选地,所述方法还包括:
在执行所述有状态的服务器无感知函数之前,获取所述有状态的服务器无感知函数的标识,以及对所述有状态的服务器无感知函数的步骤序号进行初始化,得到初始化步骤序号;
根据所述有状态的服务器无感知函数的标识,查询日志存储节点中是否存在所述有状态的服务器无感知函数的日志;
在所述日志存储节点中存在所述有状态的服务器无感知函数的日志的情况下,将所述有状态的服务器无感知函数的日志中,序列号最小的日志确定为初始化日志;
在所述日志存储节点中不存在所述有状态的服务器无感知函数的日志的情况下,根据所述初始化步骤序号,生成所述初始化日志;
将所述初始化日志的序列号,确定为所述有状态的服务器无感知函数的初始化内部序列号。
可选地,所述方法还包括:
通过垃圾回收器删除已执行完成的有状态的服务器无感知函数对应的调用日志和初始化日志;
通过垃圾回收器删除满足删除条件的目标对象,以及删除满足所述删除条件的目标对象对应的写操作的日志;
满足所述删除条件的写操作的目标对象为:非最高版本号的目标对象,且针对所述非最高版本号的目标对象的调用已经执行完毕。
可选地,所述根据所述新版本的目标对象的版本号和所述步骤序号,通过条件记录接口判断是否记录所述写操作的日志,包括:
将所述新版本的目标对象的版本号和所述步骤序号输入所述条件记录接口,得到所述条件记录接口以所述新版本的目标对象的版本号作为日志内容,生成的所述写操作的日志,以及根据所述步骤序号确定的条件偏移量;
在所述写操作的日志在所述历史日志流中的实际偏移量,与所述条件偏移量不同的情况下,将所述判断结果确定为不记录所述写操作的日志;
在所述实际偏移量与所述条件偏移量相同的情况下,将所述判断结果确定为记录所述写操作的日志。
可选地,所述在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,输出错误信息,包括:
在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,对所述条件记录接口生成的所述写操作的日志进行回滚,并输出所述错误信息。
可选地,在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,所述方法还包括:
根据所述步骤序号,在所述历史日志流中进行检索,得到所述步骤序号对应的日志;
获取所述步骤序号对应的日志的序列号。
根据本公开实施例的第二方面,提供一种有状态的服务器无感知函数的读优化装置,所述装置包括:
标识获取模块,用于在有状态的服务器无感知函数针对目标对象进行读操作的情况下,获取所述目标对象的标识;
内部序列号获取模块,用于获取所述有状态的服务器无感知函数的内部序列号;
支流获取模块,用于根据所述目标对象的标识,从日志存储节点中获取所述目标对象对应的日志支流;
查询模块,用于根据所述内部序列号在所述日志支流中查询,得到目标日志,所述目标日志的序列号为:小于或等于所述有状态的服务器无感知函数的内部序列号的各个序列号中最大的序列号;
版本号获取模块,用于获取所述目标日志记录的所述目标对象的版本号;
读取模块,用于从外部存储节点中读取所述版本号对应的所述目标对象的取值。
可选地,所述装置还包括:
第一增加模块,用于在所述有状态的服务器无感知函数针对所述目标对象进行写操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1,并获取所述有状态的服务器无感知函数的标识;
第一获取模块,用于根据所述有状态的服务器无感知函数的标识,从所述日志存储节点中获取所述有状态的服务器无感知函数对应的历史日志流;
第一查询模块,用于根据所述步骤序号,查询所述历史日志流中是否包括所述写操作的日志;
第一确定模块,用于在所述历史日志流中包括所述写操作的日志的情况下,将所述写操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
第一判断模块,用于在所述历史日志流中不包括所述写操作的日志的情况下,在所述外部存储节点中写入新版本的目标对象,并根据所述新版本的目标对象的版本号和所述步骤序号,通过条件记录接口判断是否记录所述写操作的日志;
第一记录模块,用于在所述条件记录接口的判断结果为记录所述写操作的日志的情况下,对所述写操作的日志进行记录,并将所述写操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第一输出模块,用于在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,输出错误信息。
根据本公开实施例的第三方面,提供一种电子设备,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以实现如第一方面所述的有状态的服务器无感知函数的读优化方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得所述电子设备能够执行如第一方面所述的有状态的服务器无感知函数的读优化方法。
本公开实施例包括以下优点:
本公开实施例中,有状态的服务器无感知函数针对目标对象进行读操作时,可以根据目标对象的标识在日志存储节点中进行查询,得到目标对象对应的日志支流,并根据有状态的服务器无感知函数的内部序列号在日志支流中进行查询,得到目标日志,进而得到目标对象的版本号,从而根据目标对象的版本号从外部存储节点中读取到对应的目标对象的取值。如此,无论在第几次执行读操作的情况下,都可以仅仅根据有状态的服务器无感知函数的内部序列号,查询到目标对象的版本号,进而读取到正确版本的目标对象的取值,实现严格一次语义;并且,在进行读操作时,无需创建读操作日志,可以有效节省开销。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对本公开实施例的描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本公开实施例中读性能最优日志协议的原型系统的模块图;
图2是本公开实施例中一种有状态的服务器无感知函数的读优化方法的步骤流程图;
图3是本公开实施例中读操作的流程图;
图4是本公开实施例中写操作的流程图;
图5是本公开实施例中函数调用操作的流程图;
图6是本公开实施例中函数初始化的流程图。
具体实施方式
为使本公开的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本公开作进一步详细的说明。
为了在节省开销的情况下面向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曾经记录过的各个日志。
参照图2所示,示出了本公开实施例中一种有状态的服务器无感知函数的读优化方法的步骤流程图,如图2所示,该有状态的服务器无感知函数的读优化方法具体可以包括步骤S11~步骤S16。
在步骤S11中:在有状态的服务器无感知函数针对目标对象进行读操作的情况下,获取所述目标对象的标识。
目标对象可以为SSF进行操作的任一对象。函数执行节点中,SSF在针对目标对象进行读操作时,可以获取目标对象的标识。
在步骤S12中:获取所述有状态的服务器无感知函数的内部序列号。
SSF的内部序列号与记录的日志的序列号对应。因为SSF对应的各个日志只包括写操作的日志和函数调用操作的日志,而不包括读操作日志。因此,一个步骤中SSF的内部序列号是:执行该步骤操作之前的写操作或函数调用操作对应的日志的序列号。
日志的序列号根据SSF的步骤序号生成。读操作不记录日志,SSF的步骤序号也只在执行写操作和函数调用操作时才增加1。因为SSF的内部序列号是根据日志的序列号确定的,因此,在当前步骤根据内部序列号,可以读取到最新记录的日志。
在步骤S13中:根据所述目标对象的标识,从日志存储节点中获取所述目标对象对应的日志支流。
针对目标对象执行的操作生成的日志,包括目标对象的标识,可以是将目标对象的标识作为日志的日志标签。根据目标对象的标识在日志存储节点中进行查询,可以获取到目标对象对应的日志支流,该日志支流包括目标对象的标识。
在步骤S14中:根据所述内部序列号在所述日志支流中查询,得到目标日志。
所述目标日志的序列号为:小于或等于所述有状态的服务器无感知函数的内部序列号的各个序列号中最大的序列号。
将内部序列号作为查询序列号,在目标对象对应的日志支流中进行查询,可以得到目标日志,目标日志的序列号是:在目标对象对应的日志支流上进行后向检索,得到的小于或等于查询序列号的、最大的目标序列号。目标日志为SSF在执行当前读操作之前执行的写操作的日志,目标日志的日志内容记录了要读取的目标对象的版本号。
在步骤S15中:获取所述目标日志记录的所述目标对象的版本号。
在查询到目标日志后,可以输出目标日志的序列号和目标日志的日志内容,目标日志的日志内容记录了目标对象的版本号。因为外部存储节点为多版本存储,因此,需要目标对象的版本号,才能从外部存储节点中读取到正确版本的目标对象的取值。
在步骤S16中:从外部存储节点中读取所述版本号对应的所述目标对象的取值。
根据目标日志中记录的目标对象的版本号,可以从外部存储节点中读取该版本号对应的的目标对象的状态。
例如,在SSF的第一个步骤中:在外部存储节点中写入了1.0版本的目标对象,并记录序列号为1的写操作的日志;在第二个步骤中:在外部存储节点中写入了2.0版本的目标对象,并记录序列号为2的写操作的日志;在第三个步骤中:根据SSF的内部序列号,获取到序列号为2的写操作的日志,并从该写操作的日志中获取版本号2.0,则从外部存储节点中读取2.0版本的目标对象的取值。
图3是本公开实施例中读操作的流程图。采用本公开实施例的技术方案,无论在第几次执行读操作的情况下,都可以仅仅根据有状态的服务器无感知函数的内部序列号,查询到目标对象的版本号,进而读取到正确版本的目标对象的取值,实现严格一次语义;并且,在进行读操作时,无需创建读操作日志,可以有效节省开销。
读操作读取的是之前写入的内容,因此,为了和读操作进行配套,日志协议中还规定了写操作的执行方法。图4是本公开实施例中写操作的流程图。可选地,在上述技术方案的基础上,SSF在执行写操作时,可以包括步骤S21~步骤S27。
在步骤S21中:在所述有状态的服务器无感知函数针对所述目标对象进行写操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加1,并获取所述有状态的服务器无感知函数的标识。
在函数执行节点中,SSF在针对目标对象执行写操作时,首先将步骤序号增加1,并获取SSF的标识。
在步骤S22中:根据所述有状态的服务器无感知函数的标识,从所述日志存储节点中获取所述有状态的服务器无感知函数对应的历史日志流。
日志存储节点中存储了各个日志,其中,一个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的日志的序列号是一一对应的,二者之间的映射关系可以根据需求进行设置。
在步骤S252中:在所述写操作的日志在所述历史日志流中的实际偏移量,与所述条件偏移量不同的情况下,将所述判断结果确定为不记录所述写操作的日志。
条件偏移量是SSF内部的步骤序号,例如,步骤序号为3,则条件偏移量为3。写操作的日志在历史日志流中的实际偏移量,是指将该写操作的日志置于该历史日志流中,该写操作的日志在该历史日志流中的排序。
在实际偏移量与条件偏移量不同的情况下,证明该步骤序号对应的日志位置处已经存在其他日志,可能是并行执行的两个SSF中的前一个SSF对应的写操作的日志已经占据了该位置,也就是说,前一个SSF对应的写操作的日志会先被插入历史日志流中,此时,当前的SSF为后一个SSF,因此,当前的SSF对应的写操作的日志无需进行记录,所以将判断结果确定为假,无需记录写操作的日志。
在步骤S253中:在所述实际偏移量与所述条件偏移量相同的情况下,将所述判断结果确定为记录所述写操作的日志。
在实际偏移量与条件偏移量相同的情况下,证明该步骤序号对应的日志位置处不存在其他日志,当前的SSF为第一个执行的SSF,因此,当前SSF对应的写操作的日志需要被记录,所以将判断结果确定为真,需要记录写操作的日志。
在步骤S26中:在所述条件记录接口的判断结果为记录所述写操作的日志的情况下,对所述写操作的日志进行记录,并将所述写操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号。
在条件记录接口的判断结果为需要记录写操作的日志的情况下,则将尝试性记录的写操作的日志作为真实的写操作的日志,插入历史日志流,并将写操作的日志的序列号确定为SSF的内部序列号。
在步骤S27中:在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,输出错误信息。
在条件记录接口的判断结果为需要记录写操作的日志的情况下,则将尝试性记录的写操作的日志进行回滚,并输出错误信息。
可选地,在条件记录接口的判断结果为不记录所述写操作的日志的情况下,还可以根据步骤序号,在历史日志流中进行检索,得到该步骤序号对应的日志,从而得到该日志对应的序列号,并根据该日志的序列号更新SSF的内部序列号。
如此,可以通过日志查询接口和条件记录接口,判断是否存在两种破坏幂等性的竞争情况,从而确定是否记录日志,以保证步骤序号和日志的序列号的一一对应关系,进而在之后的读操作步骤时,可以读取到准确的目标对象。
日志协议中还规定了函数调用操作的执行方法。图5是本公开实施例中函数调用操作的流程图。可选地,在上述技术方案的基础上,SSF在执行函数调用操作时,可以包括步骤S31~步骤S38。
在步骤S31中:在所述有状态的服务器无感知函数调用其它有状态的服务器无感知函数的情况下,将所述有状态的服务器无感知函数的步骤序号增加1,并获取所述有状态的服务器无感知函数的标识。
在函数执行节点中,SSF通过函数控制流接口调用其他SSF,在调用其它SSF时,首先将步骤序号增加1,并获取SSF的标识。
在步骤S32中:获取所述其它有状态的服务器无感知函数的标识。
为了保证其它SSF的标识在多次重复执行时也始终取值相同,生成标识的算法应当是确定性算法。
在步骤S33中:根据所述有状态的服务器无感知函数的标识,从所述日志存储节点中获取所述有状态的服务器无感知函数对应的历史日志流。
此步骤可以参照步骤S22。
在步骤S34中:根据所述步骤序号,查询所述历史日志流中是否包括当前调用日志。
因为日志的序列号是根据步骤序号确定的,因此,可以根据SSF的步骤序号,确定当前调用操作对应的当前调用日志的序列号。
在历史日志流中进行查询,在历史日志流中任一日志的序列号,等于该当前调用日志的序列号的情况下,证明该当前调用日志已经被记录,历史日志流中包括该当前调用日志。
在步骤S35中:在所述历史日志流中包括所述当前调用日志的情况下,获取所述当前调用日志中记录的所述其它有状态的服务器无感知函数的执行结果,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号。
历史日志流中包括当前调用日志,证明当前调用操作已经完成,可以从当前调用日志中获取该其它SSF的执行结果,并将当前调用日志的序列号确定为SSF的内部序列号。
在步骤S36中:在所述历史日志流中不包括所述当前调用日志的情况下,重新调用所述其它有状态的服务器无感知函数,并获取所述其它有状态的服务器无感知函数返回的执行结果,根据所述执行结果和所述步骤序号,通过条件记录接口判断是否记录所述当前调用日志。
SSF的历史日志流中不包括当前调用日志,可能是被调用的其它SSF中途遭遇故障,需要重新调用该其它SSF。并根据重新调用的其它SSF的执行结果,尝试性生成当前调用日志。根据执行结果和步骤序号,通过条件记录接口判断尝试性生成的当前调用日志是否需要记录。
在步骤S37中:在所述条件记录接口的判断结果为记录所述当前调用日志的情况下,对所述当前调用日志进行记录,并将所述当前调用日志的序列号确定为所述有状态的服务器无感知函数的内部序列号。
在条件记录接口的判断结果为需要记录当前调用日志的情况下,则将尝试性记录的当前调用日志作为真实的当前调用日志,插入历史日志流,并将当前调用日志的序列号确定为SSF的内部序列号。
在步骤S38中:在所述条件记录接口的判断结果为不记录所述当前调用日志的情况下,输出错误信息。
在条件记录接口的判断结果为不需要记录当前调用日志的情况下,则将尝试性记录的当前调用日志进行回滚,并输出错误信息。
如此,可以对函数调用嵌套的层数进行归纳法论证,可知任意层数的嵌套调用都具有幂等性。对函数调用结果进行日志记录不影响幂等性,其作用主要是在重新执行时可以尽量避免重复深层次的嵌套。
可选地,在上述技术方案的基础上,需要保证重复执行SSF时,初始的内部序列号相同,可以通过初始化操作进行实现。图6是本公开实施例中函数初始化的流程图。函数初始化可以包括:在执行所述有状态的服务器无感知函数之前,获取所述有状态的服务器无感知函数的标识,以及对所述有状态的服务器无感知函数的步骤序号进行初始化,得到初始化步骤序号;根据所述有状态的服务器无感知函数的标识,查询日志存储节点中是否存在所述有状态的服务器无感知函数的日志;在所述日志存储节点中存在所述有状态的服务器无感知函数的日志的情况下,将所述有状态的服务器无感知函数的日志中,序列号最小的日志确定为初始化日志;在所述日志存储节点中不存在所述有状态的服务器无感知函数的日志的情况下,根据所述初始化步骤序号,生成所述初始化日志;将所述初始化日志的序列号,确定为所述有状态的服务器无感知函数的初始化内部序列号。
初始化流程先于SSF代码执行。在进行初始化时,可以获取SSF的标识,并根据SSF的标识,从日志存储节点获取SSF对应的历史日志流,并进行存储。在后续执行读操作、写操作和函数调用操作时,则可以直接获取SSF对应的历史日志流。
在进行初始化时,步骤序号被初始化为0,并在后续步骤中用作条件记录接口的条件偏移量。之后,通过SSF的标识在日志存储节点中进行查询,获取当前SSF所有曾经记录过的日志,作为历史日志流。如果不曾记录过日志,则使用条件记录接口记录一条初始化日志。该日志的序列号用于初始化内部序列号。如果曾经记录过日志,则所有日志中序列号最小的那个必定是初始化日志,使用该条日志的序列号初始化内部序列号。这保证了SSF无论重复执行多少次,都会使用同样的初始内部序列号。
在上述技术方案的基础上,为了节省存储资源,还可以进行垃圾回收,具体可以包括:通过垃圾回收器删除已执行完成的有状态的服务器无感知函数对应的调用日志和初始化日志;通过垃圾回收器删除满足删除条件的目标对象,以及删除满足所述删除条件的目标对象对应的写操作的日志;满足所述删除条件的写操作的目标对象为:非最高版本号的目标对象,且针对所述非最高版本号的目标对象的调用已经执行完毕。
对于所述日志协议来说,需要回收的存储占用包括日志存储节点上的初始化日志、写操作的日志、函数调用操作记录的日志,以及外部存储节点上由写操作创建的各个版本的目标对象。其中写操作的日志和对象版本的生命周期(即在日志存储节点或外部存储节点中驻留的时间)相同,应当包含当前SSF生命周期(即SSF从开始执行到完整结束这段时间),并且包含所有可能读到该写操作创建对象版本的SSF的生命周期。其余部分,即函数调用操作记录的日志以及初始化日志的生命周期和SSF生命周期相同。
具体的,回收函数调用操作记录的日志以及初始化日志时,垃圾回收器只需要定期检查有哪些SSF完成了执行,并一次性地将相关日志删除。
具体的,回收写操作的日志以及外部存储节点上相应对象版本之前,垃圾回收器需对如下删除条件进行检查:
a、存在一个更高版本的目标对象,即该版本对应的写操作的日志具有更大的序列号;
b、所有在该更高版本号被创建之前就开始执行的SSF都已经完整结束,即,调用非最新版本的对象的函数,都执行完毕了。
a、b两个条件相结合保证了后续SSF不会读到被回收的版本。具体的,垃圾回收器每次运行时,会检查满足条件的、当前最大的序列号。在垃圾回收器下次运行时,依然会检查满足条件的、当前最大的序列号。在垃圾回收器当次检查到的当前最大的序列号,与上次检查到的最大的序列号不同的情况下,垃圾回收器会检查所有写操作的日志,找出序列号位于当前最大的序列号和上次检查到的最大的序列号之间的写操作的日志。最后,垃圾回收器会将所有序列号小于写操作的日志的序列号的写操作的日志,以及对应版本的目标对象进行删除。
本公开的技术方案中,所述读性能最优的日志协议使用多版本的方式处理写操作。对于读操作,则通过日志流所给出的全序关系,将每个读操作以确定的映射关系映射到某个写操作(所创建的版本)上。写操作需要记录日志,使得写操作的元数据(例如版本号)对读操作可见。为了将读操作映射到写操作上,需要通过根据所述日志访问接口中的日志查询接口对写操作记录的日志进行查询。这一过程需要读操作提供查询标签(即目标对象的标识)以及查询序列号。需要注意的是,为了让读操作到写操作的映射关系具有确定性,读操作提供的查询序列号必须是确定的,即无论SSF重新执行多少次或者以何种并发方式执行,SSF中每个步骤的读操作必须始终使用同样的查询序列号。
由于读操作不记录日志,因此读操作无法像写操作一样显式地获取序列号并以日志的形式将序列号持久化。考虑到可能出现的故障,为了满足确定性的要求,所述日志协议复用了先前写操作的序列号,即利用写操作的日志持久化的性质保证读操作始终使用相同的序列号进行查询。在这一方案下,SSF内部的使用的序列号是单调递增的,并且后续的读操作一定可以观测到先前写操作的结果。
所述日志协议不需要读操作日志。相较于使用原生读操作直接读取,所述日志协议只需要引入一次日志查询接口的开销。和记录一次日志相比,查询一次日志的开销往往可以忽略。在本公开的原型系统中,记录一次日志的开销为1.18毫秒,查询一次日志的开销为0.12毫秒,而原生读操作的开销为1.88毫秒。因此,所述日志协议提供的读性能接近理论上的最优值。
日志存储节点保证了日志的容错性,因此记录过的日志不会丢失。在此基础上,每个对外部状态的写操作或者函数调用操作都会首先查看历史日志,避免了第一类竞争情况。在历史日志中不包含当前步骤日志的情况下,所述日志协议通过条件记录接口记录日志,从而避免了第二类竞争情况。
具体的,对于写操作来说,有且仅有一次写操作能成功创建目标对象的版本并将其版本号以日志的形式公布给后续读操作。对于读操作来说,通过归纳法可知,其在日志查询接口中使用的查询序列号无论重复执行多少次都是确定的,因为本质上读操作使用的内部序列号是由先前记录的日志的序列号确定的,而所述日志协议通过避免两类竞争情况使得这些日志一旦记录成功便是唯一确定的。对于函数调用操作来说,可以对函数调用嵌套的层数进行归纳法论证,可知任意层数的嵌套调用都具有幂等性。对函数调用结果进行日志记录不影响幂等性,其作用主要是在重新执行时可以尽量避免重复深层次的嵌套。
为了验证所述日志协议的效果,本公开实现了原型系统,并使用多种合成负载和应用负载对系统进行了测试。实验结果表明本公开的技术方案相比于现有技术方案可以将SSF的端到端延迟缩短30%,以及将因记录日志所带来的额外开销缩小4-5倍。
本公开设计的读性能最优日志协议面向的应用场景是:如何在SSF之间高效地共享状态。其中共享的状态是一般性的、可修改的应用状态。在该场景下,所述日志协议具有理论上的最优性,不存在替代方案。在部分场景中,共享状态可能是只读的(即不可修改、只可读取的),或者已经对状态管理进行了封装、对外提供幂等性。对于这些场景下不需要使用本公开所述日志协议。对于某些服务器无感知应用来说,其应用逻辑可以在一定程度下容许非严格一次的语义,例如消息队列中的重复消息。这些应用同样不需要使用所述日志协议。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本公开实施例并不受所描述的动作顺序的限制,因为依据本公开实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本公开实施例所必须的。
本发明实施例还提供了一种有状态的服务器无感知函数的读优化装置,所述装置包括标识获取模块、内部序列号获取模块、支流获取模块、查询模块、版本号获取模块和读取模块,其中:
标识获取模块,用于在有状态的服务器无感知函数针对目标对象进行读操作的情况下,获取所述目标对象的标识;
内部序列号获取模块,用于获取所述有状态的服务器无感知函数的内部序列号;
支流获取模块,用于根据所述目标对象的标识,从日志存储节点中获取所述目标对象对应的日志支流;
查询模块,用于根据所述内部序列号在所述日志支流中查询,得到目标日志,所述目标日志的序列号为:小于或等于所述有状态的服务器无感知函数的内部序列号的各个序列号中最大的序列号;
版本号获取模块,用于获取所述目标日志记录的所述目标对象的版本号;
读取模块,用于从外部存储节点中读取所述版本号对应的所述目标对象的取值。
可选地,所述装置还包括:
第一增加模块,用于在所述有状态的服务器无感知函数针对所述目标对象进行写操作的情况下,将所述有状态的服务器无感知函数的步骤序号增加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,并获取所述有状态的服务器无感知函数的标识;
第一获取模块,用于根据所述有状态的服务器无感知函数的标识,从所述日志存储节点中获取所述有状态的服务器无感知函数对应的历史日志流;
第一查询模块,用于根据所述步骤序号,查询所述历史日志流中是否包括所述写操作的日志;
第一确定模块,用于在所述历史日志流中包括所述写操作的日志的情况下,将所述写操作的日志的序列号,确定为所述有状态的服务器无感知函数的内部序列号;
第一判断模块,用于在所述历史日志流中不包括所述写操作的日志的情况下,在所述外部存储节点中写入新版本的目标对象,并根据所述新版本的目标对象的版本号和所述步骤序号,通过条件记录接口判断是否记录所述写操作的日志;
第一记录模块,用于在所述条件记录接口的判断结果为记录所述写操作的日志的情况下,对所述写操作的日志进行记录,并将所述写操作的日志的序列号确定为所述有状态的服务器无感知函数的内部序列号;
第一输出模块,用于在所述条件记录接口的判断结果为不记录所述写操作的日志的情况下,输出错误信息。
CN202310904713.XA 2023-07-24 2023-07-24 有状态的服务器无感知函数的读优化方法和装置 Active CN116662290B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310904713.XA CN116662290B (zh) 2023-07-24 2023-07-24 有状态的服务器无感知函数的读优化方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310904713.XA CN116662290B (zh) 2023-07-24 2023-07-24 有状态的服务器无感知函数的读优化方法和装置

Publications (2)

Publication Number Publication Date
CN116662290A CN116662290A (zh) 2023-08-29
CN116662290B true CN116662290B (zh) 2023-09-29

Family

ID=87717318

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310904713.XA Active CN116662290B (zh) 2023-07-24 2023-07-24 有状态的服务器无感知函数的读优化方法和装置

Country Status (1)

Country Link
CN (1) CN116662290B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116126488A (zh) * 2022-12-02 2023-05-16 中国科学院深圳先进技术研究院 一种服务器无感知计算自适应资源调度方法、系统及计算机设备
CN116302404A (zh) * 2023-02-16 2023-06-23 北京大学 面向资源解耦合数据中心的服务器无感知计算调度方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11449508B2 (en) * 2020-05-05 2022-09-20 Microsoft Technology Licensing, Llc Serverless data lake indexing subsystem and application programming interface
US20230119552A1 (en) * 2022-12-20 2023-04-20 Kshitij Arun Doshi Resource management mechanisms for stateful serverless clusters in edge computing

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116126488A (zh) * 2022-12-02 2023-05-16 中国科学院深圳先进技术研究院 一种服务器无感知计算自适应资源调度方法、系统及计算机设备
CN116302404A (zh) * 2023-02-16 2023-06-23 北京大学 面向资源解耦合数据中心的服务器无感知计算调度方法

Also Published As

Publication number Publication date
CN116662290A (zh) 2023-08-29

Similar Documents

Publication Publication Date Title
CA3141329A1 (en) Request link tracking method and service request processing method
CN110162512B (zh) 一种日志检索方法、装置及存储介质
CN109766330B (zh) 数据分片方法、装置、电子设备及存储介质
JP5543333B2 (ja) クラスタ化されたソフトウェアエンティティのための動的cliマッピング
CN101308471B (zh) 一种恢复数据的方法及装置
CN106874281B (zh) 实现数据库读写分离的方法和装置
CN101000619A (zh) 基于sql的数据同步方法及装置
CN111752945B (zh) 一种基于容器和层次模型的时序数据库数据交互方法和系统
US20110202564A1 (en) Data store switching apparatus, data store switching method, and non-transitory computer readable storage medium
CN113760847A (zh) 日志数据处理方法、装置、设备及存储介质
CN113326264A (zh) 数据处理方法、服务器及存储介质
CN110430255A (zh) 分布式集群中服务请求的处理方法、系统以及电子设备
CN113704790A (zh) 一种异常日志信息汇总方法及计算机设备
CN116662290B (zh) 有状态的服务器无感知函数的读优化方法和装置
CN116701063A (zh) 数联网数据语用内存状态数据的持久化方法、装置及系统
CN116627775B (zh) 有状态的服务器无感知函数的写优化方法和装置
KR20170130911A (ko) Dds-dbms 연동 도구의 실시간 변경 데이터 발간 서비스 수행 방법
CN115544169A (zh) 一种数据同步方法、装置、设备及存储介质
CN116048609A (zh) 配置文件更新方法、装置、计算机设备和存储介质
CN111400243B (zh) 基于流水线服务的研发管理系统以及文件存储方法、装置
CN114416689A (zh) 数据迁移方法、装置、计算机设备、存储介质
CN113687935A (zh) 一种基于超融合设计的云原生存储调度方式
EP3046307B1 (en) Processing method, device and system for data of distributed storage system
CN115114258A (zh) 数据复制方法、装置、电子设备及计算机存储介质
CN113760875A (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