CN110162413B - 事件驱动方法及装置 - Google Patents
事件驱动方法及装置 Download PDFInfo
- Publication number
- CN110162413B CN110162413B CN201810153094.4A CN201810153094A CN110162413B CN 110162413 B CN110162413 B CN 110162413B CN 201810153094 A CN201810153094 A CN 201810153094A CN 110162413 B CN110162413 B CN 110162413B
- Authority
- CN
- China
- Prior art keywords
- event
- target
- function
- functions
- triggered
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/544—Remote
Abstract
本申请公开了一种事件驱动方法及装置,属于云计算技术。所述方法应用于Serverless架构中,该Serverless架构部署有多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,且每个函数链是根据事件和函数的触发关系预先确定得到,所述方法包括:接收事件源发布的针对目标服务的目标事件;从目标服务包括的至少一个函数链中确定目标事件对应的目标函数链;通过目标服务,执行目标函数链指示的能够依次触发的多个函数,以完成目标事件的驱动。本申请基于服务的函数链可以进行免队列事件驱动,减小了函数的执行时长,缩短了业务处理流程的时延,提高了系统性能。
Description
技术领域
本申请涉及云计算技术领域,特别涉及一种事件驱动方法及装置。
背景技术
无服务器(Serverless)架构是目前最新兴起的业务软件平台架构,在Serverless架构提供的平台上,开发者可以提交用于实现具体业务的函数,这些函数可以通过事件触发执行,如此,可以使得开发者摆脱对后台设备的设置和管理工作,仅关注于函数的业务逻辑设计。Serverless架构的基本特征是函数即服务(Function as a Service,FaaS)和事件驱动。FaaS是指将函数抽象为一种服务提供给开发者,以使开发者能够在互联网上实现函数的开发、测试以及在线部署等功能。事件驱动是指Serverless架构中的函数由事件驱动执行,事件由事件源发布,其实质是一种业务请求,用于请求完成相应的业务。
目前的Serverless架构中,通常采用一种通用的事件驱动模型来驱动函数执行,这种事件驱动模型是基于队列实现的。具体地,参见图1A,在Serverless架构中,事件源可以发布事件,每个事件可以触发一个或多个函数。其中,事件源包括客户端和事件处理过程,例如,用户在客户端的操作可以触发客户端发布事件,在事件处理过程中也可以触发发布新的事件。对于事件源发布的事件,一方面可以通过事件驱动模型将这些事件按照发布时间顺序依次缓存在事件队列中,另一方面可以按照事件处理进度,从事件队列中依次提取事件,并对提取的事件进行处理。其中,对提取的事件进行处理包括:根据存储的事件和函数的触发关系,确定该事件触发的函数,并执行该事件触发的函数,以完成该事件请求的业务。另外,在执行该事件触发的函数的过程中,还可能触发新的事件,对于触发的新的事件,需要先缓存在事件队列中,以便后续调度执行。
上述事件驱动过程中,事件对应的函数需要在事件的入队列、排队等待、出队列等环节完成之后才能被执行,因此函数的执行时间将被拉长,业务处理流程的时延较大。
发明内容
为了解决相关技术中存在的函数的执行时间长,业务处理流程的时延大问题,本申请提供了一种事件驱动方法及装置。所述技术方案如下:
第一方面,提供了一种事件驱动方法,应用于无服务器Serverless架构中,所述Serverless架构部署有多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,且每个函数链是根据事件和函数的触发关系预先确定得到,所述方法包括:
接收事件源发布的针对目标服务的目标事件,所述目标服务为所述多个服务中的任一个,所述事件源为客户端或者所述多个服务中除所述目标服务之外的其他服务;
从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链;
通过所述目标服务,执行所述目标函数链指示的能够依次触发的多个函数,以完成所述目标事件的驱动。
本申请实施例中,可以在Serverless架构中部署多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,当接收到事件源发布的针对目标服务的目标事件时,可以从目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链,然后通过目标服务执行该目标函数链指示的能够依次触发的多个函数,以完成目标事件的驱动。也即是,在本申请提供的Serverless架构,事件可以通过服务直接触发一整个函数链,从而以函数链为单位进行驱动,如此可以避免以函数为单位驱动时触发的中间事件需要进行的排队流程,减小了函数的执行时长,缩短了业务处理流程的时延,提高了系统性能。
在另一实施例中,所述从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链之前,还包括:
获取多个函数、多个事件以及事件函数关系图,所述事件函数关系图用于指示获取的多个函数和获取的多个事件之间的触发关系;
根据所述获取的多个函数的亲和关系,确定所述获取的多个函数中满足亲和条件的多个指定函数;
将所述多个指定函数的标识按照所述事件函数关系图组成的至少一个函数链分配给所述目标服务。
本申请实施例中,可以将满足亲和条件的多个函数的标识,按照函数和事件的触发关系组成的至少一个函数链分配给一个服务,也即是,可以将满足亲和条件的多个函数组成的函数链归入一个服务中,使得每个服务包括至少一个函数链,通过服务对函数链进行管理,以便后续通过服务以函数链为单位进行调度,实现免队列的事件驱动,提高系统性能。
在具体实施例中,所述目标事件携带所述目标事件的标识;
所述从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链,包括:
根据所述目标事件的标识,以及存储的事件和函数的触发关系,确定所述目标事件触发的目标函数;从所述目标服务包括的至少一个函数链中确定以所述目标函数为起点的函数链;将所述以所述目标函数为起点的函数链确定为所述目标函数链;
或者,
根据所述目标事件的标识,以及存储的事件标识和函数链的对应关系,从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链。
在具体实施例中,所述通过所述目标服务,执行所述目标函数链指示的能够依次触发的多个函数,包括:
从为所述目标服务配置的至少一个服务实例中确定目标服务实例,所述至少一个服务实例中的每个服务实例用于运行所述目标服务;
在所述目标服务实例中,执行所述目标函数链指示的能够依次触发的多个函数。
本申请实施例中,每个服务可以具有一个或多个服务实例,每个服务实例相当于服务的一个进程,通过多个服务实例可以实现服务的多进程运行,提升事件的并发度。
在具体实施例中,所述目标事件携带所述目标事件的标识,所述目标服务实例包括事件执行体,所述事件执行体用于执行函数链;
所述在所述目标服务实例中,执行所述目标函数链指示的能够依次触发的多个函数,包括:
在所述目标服务实例中加载所述目标函数链;
将所述目标事件的标识写入所述事件执行体;
根据所述目标事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述目标事件触发的函数;
当检测到在通过所述事件执行体执行所述目标事件触发的函数之后发布了新的事件时,将所述事件执行体中写入的所述目标事件的标识更新为所述新的事件的标识,根据所述新的事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述新的事件触发的函数,直至通过所述事件执行体执行完所述目标函数链包括的所有函数为止。
在服务实例中,可以通过服务实例的事件执行体执行函数链。其中,事件执行体包括事件标识变量,在通过事件执行体执行函数链的过程中,如果发布了新的事件,可以通过更新事件标识变量来触发事件执行体执行新的事件触发的函数。这种通过更新事件执行体的事件标识变量,执行函数链的方式,避免了中间事件的排队过程,减小了事件的执行时延,提高了系统性能。
在具体实施例中,所述目标函数链包括能够依次触发的多个函数的指针,用于指示能够依次触发的多个函数的存储地址;
所述根据所述目标事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述目标事件触发的函数,包括:
根据所述目标事件的标识,从所述目标函数链包括的能够依次触发的多个函数的指针中获取所述目标事件触发的函数的指针;
根据所述目标事件触发的函数的指针,通过所述事件执行体,执行所述目标事件触发的函数。
在具体实施例中,所述根据所述目标事件触发的函数的指针,通过所述事件执行体,执行所述目标事件触发的函数,包括:
当所述目标事件能够触发一个函数时,根据获取的函数的指针,确定所述目标事件触发的函数的存储地址;从所述存储地址获取所述目标事件触发的函数;通过所述事件执行体,执行所述目标事件触发的函数;
当所述目标事件能够触发多个函数时,将获取的多个函数的指针放入预设堆栈中进行压栈处理;根据压栈处理的多个函数的指针的出栈顺序,通过所述事件执行体,依次执行所述目标事件触发的多个函数。
本申请实施例中,当一个事件能够触发多个函数时,可以将该多个函数的指针放入预设堆栈中进行压栈处理,以便根据这多个函数的指针的出栈顺序,通过事件执行体依次执行目标事件触发的多个函数。如此,可以通过堆栈保证该多个函数的执行顺序,避免函数的无序调度。
在具体实施例中,所述目标事件携带所述目标事件所属的会话的标识;
所述从为所述目标服务配置的至少一个服务实例中确定目标服务实例,包括:
根据所述会话的标识,从所述至少一个服务实例中确定已执行了属于所述会话的事件触发的函数的服务实例;
将所述已执行了属于所述会话的事件触发的函数的服务实例,确定为所述目标服务实例。
本申请实施例中,通过将属于同一会话的事件调度到同一服务实例中进行处理,可以保证会话内事件的串行执行,实现会话事件的串并行协调,进一步提高系统性能。
第二方面,提供了一种事件驱动装置,所述事件驱动装置具有实现上述第一方面中事件驱动方法行为的功能。所述事件驱动装置包括至少一个模块,该至少一个模块用于实现上述第一方面所提供的事件驱动方法。
第三方面,提供了一种事件驱动装置,所述事件驱动装置的结构中包括处理器和存储器,所述存储器用于存储支持事件驱动装置执行上述第一方面所提供的事件驱动方法的程序,以及存储用于实现上述第一方面所提供的事件驱动方法所涉及的数据。所述处理器被配置为用于执行所述存储器中存储的程序。所述存储设备的操作装置还可以包括通信总线,该通信总线用于该处理器与存储器之间建立连接。
第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面所述的事件驱动方法。
第五方面,提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面所述的事件驱动方法。
上述第二方面、第三方面、第四方面和第五方面所获得的技术效果与第一方面中对应的技术手段获得的技术效果近似,在这里不再赘述。
本申请提供的技术方案带来的有益效果是:
本申请实施例中,可以在Serverless架构中部署多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,当接收到事件源发布的针对目标服务的目标事件时,可以从目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链,然后通过目标服务执行该目标函数链指示的能够依次触发的多个函数,以完成目标事件的驱动。也即是,在本申请提供的Serverless架构,事件可以通过服务直接触发一整个函数链,从而以函数链为单位进行驱动,如此可以避免以函数为单位驱动时触发的中间事件需要进行的排队流程,减小了函数的执行时长,缩短了业务处理流程的时延,提高了系统性能。
附图说明
图1A是相关技术提供的一种事件驱动方法的示意图;
图1B是本申请实施例提供的一种Serverless架构的示意图;
图1C是本申请实施例提供的另一种Serverless架构的示意图;
图1D是本申请实施例提供的一种无线传输业务的Serverless架构示意图;
图1E是申请实施例提供的一种事件驱动方法的流程图;
图1F是申请实施例提供的一种IDE10的逻辑结构示意图;
图1G是申请实施例提供的一种函数链的示意图;
图1H是本申请实施例提供的一种SRE20的运行示意图;
图1I是本相关技术中提供的一种的通过扩展队列的方式来提升并发度的示意图;
图1J是本申请实施例提供的一种函数链的示意图;
图1K是本申请实施例提供的一种压栈处理过程示意图;
图1L是本申请实施例提供的一种通过事件执行体执行函数链的流程示意图;
图1M是本申请实施例提供的一种目标服务调度Session事件的示意图;
图1N是本申请实施例提供的一种服务实例的部署关系图;
图2是本申请实施例提供的一种事件驱动装置的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在对本申请实施例进行详细介绍之前,先对本申请实施例的应用场景进行简单介绍。
本申请实施例提供的Serverless架构用于为用户提供各种业务服务,比如该Serverless架构可以是面向公共用户的云服务,用于为用户提供上网业务、网上购物业务或者语音通信业务等等。
接下来对本申请实施例的系统架构进行介绍。
图1B是本申请实施例提供的一种Serverless架构的示意图,如图1B所示,该Serverless架构部署有多个服务(Service)100,每个服务100包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数(Function),且每个函数链是根据事件(Event)和函数的触发关系预先确定得到。另外,该Serverless架构还包括用于支持该多个服务100的后台设备,由于本申请实施例主要关注于面向开发者的应用,所以对后台设备不做过多介绍。
其中,每个服务100的函数链可以由事件触发,事件由事件源发布,事件源包括客户端和服务100,也即是,事件可以在客户端与服务100之间,或者服务100与服务100之间进行交互。
具体地,该Serverless架构可以预先获取多个函数、多个事件以及事件函数关系图,然后根据获取的多个函数的亲和关系,将其中满足亲和条件的多个指定函数的标识,按照该事件函数关系图组成的至少一个函数链分配给一个服务100,使得每个服务100包括至少一个函数链。其中,该事件函数关系图用于指示获取的多个函数和多个事件之间的触发关系,该亲和关系用于指示函数的关联性和相似性。
图1C是本申请实施例提供的另一种Serverless架构的示意图,如图1C所示,该Serverless架构包括集成开发环境(Integrated Development Environment,IDE)10、服务运行环境(Service Running Environment,SRE)20和函数运行环境(Function RunningEnvironment,FRE)30。
IDE 10用于提供一套编程开发框架,使得开发者可以在该编程开发框架中进行函数链的预编程。具体地,开发者可以在该IDE10中实现函数的编程、事件的定义以及事件函数(Event-Function,E-F)关系图的编写,以通过该集成开发环境向Serverless架构提交多个函数、多个事件以及E-F关系图。
SRE 20用于为多个服务分配函数链,并对该多个服务进行管理。具体地,该SRE 20可以根据IDE10提交的多个函数、多个事件以及E-F关系图,分别将该多个函数中满足亲和条件的多个指定函数组成至少一个函数链,分配给一个服务,使得该多个服务中的每个服务包括至少一个函数链,并通过服务管理函数链。
具体地,该SRE 20包括服务管理(Service Manager)模块21,会话管理(SessionManager)模块22,负载均衡(Load Balance)模块23,名字服务(Name Service)模块24以及资源调度(Resource Scheduler)模块25。
Service Manager模块21用于将函数链分配给服务,以及管理服务的运行状态。其中,服务的运行状态包括启动、加载和结束等。
Session Manager模块22用于对进入服务的事件进行会话分类、对会话的状态进行记录等。其中,会话分类是指确定进行服务的事件所属的会话。
Load Balance模块23用于保证每个服务的服务实例之间的负载均衡。其中,每个服务通常配置有多个服务实例,每个服务实例用于运行对应的服务。
Name Service24用于实现服务的注册、注销或状态保存等。
Resource Scheduler模块25用于给每个服务的服务实例分配资源,以便通过分配的资源运行对应的服务实例。
FRE30用于在一个服务实例中加载函数链,根据传递进来的事件触发函数链的执行。其中,该服务实例所加载的函数链为对应的服务包括的函数链。具体地,FRE30包括事件调度(Event Scheduler)模块31,函数管理(Function Manager)模块32,会话管理(SessionManager)模块33和负载管理(Scale Manager)模块34。
Event Scheduler模块31用于根据传递进该服务实例的事件,调度函数链的加载执行。
Function Manager模块32用于实现函数链的管理和加载。
Session Manager模块33用于根据传递进行的事件所属的会话,将事件分配到所属会话对应的线程中进行处理。
Scale Manager模块34用于根据服务实例负荷的大小,动态调整服务实例内部执行线程的数目,以及当服务实例超载时,向SRE上报信息,以触发SRE对该服务配置的服务实例的数目进行调整。
图1D是本申请实施例提供的一种业务的Serverless架构示意图,如图1D所示,该Serverless架构包括业务模块1、软件运行环境和服务模型2、无服务运行(ServerlessRuntime)模块3和IDE模块4。
业务模块1,主要用于实现Serverless架构的改造以及具体业务代码的分离和改造等。
软件运行环境和服务模型2,主要用于实现软件运行环境和服务的构建。
Serverless Runtime模块3,主要用于实现事件的调用以及函数链的执行等。
IDE模块4,主要用于实现函数的编程,以及E-F关系图的编写等。
其中,实线框中的业务传输模块1和软件运行环境和服务模型2可以参考现有Serverless架构,实现框中的Serverless Runtime模块3和IDE模块4由本申请提供。
本领域技术人员可以理解,图1C或图1D中示出的Serverless架构并不构成对Serverless架构的限定,实际应用中,Serverless架构可以包括比图示更多或更少的模块,或者组合某些模块,或者不同的部件模块,本申请实施例对此不做限定。
接下来对本申请实施例提供的事件驱动方法进行详细介绍。
图1E是申请实施例提供的一种事件驱动方法的流程图,该方法应用于上述图1B或图1C所述的Serverless架构,该Serverless架构部署有多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,且每个函数链是根据事件和函数的触发关系预先确定得到。如图1E所示,该方法包括如下步骤:
步骤101:获取多个函数、多个事件以及事件函数关系图,该事件函数关系图用于指示获取的多个函数和获取的多个事件之间的触发关系。
其中,所述多个函数中的每个函数为业务处理函数,用于实现具体的业务逻辑。所述多个事件中的每个事件实质是一种业务请求,用于请求实现特定的业务。另外,事件和函数之间具有特定的触发关系,一个事件可以触发一个或多个函数,一个函数也可以触发一个新的事件。
其中,所述多个函数的函数代码可以由开发人员预先编程,以定义该多个函数的功能。所述多个事件可以由开发人员预先定义,以定义每个事件的含义。事件函数关系图也可以由开发人员预先编写,以定义这多个函数和多个事件之间的触发关系。本申请实施例中的Serverless架构,可以为开发人员提供一个IDE,由开发人员在该IDE中进行函数的编程、事件的定义以及事件函数关系图的编写。
在一个实施例中,可以在该Serverless架构中设计一套IDE编程框架,该IDE编程框架用于定义用户的编程行为。例如,可以基于该IDE编程框架将系统的开发角色分区分为3类,分别为软件工程师(Software,SWE)、系统/模块工程师(System/Mdule,SE/MDE)以及平台开发人员。SWE和SE/MDE的任务是进行业务开发,平台开发人员的任务是进行平台开发。
其中,SWE的任务是通过该IDE编程框架编写函数的函数代码。SE/MDE的任务是通过该IDE编程框架定义整个系统的事件,以及分割业务系统,编写E-F关系图。进一步地,该SE/MDE的任务还包括通过该编程框架定义函数的亲和关系,该亲和关系用于指示函数之间的关联性和相似性,以便后续根据函数之间的亲和关系确定将哪些函数归入一个服务。平台开发人员的任务是开发FaaS平台,使得该FaaS平台可以获取SE/MDE编写的函数、事件以及E-F关系图,并可以解析该E-F关系图,调度实际物理资源,处理与服务和分布式相同的事务。需要说明的是,复杂的分布式相关的调度全部隐藏在该FaaS平台内部,对开发人员不可见,也即是,所有的和分布式、集群、资源调度和动态伸缩等等复杂的功能,开发人员将不感知,从而减轻开发人员的处理负担。
进一步地,该IDE编程框架还可以将SE/MDE编写的函数编译为SO文件,以及将E-F关系图编写为json文件。具体地,可以将一个函数编译为一个SO文件,也可以将多个函数编译为一个SO文件,本申请实施例对此不做限定。相应地,该FaaS平台可以直接获取编译的SO文件和json文件,并对SO文件和json文件进行解析,得到多个函数以及E-F关系图。
在一个具体实施例中,参见图1F,该Serverless架构可以为开发人员提供IDE10,该IDE10可以包括函数编程模块、E-F编程模块和编译模块。其中,函数编程模块用于获取开发人员编写的函数代码,E-F编程模块用于获取开发人员编写的E-F关系图、定义的事件以及定义的函数亲和关系的定义,编译模块用于对获取的函数代码、E-F关系图、定义的事件和函数亲和关系进行编译,得到数据包,并输出该数据包。该数据包可以包括多个函数代码、E-F关系图、多个事件以及函数亲和关系。实际应用中,上述模块可以基于开发工具开发的插件来实现。
步骤102:根据获取的多个函数的亲和关系,确定获取的多个函数中满足亲和条件的多个指定函数,将该多个指定函数按照事件函数关系图组成的至少一个函数链分配给目标服务。
其中,该亲和关系用于指示函数之间的关联性,该亲和条件是指能够分配给一个服务的多个函数之间的亲和关系应该满足的条件。具体地,该亲和关系可以用于指示函数所实现业务之间的关联性,该亲和条件可以为多个指定函数所实现业务之间的关联性大于预设阈值。当然,该亲和关系也可以根据具体需要由开发人员进行设置,本申请实施例对此不做限定。
其中,该目标服务为该Serverless架构部署的多个服务中的任一服务。也即是,该多个服务中的每个服务均包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数。
获取到多个函数之后,该Serverless架构可以将其中满足亲和条件的部分函数归入一个服务,以将这部分函数使用相同的服务管理起来。其中,该至少一个函数链可以由满足亲和条件的多个指定函数的标识,按照该事件函数关系图组成,也可以由满足亲和条件的多个指定函数的标识以及该多个指定函数触发的至少一个事件的标识,按照该事件函数关系图组成。通过将组成的至少一个函数链分配给目标服务,可以使得该多个服务中的每个服务均包括至少一个函数链,且每个服务包括的至少一个函数链所指示的多个函数之间的亲和关系均满足亲和条件。
其中,每个函数链可以包括能够依次触发的多个函数的标识,或者包括能够依次触发的多个函数的标识和至少一个事件的标识。函数的标识用于唯一标识该函数,可以为函数的名称、标识号(Identification,ID)或指针等。事件的标识用于唯一标识该事件,可以为事件的名称或ID等。
以每个函数链包括能够依次触发的多个函数的ID和至少一个事件的ID为例,如图1G所示,E表示事件、F表示函数,服务A包括由函数ID和事件ID组成的两个函数链:函数链1和函数链2,服务B包括由函数ID和事件ID组成的一个函数链。比如,函数链1包括F1、E2、F2、E3、F3和F4以及表示触发关系的箭头,用于指示F1能够触发E2,E2能够触发F2,F2能够触发E3,E3能够分别触发F3和F4。
相关技术中,一个函数位于一个独立的容器(Docker)中,各个函数在各自所属的容器独立运行。而本申请实施例中,一个函数链所指示的多个函数可以位于相同的容器中,可以在相同的容器中运行一整个函数链,如此可以减小容器的维护量,以及避免一个函数一个容器运行导致频繁加载带来的高时延,提高系统性能。其中,容器是指为服务分配的用于运行服务的资源。
而且,需要说明的是,相关技术中通常是将一个函数抽象为一个服务,然后通过事件以函数为单位进行驱动,在此过程中,触发的中间事件需要先进入事件队列进行排队,这将增加函数的执行时延,系统性能较低。而本申请实施例中,通过将满足亲和关系的多个函数按照该事件函数关系图组成至少一个函数链,并将组成的至少一个函数链分配给一个服务,实现了将一串函数链抽象为一个服务,通过服务以函数链为单位进行驱动,避免了事件的排队流程,缩短了函数的处理时延,提高了系统性能。
需要说明的是,步骤101和步骤102用于为Serverless架构部署的服务配置函数链,而在为服务配置完函数链之后,即可根据事件源发布的事件,通过服务以函数链为单位进行调度,也即是执行下述步骤103-105。另外,实际应用中,为服务配置完函数链之后,还可以根据需要对任意配置的函数链进行更改,本申请实施例对此不做限定。
步骤103:接收事件源发布的针对目标服务的目标事件,该目标服务为多个服务中的任一个,该事件源为客户端或者该多个服务中除该目标服务之外的其他服务。
其中,事件源发布的针对目标服务的目标事件是指事件源向目标服务发送的事件,
在该Serverless架构中,事件源可以向服务发布事件,以请求该服务为其提供业务服务。其中,所述事件源可以为客户端或该多个服务中的任一服务。也即是,在该Serverless架构中,事件可以在客户端与服务之间,或者服务与服务之间进行交互。
实际应用中,还可以将客户端与服务之间,或者服务与服务之间交互的事件称之为消息。
步骤104:从该目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链。
对于事件源发布的针对目标服务的目标事件,可以直接从该目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链。该目标事件对应的目标函数链是指该目标事件能够触发的函数链。
具体地,该目标事件可以携带该目标事件的标识,从该目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链可以包括以下两种实现方式:
第一种实现方式:根据该目标事件的标识,以及存储的事件和函数的触发关系,确定该目标事件触发的目标函数;从该目标服务包括的至少一个函数链中确定以该目标函数为起点的函数链;将该以该目标函数为起点的函数链确定为该目标函数链。
本申请实施例中,每个服务可以预先存储事件和函数的触发关系,每个服务存储的事件和函数的触发关系可以包括系统中所有函数和事件的触发关系,或者仅包括该服务托管的函数链指示的多个函数和事件的触发关系,或者仅包括该服务托管的各个函数链的起点函数和事件的触发关系。
接收到针对目标服务的目标事件之后,可以获取该目标服务存储的事件和函数的触发关系,然后根据该目标事件的标识,以及该目标服务存储的事件和函数的触发关系,从该目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链。
其中,事件和函数的触发关系可以包括多个事件的标识以及对应的该多个事件能够触发的函数的标识。具体地,根据该目标事件的标识,以及存储的事件和函数的触发关系,确定该目标事件触发的目标函数包括:根据该目标事件的标识,从存储的事件和函数的触发关系中查找该目标事件的标识对应的函数的标识,将该目标事件的标识对应的函数的标识指示的函数作为该目标函数。
其中,该目标服务包括的至少一个函数链中的每个函数链可以包括能够依次触发的多个函数的标识,相应地,可以从该目标服务包括的至少一个函数链中确定以该目标函数的标识为起点的函数链,将以该目标函数的标识为起点的函数链作为该目标函数链。
例如,参见图1F,以目标服务为服务A,目标事件的标识为E1为例,可以先根据预先存储的事件和函数的触发关系,确定E1能够触发的目标函数的标识F1,然后从服务A包括的两个函数链中确定以F1为起点的函数链1作为目标函数链。
第二种实现方式:根据该目标事件的标识,以及存储的事件标识和函数链的对应关系,从该目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链。
本申请实施例中,每个服务可以预先存储事件标识和函数链的对应关系,该事件标识和函数链的对应关系存储有每个服务包括的至少一个函数链以及每个函数链对应的事件的标识,每个函数链对应的事件的标识是指能够触发该函数链的起点函数的事件的标识。
具体地,可以根据该目标事件的标识,以及存储的事件标识和函数链的对应关系,从该目标服务包括的至少一个函数链中查找该目标事件的标识对应的函数链,并将该目标事件的标识对应的函数链确定为该目标事件对应的目标函数链。
步骤105:通过该目标服务,执行该目标函数链指示的能够依次触发的多个函数,以完成该目标事件的驱动。
具体地,通过该目标服务,执行该目标函数链指示的能够依次触发的多个函数可以包括:从为该目标服务配置的至少一个服务实例中确定目标服务实例,该至少一个服务实例中的每个服务实例用于运行该目标服务;在该目标服务实例中,执行该目标函数链指示的能够依次触发的多个函数。
在Serverless架构中,每个服务具有一个或多个服务实例,这些服务实例均用于运行该服务,也即是,每个服务实例均可以加载并运行该服务包括的至少一个函数链。其中,每个服务的服务实例的运行资源可以由该Serverless架构预先分配,具体地,可以由该Serverless架构按照预先设置的分配规则默认分配,也可以由技术人员按照实际需要人为分配。
例如,图1H是本申请实施例提供的一种SRE20的运行示意图,如图1H所示,该FRE20包括Service Manager模块21、Name Service模块24和Resource Scheduler模块25。
Service Manager模块21可以接收开发人员通过IDE提交的数据包,该数据包可以包括多个函数代码、E-F关系图、定义的多个事件以及函数亲和关系,然后对该数据包进行解析,根据解析得到的定义的函数亲和关系和E-F关系图,将符合亲和条件的多个函数组成至少一个函数链分配给一个服务。也即是,该Service Manager模块21用于为Serverless架构中的多个服务分配函数链。另外,该Service Manager模块21还可以向ResourceScheduler模块25发送资源申请,以为该多个服务的服务实例申请运行资源。
Resource Scheduler模块25用于根据Service Manager模块21的资源申请,为各个服务的服务实例分配运行资源。例如,可以在服务器1中创建两个容器,分别用于运行服务A,得到服务A的两个服务实例。可以在服务器2和服务器3中分别创建一个容器,用于运行服务B,得到服务B的两个服务实例。
在具体业务场景中,通常会有多用户的概念,如会话(Session)。Session是指多个客户端之间的会话,每个会话通常包含一系列的事件。而且为了保证会话的顺序,通常需要将一个Session的事件串行处理,不同Session间的事件并行处理。但是相关技术中的Serverless架构,由于采用一个函数在一个容器中独立,并通过队列的方式进行事件驱动的方式,因此很难解决复杂场景下Session事件的串行和并行的协同问题。
另外,相关技术中,还提出了一种通过扩展队列的方式来提升并发度。例如,如图1I所示,假设Serverless架构中存在3个Session,分别为Session1、Session2和Session3,则可以为这3个Session分别创建对应的队列,并将各个Session产生的事件分别放入各个Session对应的队列中进行排队,以对各个Session的事件并行处理。但是一个真实的系统中通常存在百万甚至千万的Session,因此如果采用这种通过扩展队列来提升并发度的方式,也就需要创建百万甚至千万的队列,实际实现时很容易遇到瓶颈。
为了解决Session事件的串行和并行的协同问题,本申请实施例提供的Serverless架构还支持将同一会话的事件触发的函数链串行执行,将不同会话的事件触发的函数链并行执行。
具体地,目标事件还可以包括该目标事件所属的会话的标识,从为该目标服务配置的至少一个服务实例中确定目标服务实例可以包括:根据该会话的标识,从该至少一个服务实例中确定已执行了属于该会话的事件触发的函数的服务实例;将该已执行了属于该会话的事件触发的函数的服务实例,确定为该目标服务实例。之后,可以在该目标服务实例中,执行该目标函数链指示的能够依次触发的多个函数。通过这种方式,可以将属于同一会话的事件触发的函数链在同一个服务实例中进行处理,以实现Session事件的串行。
进一步地,本申请实施例中,每个服务实例包括事件执行体,事件执行体是函数链的执行单元,也即是,每个服务实例可以通过事件执行体来执行函数链。其中,每个服务实例可以包括一个事件执行体,也可以包括多个事件执行体,各个事件执行体都是独立的,可以并行处理函数链。也即是,通过事件执行体可以将函数链内的函数串行执行,将函数链间的函数并行执行。而且,本申请实施例提供的Serverless架构可以根据实际需要增加或删除每个服务实例的事件执行体的个数。
具体地,目标事件携带目标事件的标识,目标服务实例包括事件执行体,事件执行体用于执行函数链,相应地,在该目标服务实例中,执行该目标函数链指示的能够依次触发的多个函数可以包括如下步骤1-3:
1,在该目标服务实例中加载目标函数链。
2,将该目标事件的标识写入该目标服务实例的事件执行体,根据该目标事件的标识和在该目标服务实例中加载的该目标函数链,通过该事件执行体,执行该目标事件触发的函数。
其中,该事件执行体实质是一个函数代码段,该函数代码段包括一个事件标识变量。实际实现时,可以通过对事件执行体中的事件标识变量进行赋值,来触发事件执行体执行该目标函数链。在接收到目标事件之后,首先需要将该目标事件的标识写入该事件执行体,以触发该事件执行体执行该目标事件触发的函数。其中,将该目标事件的标识写入该事件执行体,是指将该事件标识变量赋值为该目标事件的标识。
具体地,该目标函数链可以包括能够依次触发的多个函数的标识,根据该目标事件的标识和该目标函数链,通过该事件执行体,执行该目标事件触发的函数可以包括:根据该目标事件的标识,从该目标函数链包括的能够依次触发的多个函数的标识中获取该目标事件触发的函数的标识;根据该目标事件触发的函数的标识,通过该事件执行体,执行该目标事件触发的函数。
其中,该目标函数链包括的能够依次触发的多个函数的标识可以为该多个函数的ID或指针,用于指示该目标函数链指示的能够依次触发的多个函数的存储地址。
具体地,根据该目标事件触发的函数的标识,通过该事件执行体,执行该目标事件触发的函数可以包括以下两种实现方式:
第一种实现方式:当该目标函数链包括能够依次触发的多个函数的ID时,根据该目标事件的标识,从该目标函数链包括的能够依次触发的多个函数的ID中获取该目标事件触发的函数的ID;根据该目标事件触发的函数的ID,以及存储的函数ID和函数指针的对应关系中,确定该目标事件触发的函数的指针;根据该目标事件触发的函数的指针,通过该事件执行体,执行该目标事件触发的函数。
第二种实现方式:当该目标函数链包括能够依次触发的多个函数的指针时,根据该目标事件的标识,从该目标函数链包括的能够依次触发的多个函数的指针中获取该目标事件触发的函数的指针;根据该目标事件触发的函数的指针,通过该事件执行体,执行该目标事件触发的函数。
其中,根据该目标事件触发的函数的指针,通过该事件执行体,执行该目标事件触发的函数可以包括以下两种方式:
第一种实现方式:当该目标事件能够触发一个函数时,根据获取的函数的指针,通过该事件执行体,执行该目标事件触发的函数。
具体地,可以根据获取的函数的指针,确定该目标事件触发的函数的存储地址,从该存储地址获取该目标事件触发的函数,通过该事件执行体,执行该目标事件触发的函数。
第二种实现方式:当该目标事件能够触发多个函数时,将获取的多个函数的指针放入预设堆栈中进行压栈处理;根据压栈处理的多个函数的指针的出栈顺序,通过该事件执行体,依次执行该目标事件触发的多个函数。
其中,所述获取的多个函数是指该目标事件能够触发多个函数。
具体地,根据压栈处理的多个函数的指针的出栈顺序,通过该事件执行体,依次执行该目标事件触发的多个函数包括以下步骤1)-3):
1)对该压栈处理的多个函数的指针中位于栈顶的第一函数的指针进行出栈处理,根据第一函数的指针获取第一函数,通过该事件执行体执行该第一函数。当检测到通过该事件执行体执行该第一个出栈的函数之后发布了新的事件时,将该事件执行体中写入的该目标事件的标识更新为该新的事件的标识,根据该新的事件的标识和该目标函数链,通过该事件执行体,执行该新的事件触发的函数,直至通过该事件执行体执行完该第一函数在该目标函数链所在支路为止。
2)在通过该事件执行体执行完该第一函数位于该目标函数链所在的支路之后,或者在通过该事件执行体执行该第一函数之后未检测到发布新的事件时,将该压栈处理的多个函数的指针中在第一函数的指针的栈位之下的第二函数的指针进行出栈处理,根据该第二函数的指针获取第二函数,并按照通过该事件执行体执行该第一函数的方式,通过该事件执行体执行第二函数,直至通过该事件执行体执行完该第二函数在该目标函数链所在支路为止。
3)重复步骤2),直至将该压栈处理的多个函数的指针中位于栈底的最后一个函数的指针进行出栈处理,并通过该事件执行体执行完该最后一个函数在该目标函数链中所在支路为止。
例如,参见图1J,假设目标事件为Event1,且Event1被两个函数(F2和F1)订阅,即Event1能够触发F2和F1这两个函数。其中,F2能够触发一个新的事件Event2,Event2能够触发一个新的函数F3,F1能够触发一个新的事件Event3。则参见图K,可以先将F2和F1的指针分别放入预设堆栈中进行压栈处理,然后将位于栈顶的F2的指针进行出栈处理,并通过事件执行体执行F2,执行完F2之后将发布新的事件Event2,并根据Event2触发执行F3。在执行完F3之后,即可将F1的指针进行出栈处理,并通过执行体执行F1。
在另一实施例中,当该目标事件能够触发多个函数时,还可以将该多个函数中的一个函数通过当前的事件执行体进行处理,并将该多个函数的其他函数调度到该目标服务实例中除该事件执行体之外的其他事件执行体进行处理。如此,可以通过多个事件执行体对该多个函数进行异步处理,增加并发性。
3,当检测到在通过该事件执行体执行该目标事件触发的函数之后发布了新的事件时,将该事件执行体中写入的该目标事件的标识更新为该新的事件的标识,根据该新的事件的标识和该目标函数链,通过该事件执行体,执行该新的事件触发的函数,直至通过该事件执行体执行完该目标函数链包括的所有函数为止。
当检测到在通过该事件执行体执行该目标事件触发的函数之后发布了新的事件时,可以从该新的事件中获取携带的新的事件的标识,并该事件执行体中已写入的目标事件的标识更新为该新的事件的标识,以将该事件执行体中的事件标识的变量重新赋值为该新的事件的标识,触发该事件执行体执行该新的事件触发的函数。
其中,根据该新的事件的标识和该目标函数链,通过该事件执行体,执行该新的事件触发的函数的方式,与上述根据该目标事件的标识和该目标函数链,通过该事件执行体,执行该目标事件触发的函数的方式同理,具体实现方式可以参考上述步骤2的相关描述,本申请实施例在此不再赘述。
也即是,在通过事件执行体执行该目标函数链的过程中,如果触发了新的事件发布,则可以通过将该事件执行体中已写入的事件标识修改为该新的事件的标识,来触发新的事件的执行;如果一个事件触发了多个函数,则可以将该多个函数进行入栈处理,并根据该多个函数的出栈顺序,通过该事件执行体依次执行该多个函数所在的支路,或者,也可以将该多个函数中的部分函数调度到其他事件执行体中进行处理。
本申请实施例中,可以通过修改事件执行体的事件标识变量,来触发事件执行体执行函数链。参见图1L,事件执行体包括事件标识变量,外部事件进入该事件执行体所在的服务实例之后,可以根据该事件的标识获取对应的函数链,并将该事件的标志写入该事件执行体,以使该事件执行体根据写入的事件的标识和对应的函数链,执行该事件触发的函数。而在执行该事件触发的函数之后如果发布了新的事件,则可以根据该新的事件的标识,更新该事件执行体的事件标识变量,以使该事件执行体根据更新后的事件标识变量和对应的函数链,执行新的事件触发的函数,直至执行完该函数链指示的所有函数为止。
进一步地,本申请实施例还支持在服务实例内,将Session内的事件串行执行,将Session间的事件并行执行。具体地,每个服务实例还可以包括多个Faas实例,Faas实例为服务实例的下一级,且该多个Faas实例具有相同的执行逻辑,可以并行处理调度到该服务实例的多个事件。其中,服务实例相当于服务的进程,服务实例的多个Faas实例相当于进程的多个线程。对于调度到目标服务实例的执行的事件,还可以在目标服务实例内,将属于同一Session的事件调度到同一Faas实例执行,将属于不同Session的事件调度到相同或不同Faas实例执行,以支持Session内的事件串行执行,Session间的事件并行执行,进一步实现Session事件的串并行协调调度。
例如,参见图1M,假设目标服务包括3个服务实例:服务实例1,服务实例2和服务实例3,服务实例1包括3个Faas实例:Faas实例1,Faas实例2和Faas实例3,进入该目标服务的事件包括分别属于Session1、Session2和Session3的事件。实际实现时,可以将Session1的事件依次调度到Faas实例1进行处理,将Session2的事件依次调度到Faas实例2进行处理,将Session3的事件依次调度到Faas实例3进行处理。如此可以实现Session内的事件串行执行,Session间的事件并行执行。
图1N是本申请实施例提供的一种服务实例的部署关系图,如图1H所示,假设该Serverless架构部署有两个服务:服务A和服务B,服务A可以在预先分配的容器中设置多个服务实例,服务B也可以在预先分配的容器中设置多个服务实例。其中,每个服务实例可以包括多个Faas实例,用于运行对应服务包括的函数链。而且,该Serverless架构还可以包括缓存服务,该缓存服务用于缓存Session的运行状态。
本申请实施例中,业务被抽象为基于函数链的事件驱动方式,可以支持事件的高效快速调度。例如,在一个实施例中,假设有1000个Session,每个Session有5个事件,则这1000个Session一共有5000个事件,假设这5000个事件共触发18个函数链,则通过本申请提供的事件驱动方法,这5000个事件全部处理完成的总时长小于40ms,平均每个事件的处理时长小于8us。其中,函数链中每个函数的调用时长也在us数量级,性能已经直接逼近函数的直接调用,极大地提升了系统性能。
下表1为相关技术中提供的一种基于队列的事件驱动实例和本申请实施例提供的一种基于函数链的事件驱动实例的性能对比表,如表1所示,基于队列的事件驱动实例仅能支持1000个Session并发,而基于函数链的事件驱动实例则可以支持千万级Session的并发,并发度大大提升,而且,基于队列的事件驱动实例的执行时延为200ms,而基于函数链的事件驱动实例的执行时延可以小于10us,执行时延也大大缩短,提升了系统性能。
表1
本申请实施例中,可以在Serverless架构中部署多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,当接收到事件源发布的针对目标服务的目标事件时,可以从目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链,然后通过目标服务执行该目标函数链指示的能够依次触发的多个函数,以完成目标事件的驱动。也即是,在本申请提供的Serverless架构,事件可以通过服务直接触发一整个函数链,从而以函数链为单位进行驱动,如此可以避免以函数为单位驱动时触发的中间事件需要进行的排队流程,减小了函数的执行时长,缩短了业务处理流程的时延,提高了系统性能。
图2是本申请实施例提供的一种事件驱动装置的结构示意图,该事件驱动装置应用于无服务器Serverless架构中,所述Serverless架构部署有多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,且每个函数链是根据事件和函数的触发关系预先确定得到,所述装置包括接收模块201、确定模块202和执行模块203。
接收模块201,用于执行上述图1E所述实施例中步骤103执行的操作;
第一确定模块202,用于执行上述图1E所述实施例中步骤104执行的操作;
执行模块203,用于执行上述图1E所述实施例中步骤105执行的操作。
可选地,所述装置还包括获取模块、第二确定模块和分配模块:
获取模块,用于执行上述图1E所述实施例中步骤101执行的操作;
第二确定模块和分配模块,用于执行上述图1E所述实施例中步骤102执行的操作。
可选地,目标事件携带目标事件的标识;所述第一确定模块202具体用于执行上述图1E所述实施例中步骤104所述的第一种实现方式或第二种实现方式。
可选地,所述执行模块203包括:
确定单元,用于从为该目标服务配置的至少一个服务实例中确定目标服务实例,该至少一个服务实例中的每个服务实例用于运行该目标服务;
执行单元,用于在该目标服务实例中,执行该目标函数链指示的能够依次触发的多个指函数。
可选地,该目标事件携带该目标事件的标识,该目标服务实例包括事件执行体,该事件执行体用于执行函数链;该执行单元具体用于:
在该目标服务实例中加载该目标函数链;
将该目标事件的标识写入该事件执行体;
根据该目标事件的标识和在该目标服务实例中加载的该目标函数链,通过该事件执行体,执行该目标事件触发的函数;
当检测到在通过该事件执行体执行该目标事件触发的函数之后发布了新的事件时,将该事件执行体中写入的该目标事件的标识更新为该新的事件的标识,根据该新的事件的标识和在该目标服务实例中加载的该目标函数链,通过该事件执行体,执行该新的事件触发的函数,直至通过该事件执行体执行完该目标函数链包括的所有函数为止。
可选地,该目标函数链包括能够依次触发的多个函数的指针,用于指示能够依次触发的多个函数的存储地址;
该执行单元具体用于:
根据该目标事件的标识,从该目标函数链包括的能够依次触发的多个函数的指针中获取该目标事件触发的函数的指针;
根据该目标事件触发的函数的指针,通过该事件执行体,执行该目标事件触发的函数。
可选地,该执行单元具体用于:
当该目标事件能够触发一个函数时,根据获取的函数的指针,确定该目标事件触发的函数的存储地址;从该存储地址获取该目标事件触发的函数;通过该事件执行体,执行该目标事件触发的函数;
当该目标事件能够触发多个函数时,将获取的多个函数的指针放入预设堆栈中进行压栈处理;根据压栈处理的多个函数的指针的出栈顺序,通过该事件执行体,依次执行该目标事件触发的多个函数。
可选地,该目标事件携带该目标事件所属的会话的标识;
该确定模块具体用于:
根据该会话的标识,从该至少一个服务实例中确定已执行了属于该会话的事件触发的函数的服务实例;
将该已执行了属于该会话的事件触发的函数的服务实例,确定为该目标服务实例。
本申请实施例中,可以在Serverless架构中部署多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,当接收到事件源发布的针对目标服务的目标事件时,可以从目标服务包括的至少一个函数链中确定该目标事件对应的目标函数链,然后通过目标服务执行该目标函数链指示的能够依次触发的多个函数,以完成目标事件的驱动。也即是,在本申请提供的Serverless架构,事件可以通过服务直接触发一整个函数链,从而以函数链为单位进行驱动,如此可以避免以函数为单位驱动时触发的中间事件需要进行的排队流程,减小了函数的执行时长,缩短了业务处理流程的时延,提高了系统性能。
需要说明的是:上述实施例提供的事件驱动装置在进行事件驱动时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的事件驱动装置与事件驱动方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
在另一实施例中,还提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述图1E实施例所述的事件驱动方法。
在另一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述图1E实施例所述的事件驱动方法。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意结合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如:同轴电缆、光纤、数据用户线(Digital Subscriber Line,DSL))或无线(例如:红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如:软盘、硬盘、磁带)、光介质(例如:数字通用光盘(Digital Versatile Disc,DVD))、或者半导体介质(例如:固态硬盘(Solid State Disk,SSD))等。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述为本申请提供的实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (16)
1.一种事件驱动方法,其特征在于,应用于无服务器Serverless架构中,所述Serverless架构部署有多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,且每个函数链是根据事件和函数的触发关系预先确定得到,所述方法包括:
接收事件源发布的针对目标服务的目标事件,所述目标服务为所述多个服务中的任一个,所述事件源为客户端或者所述多个服务中除所述目标服务之外的其他服务;
从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链;
通过所述目标服务,执行所述目标函数链指示的能够依次触发的多个函数,以完成所述目标事件的驱动。
2.如权利要求1所述的方法,其特征在于,所述从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链之前,还包括:
获取多个函数、多个事件以及事件函数关系图,所述事件函数关系图用于指示获取的多个函数和获取的多个事件之间的触发关系;
根据所述获取的多个函数的亲和关系,确定所述获取的多个函数中满足亲和条件的多个指定函数;
将所述多个指定函数的标识按照所述事件函数关系图组成的至少一个函数链分配给所述目标服务。
3.如权利要求1或2所述的方法,其特征在于,所述目标事件携带所述目标事件的标识;
所述从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链,包括:
根据所述目标事件的标识,以及存储的事件和函数的触发关系,确定所述目标事件触发的目标函数;从所述目标服务包括的至少一个函数链中确定以所述目标函数为起点的函数链;将所述以所述目标函数为起点的函数链确定为所述目标函数链;
或者,
根据所述目标事件的标识,以及存储的事件标识和函数链的对应关系,从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链。
4.如权利要求1所述的方法,其特征在于,所述通过所述目标服务,执行所述目标函数链指示的能够依次触发的多个函数,包括:
从为所述目标服务配置的至少一个服务实例中确定目标服务实例,所述至少一个服务实例中的每个服务实例用于运行所述目标服务;
在所述目标服务实例中,执行所述目标函数链指示的能够依次触发的多个函数。
5.如权利要求4所述的方法,其特征在于,所述目标事件携带所述目标事件的标识,所述目标服务实例包括事件执行体,所述事件执行体用于执行函数链;
所述在所述目标服务实例中,执行所述目标函数链指示的能够依次触发的多个函数,包括:
在所述目标服务实例中加载所述目标函数链;
将所述目标事件的标识写入所述事件执行体;
根据所述目标事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述目标事件触发的函数;
当检测到在通过所述事件执行体执行所述目标事件触发的函数之后发布了新的事件时,将所述事件执行体中写入的所述目标事件的标识更新为所述新的事件的标识,根据所述新的事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述新的事件触发的函数,直至通过所述事件执行体执行完所述目标函数链包括的所有函数为止。
6.如权利要求5所述的方法,其特征在于,所述目标函数链包括能够依次触发的多个函数的指针,用于指示能够依次触发的多个函数的存储地址;
所述根据所述目标事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述目标事件触发的函数,包括:
根据所述目标事件的标识,从所述目标函数链包括的能够依次触发的多个函数的指针中获取所述目标事件触发的函数的指针;
根据所述目标事件触发的函数的指针,通过所述事件执行体,执行所述目标事件触发的函数。
7.如权利要求6所述的方法,其特征在于,所述根据所述目标事件触发的函数的指针,通过所述事件执行体,执行所述目标事件触发的函数,包括:
当所述目标事件能够触发一个函数时,根据获取的函数的指针,确定所述目标事件触发的函数的存储地址;从所述存储地址获取所述目标事件触发的函数;通过所述事件执行体,执行所述目标事件触发的函数;
当所述目标事件能够触发多个函数时,将获取的多个函数的指针放入预设堆栈中进行压栈处理;根据压栈处理的多个函数的指针的出栈顺序,通过所述事件执行体,依次执行所述目标事件触发的多个函数。
8.如权利要求4-7任一所述的方法,其特征在于,所述目标事件携带所述目标事件所属的会话的标识;
所述从为所述目标服务配置的至少一个服务实例中确定目标服务实例,包括:
根据所述会话的标识,从所述至少一个服务实例中确定已执行了属于所述会话的事件触发的函数的服务实例;
将所述已执行了属于所述会话的事件触发的函数的服务实例,确定为所述目标服务实例。
9.一种事件驱动装置,其特征在于,应用于无服务器Serverless架构中,所述Serverless架构部署有多个服务,每个服务包括至少一个函数链,每个函数链用于指示能够依次触发的多个函数,且每个函数链是根据事件和函数的触发关系预先确定得到,所述装置包括:
接收模块,用于接收事件源发布的针对目标服务的目标事件,所述目标服务为所述多个服务中的任一个,所述事件源为客户端或者所述多个服务中除所述目标服务之外的其他服务;
第一确定模块,用于从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链;
执行模块,用于通过所述目标服务,执行所述目标函数链指示的能够依次触发的多个函数,以完成所述目标事件的驱动。
10.如权利要求9所述的装置,其特征在于,所述装置还包括:
获取模块,用于获取多个函数、多个事件以及事件函数关系图,所述事件函数关系图用于指示获取的多个函数和获取的多个事件之间的触发关系;
第二确定模块,用于根据所述获取的多个函数的亲和关系确定所述获取的多个函数中满足亲和条件的多个指定函数;
分配模块,用于将所述多个指定函数的标识按照所述事件函数关系图组成的至少一个函数链分配给所述目标服务。
11.如权利要求9或10所述的装置,其特征在于,所述目标事件携带所述目标事件的标识;
所述第一确定模块具体用于:
根据所述目标事件的标识,以及存储的事件和函数的触发关系,确定所述目标事件触发的目标函数;从所述目标服务包括的至少一个函数链中确定以所述目标函数为起点的函数链;将所述以所述目标函数为起点的函数链确定为所述目标函数链;
或者,
根据所述目标事件的标识,以及存储的事件标识和函数链的对应关系,从所述目标服务包括的至少一个函数链中确定所述目标事件对应的目标函数链。
12.如权利要求9所述的装置,其特征在于,所述执行模块包括:
确定单元,用于从为所述目标服务配置的至少一个服务实例中确定目标服务实例,所述至少一个服务实例中的每个服务实例用于运行所述目标服务;
执行单元,用于在所述目标服务实例中,执行所述目标函数链指示的能够依次触发的多个函数。
13.如权利要求12所述的装置,其特征在于,所述目标事件携带所述目标事件的标识,所述目标服务实例包括事件执行体,所述事件执行体用于执行函数链;
所述执行单元具体用于:
在所述目标服务实例中加载所述目标函数链;
将所述目标事件的标识写入所述事件执行体;
根据所述目标事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述目标事件触发的函数;
当检测到在通过所述事件执行体执行所述目标事件触发的函数之后发布了新的事件时,将所述事件执行体中写入的所述目标事件的标识更新为所述新的事件的标识,根据所述新的事件的标识和在所述目标服务实例中加载的所述目标函数链,通过所述事件执行体,执行所述新的事件触发的函数,直至通过所述事件执行体执行完所述目标函数链包括的所有函数为止。
14.如权利要求13所述的装置,其特征在于,所述目标函数链包括能够依次触发的多个函数的指针,用于指示能够依次触发的多个函数的存储地址;
所述执行单元具体用于:
根据所述目标事件的标识,从所述目标函数链包括的能够依次触发的多个函数的指针中获取所述目标事件触发的函数的指针;
根据所述目标事件触发的函数的指针,通过所述事件执行体,执行所述目标事件触发的函数。
15.如权利要求14所述的装置,其特征在于,所述执行单元具体用于:
当所述目标事件能够触发一个函数时,根据获取的函数的指针,确定所述目标事件触发的函数的存储地址;从所述存储地址获取所述目标事件触发的函数;通过所述事件执行体,执行所述目标事件触发的函数;
当所述目标事件能够触发多个函数时,将获取的多个函数的指针放入预设堆栈中进行压栈处理;根据压栈处理的多个函数的指针的出栈顺序,通过所述事件执行体,依次执行所述目标事件触发的多个函数。
16.如权利要求12-15任一所述的装置,其特征在于,所述目标事件携带所述目标事件所属的会话的标识;
所述确定模块具体用于:
根据所述会话的标识,从所述至少一个服务实例中确定已执行了属于所述会话的事件触发的函数的服务实例;
将所述已执行了属于所述会话的事件触发的函数的服务实例,确定为所述目标服务实例。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810153094.4A CN110162413B (zh) | 2018-02-12 | 2018-02-12 | 事件驱动方法及装置 |
EP18905106.3A EP3742293A4 (en) | 2018-02-12 | 2018-12-29 | EVENT CONDUCT PROCEDURE AND DEVICE |
PCT/CN2018/125823 WO2019153973A1 (zh) | 2018-02-12 | 2018-12-29 | 事件驱动方法及装置 |
US16/987,555 US20200364098A1 (en) | 2018-02-12 | 2020-08-07 | Event driving method and apparatus |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810153094.4A CN110162413B (zh) | 2018-02-12 | 2018-02-12 | 事件驱动方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110162413A CN110162413A (zh) | 2019-08-23 |
CN110162413B true CN110162413B (zh) | 2021-06-04 |
Family
ID=67548157
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810153094.4A Active CN110162413B (zh) | 2018-02-12 | 2018-02-12 | 事件驱动方法及装置 |
Country Status (4)
Country | Link |
---|---|
US (1) | US20200364098A1 (zh) |
EP (1) | EP3742293A4 (zh) |
CN (1) | CN110162413B (zh) |
WO (1) | WO2019153973A1 (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110650215A (zh) * | 2019-10-24 | 2020-01-03 | 百度在线网络技术(北京)有限公司 | 边缘网络的函数执行方法及装置 |
CN112929195A (zh) * | 2019-12-05 | 2021-06-08 | 北京沃东天骏信息技术有限公司 | 服务系统、由服务系统执行的方法、处理装置和存储介质 |
CN111274297A (zh) * | 2020-01-19 | 2020-06-12 | 政采云有限公司 | 一种基于存储库的无服务端化共享资源方法及系统 |
CN111314735A (zh) * | 2020-03-06 | 2020-06-19 | 新华智云科技有限公司 | 视频处理方法、系统及存储介质 |
CN111526202B (zh) * | 2020-04-29 | 2023-04-25 | 华润电力技术研究院有限公司 | 一种风机故障预警系统和方法 |
CN111797314A (zh) * | 2020-06-28 | 2020-10-20 | 百度在线网络技术(北京)有限公司 | 数据处理方法、装置、设备和存储介质 |
US11948010B2 (en) | 2020-10-12 | 2024-04-02 | International Business Machines Corporation | Tag-driven scheduling of computing resources for function execution |
CN112328362B (zh) * | 2020-11-03 | 2023-03-28 | 浪潮云信息技术股份公司 | 一种基于容器技术实现函数计算服务的方法 |
US20220253347A1 (en) * | 2021-02-10 | 2022-08-11 | International Business Machines Corporation | Reducing start latency of serverless microservices |
CN113065302B (zh) * | 2021-03-23 | 2023-03-17 | 芯华章科技股份有限公司 | 用于仿真逻辑系统设计的方法、仿真器及可读存储介质 |
CN114257597B (zh) * | 2021-12-22 | 2023-12-29 | 中国工商银行股份有限公司 | 用于函数计算的并发控制方法、装置、设备及介质 |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9417938B2 (en) * | 2009-03-17 | 2016-08-16 | Microsoft Technology Licensing, Llc | Remote procedure call chains |
CN101582916B (zh) * | 2009-06-19 | 2012-07-25 | 武汉钢铁(集团)公司 | 一种基于p2p的网络应用系统及其应用方法 |
CN101833712B (zh) * | 2010-05-27 | 2012-06-27 | 湖南科技大学 | 一种支持工作流活动实例成批处理执行的方法 |
CN102932474B (zh) * | 2012-11-14 | 2015-06-17 | 北京星网锐捷网络技术有限公司 | 报文解析方法、设备及系统 |
JP2016527589A (ja) * | 2013-05-17 | 2016-09-08 | ホアウェイ・テクノロジーズ・カンパニー・リミテッド | Icnを通じた大規模な会議のための多層プッシュハイブリッドサービス制御構造 |
US9794353B2 (en) * | 2013-12-19 | 2017-10-17 | Google Inc. | Systems, methods, and computer program products for service processing |
CN107209694B (zh) * | 2014-12-24 | 2022-03-08 | 皇家Kpn公司 | 用于控制按需服务供应的方法 |
US9998434B2 (en) * | 2015-01-26 | 2018-06-12 | Listat Ltd. | Secure dynamic communication network and protocol |
US20170024717A1 (en) * | 2015-07-21 | 2017-01-26 | Mitoc Group Inc. | Microapplications Software Marketplace for Digital Systems and Method of Use |
US20170060112A1 (en) * | 2015-08-24 | 2017-03-02 | Katrina Danielle PIRNER | Control program for accessing browser data and for controlling appliance |
US10235063B2 (en) * | 2015-12-08 | 2019-03-19 | Ultrata, Llc | Memory fabric operations and coherency using fault tolerant objects |
CN106681834A (zh) * | 2016-12-28 | 2017-05-17 | 上海优刻得信息科技有限公司 | 分布式计算方法、管理装置及系统 |
-
2018
- 2018-02-12 CN CN201810153094.4A patent/CN110162413B/zh active Active
- 2018-12-29 EP EP18905106.3A patent/EP3742293A4/en active Pending
- 2018-12-29 WO PCT/CN2018/125823 patent/WO2019153973A1/zh unknown
-
2020
- 2020-08-07 US US16/987,555 patent/US20200364098A1/en not_active Abandoned
Also Published As
Publication number | Publication date |
---|---|
US20200364098A1 (en) | 2020-11-19 |
WO2019153973A1 (zh) | 2019-08-15 |
EP3742293A4 (en) | 2021-03-17 |
EP3742293A1 (en) | 2020-11-25 |
CN110162413A (zh) | 2019-08-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110162413B (zh) | 事件驱动方法及装置 | |
US20090282413A1 (en) | Scalable Scheduling of Tasks in Heterogeneous Systems | |
CN113641457B (zh) | 容器创建方法、装置、设备、介质及程序产品 | |
CN112486648A (zh) | 任务调度方法、装置、系统、电子设备和存储介质 | |
US20180246765A1 (en) | System and method for scheduling jobs in distributed datacenters | |
US11507419B2 (en) | Method,electronic device and computer program product for scheduling computer resources in a task processing environment | |
CN112241316A (zh) | 一种分布式调度应用的方法以及装置 | |
CN112395736A (zh) | 一种分布交互仿真系统的并行仿真作业调度方法 | |
CN110109748A (zh) | 一种混合语言任务执行方法、装置及集群 | |
US10318456B2 (en) | Validation of correctness of interrupt triggers and delivery | |
Zhong et al. | Speeding up Paulson’s procedure for large-scale problems using parallel computing | |
CA2631255A1 (en) | Scalable scheduling of tasks in heterogeneous systems | |
US20230222004A1 (en) | Data locality for big data on kubernetes | |
CN113626173B (zh) | 调度方法、装置及存储介质 | |
US20200310828A1 (en) | Method, function manager and arrangement for handling function calls | |
CN113407343A (zh) | 一种基于资源分配的业务处理方法、装置及设备 | |
CN112486468A (zh) | 基于spark内核的任务执行方法、系统和计算机设备 | |
CN111435329A (zh) | 一种自动化测试方法和装置 | |
Thamsen et al. | Hugo: a cluster scheduler that efficiently learns to select complementary data-parallel jobs | |
CN113225269B (zh) | 基于容器的工作流调度方法、装置、系统及存储介质 | |
CN111381831B (zh) | 应用部署方法和服务器 | |
US9483241B2 (en) | Method ranking based on code invocation | |
CN112363819A (zh) | 大数据任务动态编排调度方法、装置及计算设备 | |
CN113283742A (zh) | 一种任务分配方法和装置 | |
CN112905223A (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 |