1- # 工作流分支节点设计文档
1+ # 工作流分支节点设计文档
22
33## 1. 文档信息
44- 版本:1.21.0
55- 状态:已更新
6- - 设计范围:DSS 发布层分支适配 + 语义对齐要求
6+ - 设计范围:DSS 分支节点运行态、发布层分支适配与语义对齐
77
88## 2. 设计结论
9- 本版本采用“DSS 规则配置 + 发布为 decision + 语义对齐 DSS FlowExecution”的方案:
9+ 本版本采用“DSS 规则配置统一为编号属性 + DSS 运行态直接选路 + 发布为 decision + 语义对齐 DSS FlowExecution”的方案:
1010- DSS 节点类型保持 ` workflow.branch ` 。
1111- 规则配置保持 ` branch.rules ` 。
12- - 发布到 Schedulis 时分支节点 ` .job ` 转换为 ` type=decision ` 。
12+ - ` branch.rules ` 格式统一为 ` condition.N / on.success.N / on.failure.N ` 。
13+ - DSS 运行态直接解析该格式并完成分支选路。
14+ - 发布到 Schedulis 时分支节点 ` .job ` 转换为 ` type=decision ` ,沿用相同编号属性。
1315- Schedulis 运行期必须按 DSS FlowExecution 语义判定分支下游。
1416
1517## 3. 总体架构
1618
1719### 3.1 关键模块
20+ - ` BranchExpressionUtils `
21+ - DSS 运行态解析 ` branch.rules ` 。
22+ - 按编号聚合 ` condition.N / on.success.N / on.failure.N ` 。
23+ - 提供条件表达式求值能力。
24+ - ` BranchNodeRunner `
25+ - DSS 运行态分支节点执行器。
26+ - 按编号顺序评估规则。
27+ - 条件为真时选择 ` on.success.N ` ,条件为假时选择 ` on.failure.N ` 。
28+ - ` DSSFlowServiceImpl `
29+ - 保存/校验阶段解析分支规则。
30+ - 校验 success/failure 目标是否属于当前分支节点的真实下游。
1831- ` BranchWorkflowRewriteConverter `
1932 - 提取分支规则并补充 route 元数据。
33+ - ` LinkisJobConverter `
34+ - 将统一后的 ` branch.rules ` 转换为 ` decision ` 节点属性:` condition.N/on.success.N/on.failure.N ` 。
2035- ` BranchRouteJobTuning `
2136 - 将分支节点类型调优为 ` decision ` 。
22- - ` LinkisJobConverter `
23- - 生成 decision 节点属性:` condition.N/on.success.N/on.failure.N ` 。
2437- ` AzkabanDssJobType `
2538 - 仅保留动态变量提取与 props 输出,不承担 guard/route 分支裁剪。
2639
2740### 3.2 架构示意图
2841``` mermaid
2942flowchart LR
30- A[workflow.branch + branch.rules] --> B[BranchWorkflowRewriteConverter]
31- B --> C[LinkisJobConverter]
32- C --> D[BranchRouteJobTuning]
33- D --> E[type=decision .job]
34- E --> F[Schedulis]
35- F --> G[按 DSS FlowExecution 语义调度]
43+ A[workflow.branch + branch.rules] --> B[BranchExpressionUtils]
44+ B --> C[BranchNodeRunner]
45+ B --> D[DSSFlowServiceImpl]
46+ C --> E[DSS 运行态按编号规则选路]
47+ A --> F[BranchWorkflowRewriteConverter]
48+ F --> G[LinkisJobConverter]
49+ G --> H[BranchRouteJobTuning]
50+ H --> I[type=decision .job]
51+ I --> J[Schedulis]
52+ J --> K[按 DSS FlowExecution 语义调度]
3653```
3754
3855## 4. 核心设计
3956
40- ### 4.1 决策节点发布设计
57+ ### 4.1 规则格式统一设计
58+ 统一后的 ` branch.rules ` 使用如下形式:
59+ ``` properties
60+ condition.1 =amount == 101
61+ on.success.1 =sql_2762
62+ on.failure.1 =sql_1358
63+ condition.2 =amount > 200
64+ on.success.2 =sql_8277
65+ on.failure.2 =sql_7655
66+ ```
67+
68+ 约束:
69+ 1 . 支持多个 ` condition.N ` ,规则数量不限制。
70+ 2 . 规则之间支持换行或 ` ; ` 分隔。
71+ 3 . 同一编号下,` condition.N ` 必填。
72+ 4 . 同一编号下,` on.success.N ` 和 ` on.failure.N ` 至少一个非空。
73+ 5 . 不支持 ` default ` 、` else ` 、` * ` 默认分支关键字。
74+
75+ ### 4.2 DSS 运行态解析与选路设计
76+ DSS 运行态读取 ` branch.rules ` 后,处理流程如下:
77+ 1 . 按换行或 ` ; ` 切分原始文本。
78+ 2 . 按 key 前缀识别 ` condition. ` 、` on.success. ` 、` on.failure. ` 。
79+ 3 . 依据编号 ` N ` 聚合同一组规则。
80+ 4 . 按编号升序逐条求值:
81+ - 条件成立,取 ` on.success.N `
82+ - 条件不成立,取 ` on.failure.N `
83+ 5 . 若当前选出的目标为空,或目标不是当前分支节点真实下游,则继续评估下一条规则。
84+ 6 . 若全部规则均未选中有效下游,则分支节点执行失败。
85+
86+ ### 4.3 DSS 运行态流程图
87+ ``` mermaid
88+ flowchart TD
89+ A[读取 branch.rules] --> B[按换行或分号切分]
90+ B --> C[按编号聚合规则]
91+ C --> D[按编号顺序评估 condition.N]
92+ D --> E{condition.N 是否成立}
93+ E -->|是| F[选择 on.success.N]
94+ E -->|否| G[选择 on.failure.N]
95+ F --> H{目标是否非空且为真实下游}
96+ G --> H
97+ H -->|是| I[选中该下游节点]
98+ H -->|否| J[继续评估下一条规则]
99+ J --> D
100+ ```
101+
102+ ### 4.4 决策节点发布设计
41103分支节点发布规则:
42- 1 . 读取 ` wds. branch.route.rule.text ` 。
43- 2 . 按 ` ; ` 切分规则 。
44- 3 . 每条规则按最后一个 ` = ` 切分条件与目标 。
45- 4 . 输出 :
104+ 1 . 读取统一后的 ` branch.rules ` 。
105+ 2 . 按换行或 ` ; ` 切分规则条目 。
106+ 3 . 识别 ` condition.N ` 、 ` on.success.N ` 、 ` on.failure.N ` 。
107+ 4 . 按编号聚合并输出 :
46108 - ` condition.N `
47109 - ` on.success.N `
48- - ` on.failure.N= `
49- 5 . ` default=xxx ` 转换为 ` condition.N=true ` 。
110+ - ` on.failure.N `
111+ 5 . 发布后的 ` .job ` 使用:
112+ - ` type=decision `
113+ - 连续编号 decision 属性
50114
51- ### 4.2 字段过滤设计
115+ ### 4.5 字段过滤设计
52116当 ` type=decision ` 时,不输出 linkis 专属字段:
53117- ` linkis.version `
54118- ` linkistype `
55119- ` command `
56120
57- ### 4.3 分支语义对齐设计(重点)
58- 对齐依据:DSS ` FlowDependencyResolverImpl ` 。
121+ ### 4.6 分支语义对齐设计(重点)
122+ 对齐依据:DSS FlowExecution 语义 。
59123
60124关键语义:
611251 . 父节点未全部完成 -> 等待。
@@ -66,8 +130,9 @@ flowchart LR
66130特别说明:
67131- 混合上游场景(分支未命中 + 普通父成功)必须 ` skip ` 。
68132- 该语义优先于“任一父成功即可执行”。
133+ - DSS 运行态的 ` on.failure.N ` 仅决定分支节点本身选中的下游目标,不改变下游节点的依赖判定矩阵。
69134
70- ### 4.4 状态判定流程图
135+ ### 4.7 状态判定流程图
71136``` mermaid
72137flowchart TD
73138 A[候选节点X] --> B{父节点是否全部完成?}
@@ -86,35 +151,49 @@ flowchart TD
86151- 结果:X 必须 ` skip ` 。
87152- 原因:分支未命中判定优先,严格对齐 DSS FlowExecution。
88153
89- ### 5.2 示例
154+ ### 5.2 编号规则示例
90155输入:
91- ``` text
92- branch.rules = b==200=sql_1345;b<50=sql_9000
156+ ``` properties
157+ condition.1 =amount == 101
158+ on.success.1 =sql_2762
159+ on.failure.1 =sql_1358
160+ condition.2 =amount > 200
161+ on.success.2 =sql_8277
162+ on.failure.2 =sql_7655
93163```
94164
95- 输出:
165+ DSS 运行态语义:
166+ - 若 ` amount == 101 ` ,优先选择 ` sql_2762 `
167+ - 若 ` amount != 101 ` ,优先选择 ` sql_1358 `
168+ - 若第一组规则未落到真实下游,再继续评估第 2 组规则
169+
170+ 发布输出:
96171``` properties
97172type =decision
98- condition.1 =b ==200
99- on.success.1 =sql_1345
100- on.failure.1 =
101- condition.2 =b<50
102- on.success.2 =sql_9000
103- on.failure.2 =
173+ condition.1 =amount == 101
174+ on.success.1 =sql_2762
175+ on.failure.1 =sql_1358
176+ condition.2 =amount > 200
177+ on.success.2 =sql_8277
178+ on.failure.2 =sql_7655
104179```
105180
106181## 6. 实现约束
107- 1 . 不再依赖 DSS ` guard ` 运行时裁剪语义来决定下游执行。
108- 2 . 不允许 Schedulis 语义偏离 DSS 矩阵规则。
109- 3 . jobtype 仅负责动态变量进入 props,供 decision 条件使用。
182+ 1 . DSS 与 Schedulis 使用统一的编号规则格式。
183+ 2 . 不再使用旧的 ` 条件=目标节点名 ` 分支规则格式。
184+ 3 . 不再依赖 DSS ` guard ` 运行时裁剪语义来决定下游执行。
185+ 4 . 不允许 Schedulis 语义偏离 DSS 矩阵规则。
186+ 5 . jobtype 仅负责动态变量进入 props,供 decision 条件使用。
110187
111188## 7. 验证要点
112- 1 . 分支节点发布后是 ` type=decision ` 。
113- 2 . decision 属性展开正确。
114- 3 . 混合上游编号10场景验证为 ` skip ` 。
115- 4 . 与 DSS FlowExecution 语义逐条对齐通过。
189+ 1 . DSS 运行态能够正确解析多个 ` condition.N ` 。
190+ 2 . DSS 运行态能够在条件不成立时走 ` on.failure.N ` 。
191+ 3 . 分支节点发布后是 ` type=decision ` 。
192+ 4 . decision 属性展开正确。
193+ 5 . 混合上游编号10场景验证为 ` skip ` 。
194+ 6 . 与 DSS FlowExecution 语义逐条对齐通过。
116195
117196## 8. 非目标
118197- 不引入新的分支 DSL。
119198- 不新增分支数据库模型。
120- - 不改动分支节点前端配置入口。
199+ - 不改动分支节点前端配置入口。
0 commit comments