函数流概述
当前仅“华北-北京四、华东-上海二、华南-广州、华东-上海一、亚太-新加坡”区域支持函数流功能。
函数流是一个面向无服务器计算领域,编排无服务器分布式应用的工作流服务。基于该服务,用户可以通过Low Code以及可视化的方式将多个独立的无服务器函数用顺序、分支、并行等方式轻松编排成一个完整的应用,并提供监控和管理平台,用于诊断和调试应用。
本章节主要介绍函数流组件、组件编排规则、表达式运算符和配置示例。
组件说明
函数流提供多种类型的组件,用户可以通过拖拽组件、配置组件和连接组件进行可视化编排,实现函数任务流的编排。使用函数流功能,请先了解表1。
类型 |
名称 |
说明 |
---|---|---|
服务组件 |
函数 |
FunctionGraph函数,如何创建函数请参见创建函数。 |
EG |
事件网格服务(EventGrid),EG节点会发布已配置的事件至指定的EG事件通道,如何创建EG资源请参见事件网格相关文档。 |
|
流程控制器 |
回调节点 |
通过人工干预实现对执行中函数流的条件控制,函数流将阻塞在回调节点,直到用户调用回调接口以继续函数流执行,从而达到人工审批的效果。当前只支持标准函数流。 |
子流程 |
把已创建的“函数流”任务作为“子流程”组合成一个新的函数流任务。 |
|
并行分支 |
用于创建多个并行分支的控制器,以便同时执行多个分支任务,并可根据分支执行结束后控制下一步流程。 |
|
开始节点 |
只能加入触发器,用于标识流程的开始,一个流程只能有一个开始节点。 |
|
异常处理 |
用于控制函数执行失败后的下一步流程。 |
|
循环节点 |
用于对数组中每个元素进行循环处理。每次循环会执行一次循环内部的子流程。 |
|
时间等待 |
用于控制当前流程在指定时间延迟后再调用下一个流程。 |
|
服务节点 |
用于对多个函数构成的复杂操作进行抽象,可以将多个函数操作合并成一个原子节点进行管理。 |
|
条件分支 |
用于根据条件判断是否执行下一分支。 |
|
结束节点 |
用于标识流程的结束。 |
编排规则
- 设计的函数流必须是一个有向无环图,从开始节点出发,开始节点后续必须且只能连接一个节点(除了异常处理和结束节点);流程必须在某一个节点结束,结束流程有两种形式:
- 流程中存在的节点没有任何后继节点,且后续节点非条件分支,并行分支或开始节点。
- 流程中存在结束节点,且结束节点后续无其他节点。
- 组件设计规则
表2 触发器、函数和EG 参数
说明
创建函数流时,是否必选
触发器
- 当前允许流程中配置0-10个触发器。
- 触发器必须配置在开始节点内。
- 触发器不允许连接其他任何节点,也不允许被其他节点连接。
否
函数
- 当前允许流程中配置0-99个函数节点。
- 当函数连接异常处理节点时,最多可以再连接一个非开始节点和非异常处理节点。
- 当函数不连接异常处理节点时,只能连接一个非开始节点。
否
EG
- 当前允许流程中配置0-10个EG节点。
- 当EG节点连接异常处理节点时,最多可以再连接一个非开始节点和非异常处理节点。
- 当EG节点不连接异常处理节点时,只能连接一个非开始节点。
否
表3 流程控制器 参数
说明
创建函数流时,是否必选
回调节点
回调节点限制规则参考表2中函数参数,但回调节点不可为服务节点的子节点。
否
子流程
该节点选择已创建的函数流任务。
否
并行分支
- 用于标识节点后面的分支会并行执行。
- 后继节点允许连接1-20个节点(除了异常处理,开始节点和结束节点),至少连接一个节点。
否
开始节点
- 用于标识流程开始,每个流程必须有且只能有一个开始节点。
- 开始节点后面必须接1个节点,后续节点类型不能是结束节点或者异常处理。
必选
异常处理
后面可以接0-10个节点,后继节点不能是开始节点,结束节点和异常处理节点。
否
循环节点
用来对数组中每个元素进行循环处理。每次循环会执行一次循环内部的子流程。
循环节点内部子流程需要满足如下规则:
- 只能有一个起始节点(没有前驱节点),起始节点只能使用函数,时间等待节点。
- 循环节点内部只允许编排函数,时间等待,异常处理节点。
否
时间等待
后面可以连接0个或1个节点,节点类型不能是开始节点和异常处理节点。
否
服务节点
服务节点由多个函数节点组成,后续节点可以是结束节点或异常处理节点。
否
条件分支
后面可以连接2-20个后继节点,后继节点类型不能为开始节点,结束节点和异常处理节点。
否
结束节点
后面不能接任何节点。
否
表达式运算符说明
异常处理和条件分支的表达式的结构为 [JsonPath] + [逻辑运算符] + [对比数据],简单示例:$.age >= 20
JsonPath说明
Operator |
Supported |
Description |
$ |
Y |
执行查询的root,所有正则表达式由此启动。 |
@ |
Y |
过滤正在处理的当前位置。 |
. |
Y |
子节点。 |
[ (, )] |
Y |
数组索引。 |
[start:end] |
Y |
数组切片运算符。 |
[?()] |
Y |
过滤表达式。 表达式必须计算为布尔值。 |
参见示例
- 简单取值:JSON数据样例
{ "fruits": [ "apple", "orange", "pear" ], "vegetables": [{ "veggieName": "potato", "veggieLike": true }, { "veggieName": "broccoli", "veggieLike": false }] }
$.fruits表达式含义:取出fruits下对应的所有value。
$.fruits解析结果:["apple","orange","pear"]
- 简单过滤:JSON数据样例
{ "fruits": [ "apple", "orange", "pear" ], "vegetables": [{ "veggieName": "potato", "veggieLike": true }, { "veggieName": "broccoli", "veggieLike": false }] }
表达式:$.vegetables[?(@.veggieLike == true)].veggieName
表达式含义:取出key值vegetables对应的所有value,并根据过滤条件输出veggieLike为True的veggieName。
取值结果:[potato]
逻辑运算符说明
使用以下数据作为例子中的输入参数:
{ "name" : "apple", "weight": 13.4, "type": [3,4,6,8], "obj": { "a" : 1 } }
支持的运算符如下:
符号 |
作用 |
例子 |
返回值 |
备注 |
---|---|---|---|---|
== |
相等 |
$.name == 'apple' |
true |
支持的数据类型包括:int,float,string,bool,nil |
!= |
不等 |
$.name != 'apple' |
false |
支持的数据类型包括:int,float,string,bool,nil |
< |
小于 |
$.weight < 12 |
false |
只支持数字类型 |
> |
大于 |
$.weight > 12 |
true |
只支持数字类型 |
<= |
小于等于 |
$.weight <= 13.4 |
true |
只支持数字类型 |
>= |
大于等于 |
$.weight >= 13.4 |
true |
只支持数字类型 |
'*' |
通配符 |
$.weight == '*' |
true |
只支持在== 比较中使用 |
|| |
或 |
$.name == 'apple' || $.weight < 12 |
true |
支持使用()的复杂与或逻辑 |
&& |
且 |
$.name == 'apple' && $.weight < 12 |
false |
支持使用()的复杂与或逻辑 |
- 字符串格式常量需要使用‘’包含,例如:‘apple’
- jsonpath表达式中不能出现上述保留字符'=', '!=', '<', '>', '|', '&'