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

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

前言

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


阿里云函数计算 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

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
2月前
|
JavaScript API 容器
第三十五章 多个组件状态数据共享
第三十五章 多个组件状态数据共享
|
2月前
|
算法 安全 Java
线程的状态和生命周期
线程的状态和生命周期
19 0
|
5月前
|
DataWorks 网络架构
DataWorks节点执行成功后,可以通过Rest通知进行消息通知
DataWorks节点执行成功后,可以通过Rest通知进行消息通知
39 1
|
7月前
|
缓存 Java 数据库连接
架构系列——线程实现方式到底是4种还是2种?(附带线程生命周期)
架构系列——线程实现方式到底是4种还是2种?(附带线程生命周期)
|
10月前
|
SQL
Flowable 流程实例的挂起(暂停)与激活
Flowable 流程实例的挂起(暂停)与激活
Flowable 流程实例的挂起(暂停)与激活
|
10月前
|
XML SQL Java
Flowable 设置任务处理人的四种方式
Flowable 设置任务处理人的四种方式
|
数据处理
使用队列和事务实现采集数据实例流程
使用队列和事务实现采集数据实例流程
61 0
|
调度
任务同步管理的方法
任务同步管理的方法
72 0
|
Java 程序员 调度
线程的创建方式,状态周期管理
进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
105 0
线程的创建方式,状态周期管理
|
Java 调度
线程的生命周期和状态
线程通常有五种状态,创建,就绪,运行、阻塞和死亡状态。
141 0
线程的生命周期和状态

热门文章

最新文章

相关产品

  • 函数计算
  • 云工作流
  • Serverless 应用引擎