详解异步任务:任务的状态及生命周期管理

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 任务系统中有一类很重要的概念,即任务的状态和生命周期管理。细分的状态有助于在使用时能够更清楚的了解系统发生了什么内容,便于针对性的根据业务情况进行操作。

前言

任务系统中有一类很重要的概念,即任务的状态和生命周期管理。细分的状态有助于在使用时能够更清楚的了解系统发生了什么内容,便于针对性的根据业务情况进行操作。


阿里云函数计算 Serverless Task 提供了多种可查询的状态,并提供了各状态间转移的时间点。在函数的执行层面,函数计算也提供了任务的生命周期管理概念,用户可以根据需求决定当系统对任务实例进行初始化、回收等一系列动作时的执行逻辑,实现完整的运行时生命周期管理。


本文将分别对任务运行状态运行时管理这两个方面的内容进行介绍。


任务的状态


任务的状态管理


当用户提交任务并收到提交成功的返回后,任务便已经进入系统对其生命周期的管理流程中。


执行状态

说明

Enqueued

用户触发的 Task 异步消息已进入内部队列,等待处理。

Dequeued

Task 异步消息已从函数计算后端服务出队,等待触发。

Running

Task 调用执行中。

Succeeded

Task 调用执行成功。

Failed

Task 调用执行失败。

Stopped

Task 调用因用户 Cancel 而执行终止。

Stopping

Task 调用因用户 Cancel ,尝试停止任务中。

Expired

您给异步消息配置了有效期,该消息因过期已被丢弃(未触发)。

Invalid

您的执行因函数或服务被删除等原因处于无效状态(未触发)。

Retrying

Task 调用因执行错误重试中。


一个任务的状态变更由内部的一个状态机负责管理,并对外透出状态支持实时查询。整个状态转换图如下所示:


1、用户触发一次任务后,任务入队,变更为 Enqueued 状态,并返回触发成功;

2、任务在函数计算后端服务中出队,任务变为 Dequeued 状态;

3、后端会检查任务配置。如果:

  1. 配置了异步消息有效期功能,并且该消息出队时间与入队时间之差已超过有效期,则任务被丢弃,变更为 Expired 状态。任务终止;
  2. 任务对应的函数已被删除,或创建实例出现错误,则丢弃消息,任务变更为 Invalid 状态;

4、检查后任务正式进入 Running 状态。此时任务已触发实际的执行;

5、任务执行完成后,根据返回会变更为以下几个状态:

  1. Retrying:用户配置了重试次数(默认为 3),且任务执行失败,这时会进入重试中状态,之后会变更为 Running 状态;
  2. Failed:任务执行失败,且超过了重试次数。此时会将任务状态改为 Failed;
  3. Succeeded:任务执行成功。

6、如果在整个状态流转过程用户触发 Cancel,则任务会先变更为 Stopping 状态,并尝试停止任务执行。当任务停止执行成功后,任务进入 Stopped 状态。


任务运行时管理及生命周期


当任务状态进入 Running 后,任务的实际执行便已交给函数计算的运行时。


在安全性方面,函数计算会按照 VM 对不同账号进行隔离,同一个账号下的函数可能运行于同一个 VM 中。VM 内有一个负责管理容器的客户端,来实际触发函数的执行,并收集执行结果。


用户的运行实例有几个不同的状态:


函数计算对上述所有实例状态变化的过程均提供接口,支持用户侧配置相应的逻辑。

1、创建完成 -> 执行请求阶段:支持 Initializer 功能,支持初始化实例操作。用户可以配置诸如全局变量、连接池初始化等相关操作;

2、执行中 -> 执行完成后 Pause 实例:支持 PreFreeze 接口,支持在函数 Pause 实例前执行用户侧的自定义逻辑;

3、执行中 -> 外部 cancel:函数计算会强制 Restart 用户实例,在 Restart 前支持 PreStop 接口。用户可以配置优雅停止的相关逻辑,以便支持 Cancel 时的自定义行为;

4、完成后 Pause -> 销毁实例:当一段时间没有请求后,函数计算将销毁实例。此时会调用 PreStop 接口,用户可以配置销毁容器的行为(如关闭连接池等)。


任务的停止操作


目前阶段函数计算支持了停止单一任务的操作。

当用户操作停止时,支持配置 PreStop 接口,在停止前进行一系列的资源回收工作。停止操作用户可以使用 SDK 或控制台来进行调用。以 Go 语言为例,停止一次执行的伪代码如下所示:

importfc"github.com/aliyun/fc-go-sdk"funcCancelJob() {
stopInput :=fc.NewStopStatefulAsyncInvocationInput("ServiceName", "FunctionName", "TaskUUID")
output, err :=fcClient.StopStatefulAsyncInvocation(stopInput)
...}

总结

Serverless Task 提供了每个任务的状态细节,并会对这些细节进行实时的持久化。用户可以根据需要对这些状态信息进行实时的查询,并根据执行及业务情况进行相应的操作。


在任务的运行阶段,函数计算提供了所有实例状态转移过程中的相关接口,支持用户自定义任务执行前后的逻辑。结合 PreStop 功能及 Cancel 停止任务功能,用户可以方便的实现任务的优雅操作。




使用 Serverless 1 分钟轻松搭建你的首个个人网站!




免费额度,轻松上手!小白也可极速建站:无需考虑服务器和网站源码,我们为你提供免费计算资源,运维管理服务器。活动期间完成场景体验,即有机会领取天猫超市 10 元代金券

活动时间:2022年6月20日-7月1日(工作日期间领取)

答疑群:钉钉搜索 “44700570”

体验地址:浏览器访问链接(建议pc端体验)


https://developer.aliyun.com/adc/series/activity/serverless2022

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
3月前
|
数据采集 API 索引
异步任务处理系统问题之异步任务处理系统的问题如何解决
异步任务处理系统问题之异步任务处理系统的问题如何解决
|
3月前
|
弹性计算 缓存 Kubernetes
异步任务处理系统问题之任务执行子系统实现资源的弹性伸缩的问题如何解决
异步任务处理系统问题之任务执行子系统实现资源的弹性伸缩的问题如何解决
|
3月前
|
负载均衡 算法 网络协议
异步任务处理系统问题之Level 1的异步任务处理系统的问题如何解决
异步任务处理系统问题之Level 1的异步任务处理系统的问题如何解决
|
3月前
|
安全 Java 调度
线程的状态和生命周期
在多线程编程中,线程的状态和生命周期是两个非常重要的概念。了解线程的状态和生命周期可以帮助我们更好地理解和编写多线程程序。
57 4
|
3月前
|
Kubernetes Serverless 调度
异步任务处理系统问题之在阿里云函数计算平台上用户提交异步任务的问题如何解决
异步任务处理系统问题之在阿里云函数计算平台上用户提交异步任务的问题如何解决
|
5月前
|
Java API 调度
线程的生命周期和状态控制
线程的生命周期和状态控制
|
5月前
|
监控 安全 Java
任务调度和异步执行相关的功能
任务调度和异步执行相关的功能
25 0
|
6月前
|
算法 安全 Java
线程的状态和生命周期
线程的状态和生命周期
39 0
|
缓存 Java 数据库连接
架构系列——线程实现方式到底是4种还是2种?(附带线程生命周期)
架构系列——线程实现方式到底是4种还是2种?(附带线程生命周期)
Flowable 流程实例的挂起(暂停)与激活
Flowable 流程实例的挂起(暂停)与激活
Flowable 流程实例的挂起(暂停)与激活

热门文章

最新文章