认识阿里云「编排系统」

功能分析

  1. 支持历史版本、日志等元信息,以及有运行统计数据
  2. 支持串行和并行编排,并且可以互相嵌套
  3. 对接阿里云其他业务,并将其作为模块功能接入进来
  4. 用户在使用业务模块时(例如函数计算),会引导开通未此模块需要的功能和进行授权,体验非常丝滑

配置文件分析

和内部实现的「可编排BFF设计系统」(中间层接口编排系统)类似,编排的本质就是定义、维护和解析一份json配置文件。

第一张图对应的编排配置文件就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
{
"actions": {
"函数计算": {
"type": "FC",
"inputs": {
"triggerType": "http",
"method": "GET",
"serviceName": "scf-server",
"functionName": "scf-nodejs12",
"region": "cn-shanghai",
"connection": {
"connectionId": "/logic/1554718707364643/connectors/FC/connections/AliyunLogicComposerAccessingFCRole",
"content": "acs:ram::1554718707364643:role/aliyunlogiccomposeraccessingfcrole",
"connectionName": "AliyunLogicComposerAccessingFCRole"
}
},
"runAfter": {}
},
"初始化变量": {
"type": "InitializeVariable",
"inputs": {
"type": "String",
"name": "abc"
},
"runAfter": {
"函数计算": [
"Succeeded"
]
}
},
"通过自定义机器人发送消息": {
"type": "DingTalk::SendMessageViaChatbot",
"inputs": {
"accessToken": "的广泛发动更多风格",
"content": "dfgdfgdfgdfgdfg"
},
"runAfter": {
"执行_JavaScript_代码": [
"Succeeded"
]
}
},
"执行_JavaScript_代码": {
"type": "JavascriptCode",
"inputs": {
"code": "const text = $context.concat('Hello', 'world');\nreturn text;"
},
"runAfter": {
"函数计算": [
"Succeeded"
]
}
}
},
"triggers": {
"manual": {
"type": "Request",
"inputs": {
"method": "GET",
"authentication": "None",
"queriesSchema": {
"type": "object",
"properties": {},
"required": []
}
}
}
},
"schemaVersion": "2018-12-12",
"version": "1.0.0"
}

可以看到,配置文件中有2个重要属性:actions和triggers

  • actions:定义每一步的元信息(inputs),以及触发条件(runAfter)
  • triggers:定义编排整体的触发条件,例如通过HTTP请求触发、定时触发、服务触发

actions结构设计的巧妙之处

  1. 每个action都在actions下的第一个层级,没有像回调地狱那样的嵌套(得益于runAfter)
  2. actions是对象结构,通过action标识读action配置速度快
  3. aciton上的runAfter设计非常巧妙,基于事件的模型设计思路

实现原理分析

通过配置文件,大概能看出来实现的原理:

  • 解析器解析actions配置,并且将每个action通过runAfter串连起来。
  • 通过triggers定义,将其接入http服务或者设置定时任务
  • actions整体触发的时候,负责执行的执行器将第一步解析结果进行执行