1.本发明涉及无服务器计算serverless中应用状态管理技术领域,尤其涉及一种serverless应用控制状态的管理方法和系统。
背景技术:2.无服务器计算serverless作为新的云计算模式正在迅速发展。目前,函数即服务(function as a service,faas)是提供serverless计算服务的主要形式。用户在serverless计算平台开发应用只需要用任何高级编程语言编写一个云函数(用户代码),配置可触发云函数的事件就能利用云资源运行自己的应用,而将所有其它繁琐的事情(如服务器配置、负载均衡、伸缩、应用部署)都交由平台负责。使用serverless计算平台,开发人员可以用不同的编程语言编写一个函数,然后将函数上传到云端,并获得调用接口以随意远程调用该函数。凭借简单的编程模型、丰富的云资源服务、低成本的按量付费方式,serverless成为云计算的重要计算服务形式。
3.serverless计算平台为开发人员提供服务器配置、计算资源,并可根据实时应用负载情况执行函数弹性扩缩容。现有serverless的弹性扩展能力依赖于计算和存储分离,由于现有serverless计算未能提供系统化的状态管理能力,这要求serverless函数必须是无状态的。无状态性意味着serverless函数的每一次调用之间不能共享状态,用户需将函数需要使用的状态(例如持久化数据、函数之间用于协作的消息和函数执行的中间结果)存储在外部存储服务中。
4.在serverless应用计算中,有一类特殊的状态——控制状态,包括serverless函数间相互发送的消息、用于多函数同步的互斥锁和需要频繁读写的共享对象。不同于其他状态,由于特殊的一致性和性能需求,控制状态的使用需要serverless平台提供特殊的语义支持;而其他状态主要服务于应用的业务需求,不需要和平台进行交互。
5.目前,serverless缺乏高效的状态管理机制,通常使用外部存储作为所有状态的的访问管理,这使得在serverless平台上实现需要使用控制状态的应用会面临一系列问题:
6.(1)控制状态访问性能难以保障。控制状态具有延迟敏感的计算特点,外部存储服务通常具有更高的访问延迟,因此难以支持控制状态细粒度、高频率的访问。这对基于控制状态进行密切协作的serverless应用有较大的性能影响。
7.(2)控制状态访问的一致性需求难以保障。控制状态具有多样化的一致性需求,一般的外部存储服务难以直接满足需求。用户需要为不同一致性需求和性能需求的控制对象配置多种存储服务,并手动进行管理,操作十分困难。
8.(3)控制状态的自动扩缩容难以实现。serverless函数的并发度可能在短时间增长到很大的数值,而存储系统通常不具备相应的自动扩缩容能力,从而成为整个系统的性能瓶颈,影响应用计算性能。
技术实现要素:9.本发明的目的是解决多函数协作的serverless应用的多样一致性需求、编程困难问题和性能问题。本发明提供了适用于不同协作场景的编程接口,简化多函数协作的serverless应用开发,具有优秀的性能。基于此系统,应用开发人员不需要自行构建和维护外部存储,只需关注函数间协作需要传递的消息和共享的对象,就能在轻松构建分布式共识算法或分布式数据库系统等依赖状态管理的serverless应用。
10.针对现有技术的不足,本发明提出一种基于应用控制状态管理的无服务器计算应用执行方法,其中包括:
11.步骤1、无服务器计算平台获取待执行的无服务器计算应用,无服务器应用包括至少一个云函数,该云函数通过引入控制状态管理程序库实现控制状态管理功能,该控制状态管理程序库启动控制状态管理客户端;
12.步骤2、该控制状态管理客户端根据函数使用该控制状态管理程序库提供的应用程序编程接口创建控制状态对象,为控制状态对象创建全局唯一的字符串,作为该控制状态对象的对象引用;
13.步骤3、该控制状态管理客户端使用该应用程序编程接口传入函数名和该对象引用,启动该函数名对应的目标函数,并将该对象引用作为参数传递,使该目标函数共享该控制状态对象;
14.步骤4、重复该步骤2和3,直到该无服务器计算应用执行完毕后,保存当前该控制状态对象作为执行结果,该控制状态管理程序库关闭该控制状态管理客户端。
15.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该无服务器计算平台为该函数的运行实例运行一个守护进程,该守护进程用于在该函数引用请求到来时执行用户代码;该控制状态管理客户端的生命周期和该守护进程一致;该控制状态管理客户端保存该控制状态对象的引用和函数调用的标识符。
16.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该控制状态对象包括基本数据对象、无冲突复制对象和互斥量;
17.该基本数据对象包括浮点数和字符串,任何持有其对象引用的函数均可读写该基本数据对象;并采用最后写入者获胜策略处理写冲突,每一个持有者的对象副本都将异步更新获胜的写操作;
18.该无冲突复制对象包括计数器、列表和文本对象,该无冲突复制对象的所有操作均可交换,任何持有其对象引用的函数均可读写该无冲突复制对象,但是不会出现写冲突;每一个持有者的对象副本将会异步更新所有对相同该无冲突复制对象的操作;
19.该互斥量为被锁住的浮点数和字符串,函数持有互斥锁后才能读写该互斥量。
20.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该控制状态管理客户端保存控制状态管理功能的函数的调用标识符,函数的每次调用都生成一个全局唯一的标识符,以区分同一个函数的不同调用;
21.且所有共享同一控制状态对象的函数通过该控制状态管理客户端构成全连接网络,以去中心化的实现方式存取该控制状态对象。
22.本发明还提出了一种基于应用控制状态管理的无服务器计算应用执行系统,其中包括:
23.初始模块,用于发送无服务器计算应用至无服务器计算平台,无服务器应用包括至少一个云函数,该云函数通过引入控制状态管理程序库实现控制状态管理功能,该控制状态管理程序库启动控制状态管理客户端;
24.创建模块,用于使该控制状态管理客户端根据函数使用该控制状态管理程序库提供的应用程序编程接口创建控制状态对象,为控制状态对象创建全局唯一的字符串,作为该控制状态对象的对象引用;
25.传递模块,用于使该控制状态管理客户端使用该应用程序编程接口传入函数名和该对象引用,启动该函数名对应的目标函数,并将该对象引用作为参数传递,使该目标函数共享该控制状态对象;
26.执行模块,用于重复该创建模块和该传递模块,直到该无服务器计算应用执行完毕后,保存当前该控制状态对象作为执行结果,该控制状态管理程序库关闭该控制状态管理客户端。
27.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该无服务器计算平台为该函数的运行实例运行一个守护进程,该守护进程用于在该函数引用请求到来时执行用户代码;该控制状态管理客户端的生命周期和该守护进程一致;该控制状态管理客户端保存该控制状态对象的引用和函数调用标识符。
28.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该控制状态对象包括基本数据对象、无冲突复制对象和互斥量;
29.该基本数据对象包括浮点数和字符串,任何持有其对象引用的函数均可读写该基本数据对象;并采用最后写入者获胜策略处理写冲突,每一个持有者的对象副本都将异步更新获胜的写操作;
30.该无冲突复制对象包括计数器、列表和文本对象,该无冲突复制对象的所有操作均可交换,任何持有其对象引用的函数均可读写该无冲突复制对象,但是不会出现写冲突;每一个持有者的对象副本将会异步更新所有对相同该无冲突复制对象的操作;
31.该互斥量为被锁住的浮点数和字符串,函数持有互斥锁后才能读写该互斥量。
32.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该控制状态管理客户端保存控制状态管理功能的函数的调用标识符,函数的每次调用都生成一个全局唯一的标识符,以区分同一个函数的不同调用;
33.且所有共享同一控制状态对象的函数通过该控制状态管理客户端构成全连接网络,以去中心化的实现方式存取该控制状态对象。
34.本发明还提出了一种存储介质,用于存储执行所述任意一种基于应用控制状态管理的无服务器计算应用执行方法的程序。
35.本发明还提出了一种客户端,用于所述任意一种基于应用控制状态管理的无服务器计算应用执行系统。
36.由以上方案可知,本发明的优点在于:
37.1.多种一致性保证的控制状态对象简化了serverless应用的开发。不同类型serverless应用构建过程中对状态一致性的需求不同,手动配置多个不同一致性保证的分布式数据库非常复杂而且难以管理。本发明为细粒度、需要频繁访问且延迟敏感的对象提供极简的编程接口,极大简化了需要多函数协作的serverless应用开发。
38.2.显著提升了serverless应用性能及弹性伸缩能力。以往serverless应用进行多函数协作时只能将所有需要共享的状态或函数执行的中间结果保存到外部存储服务,一方面访问外部存储服务需要跨越网络层,承受网络层的延迟开销;另一方面外部存储服务的弹性伸缩不够灵活,很容易成为整个应用的性能瓶颈。去中心化的实现方式将业务逻辑实现在更靠近函数的一侧,减少了总体的延迟;控制状态管理的计算负载可以随着函数的自动扩展一同扩展,不会成为性能瓶颈。
附图说明
39.图1为系统架构图;
40.图2为客户端启动步骤流程图;
41.图3为基本数据对象的写冲突处理流程图;
42.图4为无冲突复制对象的操作合并流程图;
43.图5为互斥量的并发修改流程图;
44.图6为方法使用步骤流程图。
具体实施方式
45.本发明提出一种去中心化的serverless应用控制状态的管理方法,通过改进serverless计算平台,平台来解决serverless应用中函数协作的多样一致性需求、编程困难问题和性能问题。本发明为serverless应用提供细粒度、高频访问和低延迟的控制状态管理能力,提升多函数协作的serverless应用的运行性能,简化函数协作的开发方式。本发明的关键技术点包括:
46.关键点1:控制状态底层数据模型。本发明提出控制状态底层数据模型。控制状态底层数据模型对serverless应用控制状态进行抽象和编程接口定义。为提供简单易用的编程接口,本发明首先定义了控制状态的3种不同类型对象:基本数据对象、无冲突复制对象和互斥量。这三种对象拥有不同的一致性保证和性能表现。用户在编程时,可以在一个函数的代码中导入相应的程序库,然后使用程序库创建对象并可以将对象共享给其它函数。使用控制状态对象,用户不需要手动管理多种一致性保证的数据库,减小了操作负担。用户开发serverless应用时无需关注控制状态的管理。
47.关键点2:控制状态的同步协议。本发明提出控制状态的同步协议。3种控制状态对象具有不同的一致性需求和性能需求,因此需要使用不同的方式实现。控制状态的同步协议描述了3种控制状态对象的同步过程,分别包括基本数据对象的并发修改-最后写入者获胜策略、无冲突复制对象的操作合并过程和互斥量的串行修改过程。控制状态的同步协议实现于去中心化的状态管理系统中。
48.关键点3:去中心化的控制状态管理系统。本发明提出去中心化的控制状态管理系统。去中心化的控制状态管理系统基于serverless函数执行环境,支持协作函数无需通过中心节点即可实现对控制状态的存取,而无需函数在业务层执行显式的点对点通信。所有共享某一控制状态对象的函数通过控制状态管理客户端构成一个小型全连接网络,例如当函数a、b、c共享同一个控制状态对象,例如一个基本数据对象x时,a修改x的值后需要将新的值同步给b、c,这个过程通过消息传递完成。客户端分析用户代码对控制对象的具体操
作,并根据对象类型选择不同的连接模式,例如扇出、发布-订阅、请求-应答。去中心化的正确实现比中心化的实现复杂很多,但可以很好地扩展并获得优秀的性能。支持高弹性的serverless应用的控制状态管理。
49.为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。
50.本发明具体实施包括构建serverless应用控制状态管理系统、执行控制状态管理和构建控制状态管理客户端。
51.1.构建serverless应用控制状态管理系统
52.本发明提出系统的架构如图1所示,该系统由函数执行环境、控制状态管理客户端和嵌入在serverless平台的全局函数寻址部件构成。函数执行环境包括守护进程和用户代码部分,用户代码实现应用的业务逻辑,守护进程用于在serverless平台执行用户代码并监控执行过程。用户代码或守护进程通过控制状态管理客户端进行函数协作,控制状态管理客户端包含:1)控制状态对象创建和操作api;2)函数调用api;3)局部函数实例寻址部件。函数实例的寻址需要控制状态管理客户端的局部函数实例寻址部件和嵌入在serverless平台的全局函数寻址部件共同完成。
53.2.构建控制状态管理客户端
54.在控制状态访问管理过程中,控制状态管理客户端围绕3类控制状态对象实现差异化的管理操作。进一步地,控制状态管理客户端的启动过程包括图2描述的以下步骤:
55.(1)控制状态管理客户端保存需要控制状态管理功能的函数的调用标识符invoke(function,arguments)-》id。函数的每次调用都生成一个全局唯一的标识符,同一个函数的不同调用对应的标识符也不同。即标识符既可能是调用者生成的,例如通过客户端调用就会生成;也有可能是调用者没有生成,而被调用者的客户端生成的,例如这次调用是来自外部调用,比如http请求;每次调用都产生标识符,是为了区分同一个函数的不同调用。
56.(2)每一个函数运行实例只需要一个控制状态管理客户端。serverless平台为了降低冷启动延迟,在函数运行实例(例如容器、虚拟机)运行一个守护进程,这个守护进程同时也是一个小型反向代理服务器,用于在函数调用请求到来时执行用户代码。控制状态管理客户端的生命周期和该守护进程一致。当新的函数调用发生在已经启动守护进程的运行实例中时,不会再启动单独的客户端,函数会复用已有客户端。
57.3.实现控制状态对象的同步协议
58.用户需要使用的时候利用程序库api创建的控制状态对象包括三种类别,分别是基本数据对象、无冲突复制对象和互斥量。不同的对象有不同的一致性保证和操作接口,用于以下3种不同的协作场景:
59.(1)基本数据对象包括浮点数和字符串,这是两类最常用也是最通用的数据对象。基本数据对象可以被任何持有其引用的函数读写;当并发写发生时,本系统采用最后写入者获胜策略处理冲突,每一个持有者的对象副本都将异步更新获胜的写操作,以达到最终一致性。基本数据对象常用于直接保存某些简单的共享数据状态。其中该持有者为持有该基本数据对象的函数。
60.作为示例,图3展现了基本数据对象的写冲突处理过程。函数a和函数b共享基本数据对象x,并通过各自的控制状态管理客户端即客户端a和客户端b进行协作。函数a和函数b
对共享对象x进行并发写入,写入值分别为1和2,附带时间戳t1和t2.随后,客户端相互通信更新x的值。更新是异步发生的,函数得到了设置成功的回复,但客户端在未完成全部副本更新前认为x的值尚未更新完成,在这个过程中收到另一个客户端的更新值就会发生写冲突。客户端处理写冲突的方式是比较时间戳t1和t2的大小。由于时间戳除了本地时间信息外,还包含全局唯一的随机数,因此不会出现t1和t2完全相等的情况。客户端选择将x的值设置为时间戳更大的写入值,在此例中t1大于t2,因此最终客户端a和客户端b都将x更新为1,实现了最终一致性。
61.(2)无冲突复制对象包括可进行增减操作的计数器、可在任意位置插入或删除元素的列表和可在任意位置插入或删除字符的文本对象。无冲突复制对象的所有操作都是可交换的,同样可以被任何持有其引用的函数读写,但是不会出现写冲突。无冲突复制对象同样提供最终一致性,每一个持有者的对象副本也将会异步更新所有对某个对象的操作。无冲突复制对象常用于多客户端的协作编辑或聊天系统的文本同步。
62.作为示例,图4展现了无冲突复制对象的操作合并过程。函数a和函数b共享一个仅可进行增加、减少和读取的计数器对象counter。counter的初始值为0。函数a和函数b并发修改counter对象,分别对其进行增加1操作和增加2操作,随后客户端a和客户端b相互通信,传递counter对象的更新操作。而增加和减少操作是可交换的,先后顺序不影响对象的最终值。因此两个更新操作都可以生效,客户端a和客户端b都将counter更新为3,实现了最终一致性。
63.(3)互斥量也包括浮点数和字符串,不同的是,函数需要先成功获取到互斥锁后才能对被锁住的对象进行读写。互斥量保证线性一致性,提供最简单的函数同步和互斥能力。互斥量通常用于对正确性要求极高的应用场景,完全避免多个函数对同一个对象的并发修改。
64.作为示例,图5展现了两个函数试图同时修改互斥量的过程。互斥量的互斥锁信息只在一个客户端保存,本例中x的锁信息只保存于客户端a。函数a在访问x之前必须先获取互斥锁。当函数a成功获取互斥锁后,任何其它访问互斥锁的尝试都会失败。因此在函数a释放锁前,只有函数a能够访问x,其它客户端对x的读取都依赖于客户端a,实现了线性一致性。
65.4.构建两级函数寻址服务
66.所有控制状态对象的操作都依赖于函数间通信。函数间进行通信首先要确定通信双方的物理位置,即ip和端口信息,该过程称为函数寻址。serverless平台和控制状态管理客户端构成两级函数寻址服务,共同维护函数和物理位置的映射关系:
67.(1)当函数通过库调用其它函数时,控制状态管理客户端会为该次调用生成全局唯一标识符。寻址服务将该标识符和该次调用的运行实例所在物理位置的对应关系保存起来,以供后续查找。
68.(2)当函数通过库进行控制状态协作操作时,控制状态管理客户端根据协作要求需要和其它函数实例通信,客户端会自动为通信信息带上函数名和标识符。
69.(3)控制状态管理客户端根据函数名找到serverless平台维护的函数实例的端点列表,并根据标识符找到函数实例的物理位置,从而和函数实例持有的控制状态客户端建立起连接,开始传输消息。
70.(4)当函数执行完毕后,函数执行环境的控制状态管理客户端以及serverless平台维护的端点列表中删除该实例和物理位置的对应关系。
71.5.使用控制状态管理
72.上述诸步骤实现了控制状态管理系统,该系统通过图6描述的步骤使用:
73.(1)在需要使用控制状态管理功能的函数代码中引入控制状态管理程序库,该库会自动启动控制状态管理的客户端;
74.(2)函数使用程序库提供的api创建控制状态对象,获取控制状态对象的引用createobject()-》ref;
75.(3)当函数需要和其它函数协作时,通过api传入被调用的函数名和参数启动其它函数,并且可以将控制状态对象的引用作为参数传递,使得被调用的函数可以共享该对象;
76.(4)重复2、3步骤,直到用户代码执行完毕;
77.(5)程序库会自动关闭控制状态管理客户端。
78.以一个单词计数应用为例,主函数将输入文本分行,然后启动多个子函数,每个子函数计算每一行的单词个数,然后将单词个数更新到全局统一的计数器。这个例子中,全局统一的计数器是主函数通过库创建的,其引用是一个全局唯一字符串,所有持有这个引用的子函数都可以像修改本地数据对象一样修改这个字典。创建的对象可以是上文提到的3种控制状态对象:基本数据对象、无冲突复制对象、互斥量。在这个例子中,由于单词个数只包含加法操作,使用无冲突复制对象最为合适。
79.以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。
80.本发明还提出了一种基于应用控制状态管理的无服务器计算应用执行系统,其中包括:
81.初始模块,用于发送无服务器计算应用至无服务器计算平台,无服务器应用包括至少一个云函数,该云函数通过引入控制状态管理程序库实现控制状态管理功能,该控制状态管理程序库启动控制状态管理客户端;
82.创建模块,用于使该控制状态管理客户端根据函数使用该控制状态管理程序库提供的应用程序编程接口创建控制状态对象,为控制状态对象创建全局唯一的字符串,作为该控制状态对象的对象引用;
83.传递模块,用于使该控制状态管理客户端使用该应用程序编程接口传入函数名和该对象引用,启动该函数名对应的目标函数,并将该对象引用作为参数传递,使该目标函数共享该控制状态对象;
84.执行模块,用于重复该创建模块和该传递模块,直到该无服务器计算应用执行完毕后,保存当前该控制状态对象作为执行结果,该控制状态管理程序库关闭该控制状态管理客户端。
85.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该无服务器计算平台为该函数的运行实例运行一个守护进程,该守护进程用于在该函数引用请求到来时执行用户代码;该控制状态管理客户端的生命周期和该守护进程一致;该控制状态管理客户端保存该控制状态对象的引用和函数调用标识符。
86.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该控制状态对象包括基本数据对象、无冲突复制对象和互斥量;
87.该基本数据对象包括浮点数和字符串,任何持有其对象引用的函数均可读写该基本数据对象;并采用最后写入者获胜策略处理写冲突,每一个持有者的对象副本都将异步更新获胜的写操作;
88.该无冲突复制对象包括计数器、列表和文本对象,该无冲突复制对象的所有操作均可交换,任何持有其对象引用的函数均可读写该无冲突复制对象,但是不会出现写冲突;每一个持有者的对象副本将会异步更新所有对相同该无冲突复制对象的操作;
89.该互斥量为被锁住的浮点数和字符串,函数持有互斥锁后才能读写该互斥量。
90.所述的基于应用控制状态管理的无服务器计算应用执行方法,其中该控制状态管理客户端保存控制状态管理功能的函数的调用标识符,函数的每次调用都生成一个全局唯一的标识符,以区分同一个函数的不同调用;
91.且所有共享同一控制状态对象的函数通过该控制状态管理客户端构成全连接网络,以去中心化的实现方式存取该控制状态对象。
92.本发明还提出了一种存储介质,用于存储执行所述任意一种基于应用控制状态管理的无服务器计算应用执行方法的程序。
93.本发明还提出了一种客户端,用于所述任意一种基于应用控制状态管理的无服务器计算应用执行系统。