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

简介

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

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

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

Serverless 工作流实现

本次操作主要分为以下 3 个步骤:

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

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

首先创建一个名为 fnf-demo 的 FC 服务,并在该服务下创建一个名为 provision 的 Python3 函数并发布版本、别名,生成预留实例,详细步骤可参见 FC 文档

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

import logging

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

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

步骤 2:创建工作流

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          

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

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

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