作者: 渐意
前言
工作零碎中有一类很重要的概念,即工作的状态。其本质是对工作的生命周期治理。细分的状态有助于在应用时可能更分明的理解零碎产生了什么内容,便于针对性的依据业务状况进行操作。函数计算 Serverless Task 提供了多种可查问的状态,并提供了各状态间转移的工夫点。在函数的执行层面,函数计算也提供了工作的生命周期治理概念,用户能够依据需要决定当系统对工作实例进行初始化、回收等一系列动作时的执行逻辑,实现残缺的运行时生命周期治理。本文将别离对工作运行状态及运行时治理这两个方面的内容进行介绍。
工作的状态及生命周期的治理
工作的状态治理
当用户提交工作并收到提交胜利的返回后,工作便曾经进入系统对其生命周期的治理流程中。一个工作的状态变更由外部的一个状态机负责管理,并对外透出状态反对实时查问。整个状态转换图如下所示:
图 1
- 用户触发一次工作后,工作入队,变更为 Enqueued 状态,并返回触发胜利;
- 工作在函数计算后端服务中出队,工作变为 Dequeued 状态;
- 后端会查看工作配置。如果
-
- 配置了异步音讯有效期性能,并且该音讯出队工夫与入队工夫之差已超过有效期,则工作被抛弃,变更为 Expired 状态。工作终止;
- 工作对应的函数已被删除,或创立实例呈现谬误,则抛弃音讯,工作变更为 Invalid 状态;
- 查看后工作正式进入 Running 状态。此时工作已触发理论的执行;
- 工作执行实现后,依据返回会变更为以下几个状态:
-
- Retrying:用户配置了重试次数(默认为 3),且工作执行失败,这时会进入重试中状态,之后会变更为 Running 状态;
- Failed:工作执行失败,且超过了重试次数。此时会将工作状态改为 Failed;
- Succeeded:工作执行胜利。
- 如果在整个状态流转过程用户触发 Cancel,则工作会先变更为 Stopping 状态,并尝试进行工作执行。当工作进行执行胜利后,工作进入 Stopped 状态。
工作运行时治理及生命周期
当工作状态进入 Running 后,工作的理论执行便已交给函数计算的运行时。在安全性方面,函数计算会依照 VM 对不同账号进行隔离,同一个账号下的函数可能运行于同一个 VM 中。VM 内有一个负责管理容器的客户端,来理论触发函数的执行,并收集执行后果。
用户的运行实例有几个不同的状态:
图 2
函数计算对上述所有实例状态变动的过程均提供接口,反对用户侧配置相应的逻辑。
- 创立实现 -> 执行申请阶段:反对 Initializer 性能,反对初始化实例操作。用户能够配置诸如全局变量、连接池初始化等相干操作;
- 执行中 -> 执行实现后 Pause 实例:反对 PreFreeze 接口,反对在函数 Pause 实例前执行用户侧的自定义逻辑;
- 执行中 -> 内部 cancel:函数计算会强制 Restart 用户实例,在 Restart 前反对 PreStop 接口。用户能够配置优雅进行的相干逻辑,以便反对 Cancel 时的自定义行为;
- 实现后 Pause -> 销毁实例:当一段时间没有申请后,函数计算将销毁实例。此时会调用 PreStop 接口,用户能够配置销毁容器的行为(如敞开连接池等)。
图 3
工作的进行操作
目前阶段函数计算反对了进行繁多工作的操作。当用户操作进行时,反对配置 PreStop 接口,在进行前进行一系列的资源回收工作。进行操作用户能够应用 SDK 或控制台来进行调用。以 Go 语言为例,进行一次执行的伪代码如下所示:
import fc "github.com/aliyun/fc-go-sdk"
func CancelJob() {stopInput := fc.NewStopStatefulAsyncInvocationInput("ServiceName", "FunctionName", "TaskUUID")
output, err := fcClient.StopStatefulAsyncInvocation(stopInput)
...
}
总结
Serverless Task 提供了每个工作的状态细节,并会对这些细节进行实时的长久化。用户能够依据须要对这些状态信息进行实时的查问,并依据执行及业务状况进行相应的操作。在工作的运行阶段,函数计算提供了所有实例状态转移过程中的相干接口,反对用户自定义工作执行前后的逻辑。联合 PreStop 性能及 Cancel 进行工作性能,用户能够不便的实现工作的优雅操作。
往期回顾
函数计算异步工作能力介绍 – 工作触发去重
点击此处,查看更多函数计算相干内容!