搜索本产品文档关键词
基本介绍
所有文档
menu
没有找到结果,请重新输入

函数计算 CFC

基本介绍

本文介绍了流程定义语言的基本知识和相关使用示例。

流程定义语言

流程定义语言是一种基于 YAML 的结构化语言,用于定义状态机、节点,包括负责执行的 operation 节点,决定下一跳的 switch 节点,停止执行并抛出错误的 fail 节点等各类节点,这些节点组合起来可以构建复杂的业务逻辑。

下面为一个简单示例,工作流通过输入数据中的 doExec 值判断是否进入 operation 节点执行 CFC 函数。

name: demo
start: demoSwitch
version: 1.0.0
timeoutSeconds: 100
description: "XFlow 流程定义语言示例"
states:
  - type: switch
    name: demoSwitch
    description: "whether to exec demo"
    conditions:
      - condition: .doExec == true
        next: invokeFunc
      - condition: .doExec == false
        next: stop
  - type: operation
    name: invokeFunc
    description: "invoke a function"
    resource: "brn:bce:cfc:su:7c54a6e148:function:test:$LATEST"
    end: true
  - type: fail
    name: stop
    cause: "demo stopped"
字段 描述
name(必需) 流程定义语言的名字
start(必需) 用于指定流程的开始节点
states(必需) 节点定义的集合
version(可选) 版本信息,需要符合 semver 规则
timeoutSeconds(可选) 工作流的超时时间,单位为秒,最长为 172800,如果流程实际执行超过该时间则会被终止
description(可选) 描述信息

节点类型

节点是工作流的一个基本单元,所有的节点都定义在工作流的 states 参数里。每个节点都有自己的类型,在节点内部使用 type 参数来表示。目前工作流支持的节点类型如下:

  • 传递节点(pass)

    pass 节点可以直接生成常量数据,可用来在初始构建阶段提前占位,或通过修改输出调试工作流。

  • 选择节点(switch)

    根据节点的输入数据做条件判断,选择执行不同的分支节点。

  • 等待节点(wait)

    等待一段时间,不做其它操作。

  • 失败节点(fail)

    终止工作流的执行,并把结果执行标记为失败。

  • 成功节点(succeed)

    终止工作流的执行,并把结果执行标记为成功,类似编程语言中的 return 0;

  • 任务节点(operation)

    负责调用 CFC 函数。

  • 并行节点(parallel)

    可在节点内定义多个子分支,并行执行。

  • 循环节点(foreach)

    循环处理数组数据,类似编程语言中的 for 循环。

节点拓扑关系

工作流开始运行时,首先进入 start 字段对应的节点。在一个节点内部, 定义 next: invoke 表示节点的下一跳指向为 invoke 节点,定义 end: true 表示该节点为结束节点,没有下一跳。在节点执行完成后,XFlow 就会根据这些定义来决定接下来的动作。

关于工作流的开始、结束、下一跳指向,在定义时需要遵循如下原则:

  • 节点需要明确定义下一跳指向或结束

    节点必须定义且只能定义 nextend 其中的一个,流程的最后一个节点需要定义 end: true

    fail/succeed 节点是一种特殊情况,它们表示工作流的执行已结束,已经内含了 end 逻辑,因此不允许再指定 nextend 参数。

  • 只能有一个开始节点,可以有多个结束节点

    一个工作流内可能会存在多个分支,比如 parallel 节点定义了两个同时执行的分支节点,每个分支的最后一个节点,都需要表明自己为结束节点,即定义 end: true

  • 节点有层级和分支之分,不同层级、分支的节点是隔离的

    以 parallel 节点为例,parallel 节点内可定义多个节点分支,分支内的节点与 parallel 节点是父子关系,并不在一个层级,因此分支内的节点不可以用 next 指向上层级的节点,同样上层节点的 next 也不可以指向子层级。另外,不同分支的节点之间也是隔离的。

    在下面示例中,s1、s2 节点在 hello 节点内部,因此它们的 next 不可以设置为外层的 world 节点。s3 节点与 s1、s2 虽然在一个节点,但它们属于不同分支,因此 s3 也不可以指向 s1、s2。

    name: parallel-demo
    start: hello
    states:
      - type: parallel
        name: hello
        branches:
          - start: s1
            states:
              - type: pass
                name: s1
                next: s2
              - type: pass
                name: s2
                end: true
          - start: s3
            states:
              - type: wait
                name: s3
                seconds: 3
                end: true
        next: world
      - type: succeed
        name: world

示例图如下所示:

demo
上一篇
快速入门
下一篇
输入和输出