当前位置: 首页 > 科技观察

解密函数计算异步任务能力的任务状态和生命周期管理_0

时间:2023-03-20 10:19:10 科技观察

作者|简一1.前言任务系统中有一个非常重要的概念,就是任务的状态。它的本质是任务的生命周期管理。细分的状态有助于在使用时更清楚地了解系统发生了什么,从而可以根据业务情况进行操作。FunctionComputeServerlessTask提供各种状态可以查询,并提供状态之间的转换时间。在函数的执行层面,函数计算也提供了任务生命周期管理的概念。用户可以根据需要决定系统初始化和回收任务实例时的执行逻辑,实现完整的运行时生命周期管理。本文将从任务运行状态和运行时管理两个方面进行介绍。二、任务状态和生命周期管理1、任务状态管理执行状态描述Enqueued用户触发的Task异步消息已经进入内部队列,等待处理。DequeuedTask异步消息已经从函数计算后端服务中出队,等待触发。正在执行RunningTask调用。SucceededTask调用成功执行。FailedTask调用未能执行。StoppedTask调用执行因用户取消而终止。StoppingTask被用户调用Cancel,试图停止任务。已过期您为异步消息配置了一个过期日期,该消息已因过期而被丢弃(未触发)。无效您的执行处于无效状态(未触发),因为函数或服务已被删除等。由于执行错误,RetryingTask调用正在重试。当用户提交任务并收到提交成功的返回时,任务就进入了系统的生命周期管理流程。任务的状态变化由内部状态机管理,状态对外暴露,支持实时查询。整个状态转换图如下:图1用户触发任务后,任务进入队列,变为Enqueued状态,返回触发成功;任务从函数计算后端服务出队,任务变为出队状态;后端将检查任务配置。如果:配置了异步消息有效期功能,消息出队时间和入队时间之差超过有效期,任务将被丢弃,变为Expired状态。任务终止;该任务对应的函数已被删除,或者创建实例出错,该消息将被丢弃,该任务变为Invalid状态;勾选后,任务将正式进入Running状态。此时任务已经触发实际执行;任务执行完成后,会根据返回变为以下状态:重试中:用户配置重试次数(默认3次),任务执行失败,则进入重试状态。state稍后会变为Running状态;Failed:任务执行失败,超过重试次数。此时任务状态会变为Failed;成功:任务执行成功。如果在整个状态转换过程中用户触发了Cancel,任务会先变为Stopping状态,并尝试停止任务执行。当任务成功停止后,任务进入Stopped状态。2.任务运行时管理和生命周期当任务状态进入运行时,任务的实际执行已经交给了函数计算的运行时。在安全方面,函数计算通过VM隔离不同的账户,同一账户下的函数可能运行在同一个VM中。VM中有一个客户端负责管理容器来实际触发函数的执行并收集执行结果。用户运行的实例有几种不同的状态:图2.函数计算为以上所有实例状态变化的过程提供了接口,并支持在用户侧配置相应的逻辑。Created->Execution请求阶段:支持Initializer函数,初始化实例操作。用户可以配置全局变量、连接池初始化等相关操作;inexecution->Pauseinstanceafterexecution:支持PreFreeze接口,支持用户端自定义函数Pause实例前的逻辑;inexecution->externalcancel:function计算会强制重启用户实例,并支持重启前的PreStop接口。用户可以配置优雅停止的相关逻辑,支持Cancel时的自定义行为;Pause->Destroyinstanceaftercompletion:函数计算会在一段时间没有请求后销毁实例。此时会调用PreStop接口,用户可以配置销毁容器的行为(如关闭连接池等)。图33.任务停止操作目前函数计算支持停止单个任务的操作。当用户操作停止时,支持配置PreStop接口在停止前执行一系列资源回收任务。用户可以通过SDK或控制台调用停止操作。以Go语言为例,停止执行的伪代码如下:FunctionName","TaskUUID")output,err:=fcClient.StopStatefulAsyncInvocation(stopInput)...}3.总结ServerlessTask提供每个任务的状态细节并实时保存这些细节。用户可以根据需要实时查询这些状态信息,并根据执行情况和业务情况进行相应的操作。在任务运行阶段,函数计算提供所有实例状态转换相关的接口,支持任务执行前后的自定义逻辑。结合PreStop和Cancel停止任务的功能,用户可以方便的实现任务的优雅操作。