本文介绍了工作流调度固定版本或预留资源函数和Serverless工作流实现的具体步骤。

简介

在实际生产场景中,任务流所调度的函数因为业务场景变化可能需要频繁变更,您会考虑到如何避免变更带来的非预期行为,控制变更稳定性。在Serverless工作流任务步骤使用固定版本的函数将对以下场景产生帮助:

  • 流程A编排了多个函数f1、f2和f3,同一次任务必须执行函数的相同版本。假如流程A正在执行中,已执行完了函数f1,但是此时进行了函数更新,则正在执行的流程可能会执行函数f2、f3的最新版本造成非预期情况发生。那么必须保证,每次流程执行函数的版本在执行时已经固定。
  • 某个函数的快速回滚。上线后,发现流程执行失败是由于新变更引起的,那么需要快速回滚流程执行上一固定版本。
  • 通过函数别名调用预留资源函数、降低函数冷启动时间及优化函数成本

函数计算版本别名可以有效支持类似上述场景的持续集成、持续发布的各种需求。下文将通过一个具体示例展示如何在流程中使用别名调用预留资源函数。预留资源函数是依赖于固定版本函数的,因此对于其他需要固定版本的场景,也可参见本示例操作。

流程

本次示例操作包含以下步骤:

  1. 创建函数预留实例
  2. 创建工作流
  3. 使用命令行或控制台执行并观察预留函数执行

步骤一:创建函数预留实例

首先创建一个名为fnf-demo的函数计算服务,并在该服务下创建一个名为provision的Python3函数并发布版本、别名,生成预留实例,详细步骤,请参见预留模式操作

假设创建的函数版本为1,别名为online,并发布了一个预留实例。函数内容如下。

import logging

def handler(event, context):
  logger = logging.getLogger()

  logger.info('Started function test')
  return {"success": True}           

步骤二:创建工作流

Serverless工作流对函数计算版本及别名进行了原生支持。

Serverless工作流的Task步骤中,默认填写的resourceArn一般为acs:fc:{region}:{accID}:services/fnf/functions/test。按照函数执行规则,默认会选择最新的函数版本执行。您可以发布版本别名,并在工作流Task步骤中填写resourceArn一项为acs:fc:{region}:{accID}:services/fnf.{别名or版本}/functions/test来实现对特定版本函数的调用。因此,流程可以定义如下:

version: v1
type: flow
steps:
  - type: task
    resourceArn: acs:fc:::services/fnf-demo.online/functions/provision 
    # 也可以使用版本号,resourceArn: acs:fc:::services/fnf-demo.1/functions/provision。
    name: TestFCProvision          

步骤三:使用命令行或控制台执行并观察预留函数执行

  1. 启动工作流执行。使用预留模式前。1
  2. 使用预留模式后。2

从工作流的执行时间来看,在task步骤从未使用预留模式前的耗时500 ms缩短为预留模式后的230 ms。