feat(flow): 新增分组执行与异步模式支持
refactor(executors): 将 Rhai 引擎评估逻辑迁移至 script_rhai 模块 docs: 添加 Flow 架构文档与示例 JSON feat(i18n): 新增前端多语言支持 perf(axios): 优化 token 刷新与 401 处理逻辑 style: 统一代码格式化与简化条件判断
This commit is contained in:
227
docs/flow_architecture.md
Normal file
227
docs/flow_architecture.md
Normal file
@ -0,0 +1,227 @@
|
||||
# Flow 架构与执行图(udmin)
|
||||
|
||||
## 模块架构
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph flow
|
||||
dsl[flow/dsl]
|
||||
domain[flow/domain]
|
||||
context[flow/context]
|
||||
engine[flow/engine]
|
||||
task[flow/task]
|
||||
executors[flow/executors/*]
|
||||
mappers[flow/mappers]
|
||||
log_handler[flow/log_handler]
|
||||
end
|
||||
|
||||
subgraph services
|
||||
svc_flow[services/flow_service]
|
||||
svc_logs[services/flow_run_log_service]
|
||||
end
|
||||
|
||||
subgraph routes
|
||||
r_flows[routes/flows]
|
||||
r_run_logs[routes/flow_run_logs]
|
||||
end
|
||||
|
||||
subgraph middlewares
|
||||
mw_sse[middlewares/sse]
|
||||
mw_ws[middlewares/ws]
|
||||
mw_jwt[middlewares/jwt]
|
||||
mw_http[middlewares/http_client]
|
||||
end
|
||||
|
||||
subgraph infra
|
||||
db[db]
|
||||
redis[redis]
|
||||
models_flow[models/flow]
|
||||
models_run[models/flow_run_log]
|
||||
end
|
||||
|
||||
r_flows --> svc_flow
|
||||
r_run_logs --> svc_logs
|
||||
svc_flow --> dsl
|
||||
svc_flow --> mappers
|
||||
dsl --> domain
|
||||
mappers --> context
|
||||
svc_flow --> engine
|
||||
engine --> task
|
||||
task --> executors
|
||||
executors --> mw_http
|
||||
engine --> log_handler
|
||||
log_handler --> svc_logs
|
||||
mw_sse -.events.-> r_flows
|
||||
mw_ws -.events.-> r_flows
|
||||
svc_flow --> models_flow
|
||||
svc_logs --> models_run
|
||||
models_flow --> db
|
||||
models_run --> db
|
||||
mw_jwt --> r_flows
|
||||
redis -.token check.-> mw_jwt
|
||||
```
|
||||
|
||||
引用:
|
||||
- DSL/Design 构建 `backend/src/flow/dsl.rs:60-93,138-170,172-203,246-303`
|
||||
- 领域模型 `backend/src/flow/domain.rs:20-28,31-36,39-47,60-68`
|
||||
- 上下文与事件 `backend/src/flow/context.rs:29-45`
|
||||
- 引擎驱动 `backend/src/flow/engine.rs:117-209,213-577`
|
||||
- 编排服务 `backend/src/services/flow_service.rs:285-305,342-349,351-365,366-399`
|
||||
- 路由入口 `backend/src/routes/flows.rs:26-35,101-133`
|
||||
- 运行日志服务 `backend/src/services/flow_run_log_service.rs:46-63,74-131`
|
||||
|
||||
## 请求/运行编排时序
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant C as Client
|
||||
participant R as routes.flows
|
||||
participant S as services.flow_service
|
||||
participant D as flow.dsl & mappers
|
||||
participant E as FlowEngine
|
||||
participant L as flow.log_handler
|
||||
participant M as models(flow/flow_run_log)
|
||||
participant SSE as middlewares.sse/ws
|
||||
|
||||
C->>R: POST /flows/{id}/run
|
||||
R->>S: run(id, input)
|
||||
S->>M: get flow doc
|
||||
alt design_json
|
||||
S->>D: chain_from_design_json(design)
|
||||
D-->>S: ChainDef
|
||||
S->>D: ctx_from_design_json(design)
|
||||
D-->>S: ctx supplement
|
||||
else YAML
|
||||
S->>D: parse FlowDSL (YAML)
|
||||
D-->>S: ChainDef
|
||||
end
|
||||
S->>E: drive(chain, ctx, opts)
|
||||
E-->>S: (ctx, logs)
|
||||
S->>L: log_success/log_error
|
||||
L->>M: insert flow_run_log
|
||||
E-->>SSE: emit node/done/error (stream)
|
||||
S-->>R: RunResult(ok, ctx, logs)
|
||||
R-->>C: ApiResponse
|
||||
```
|
||||
|
||||
关键实现:
|
||||
- 解析与补充 `backend/src/services/flow_service.rs:285-305`
|
||||
- 引擎驱动 `backend/src/services/flow_service.rs:342-349`
|
||||
- 日志入库与事件推送 `backend/src/flow/log_handler.rs`
|
||||
|
||||
## 引擎执行图(含执行模式)
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[选择起点: Start/入度=0/首节点] --> B{合流屏障}
|
||||
B -- 未达成/去重 --> Z[跳过当前节点]
|
||||
B -- 达成 --> C{任务?}
|
||||
C -- 否 --> D[选择后继]
|
||||
C -- 是 --> E{执行模式}
|
||||
E -- Sync --> ES[同步执行任务; 写回 ctx]
|
||||
E -- Async(Fire&Forget) --> EA[异步执行; 追踪句柄]
|
||||
E -- Queued(组队列) --> EQ[组信号量=1; 获取后执行]
|
||||
E -- Bounded(限并发) --> EB[组信号量=n; 获取后执行]
|
||||
ES --> D
|
||||
EA --> D
|
||||
EQ --> D
|
||||
EB --> D
|
||||
D -->|条件节点| F{条件评估 JSON/Rhai}
|
||||
F -- 通过 --> G[进入后继]
|
||||
F -- 不通过/无匹配 --> H[挑选无条件后继或停止]
|
||||
D -->|非条件| G
|
||||
G --> I{是否 End}
|
||||
I -- 是 --> J[FlowEnd 等待组策略; 推送事件; 结束]
|
||||
I -- 否 --> K{多分支?}
|
||||
K -- 单分支 --> L[计算组离开; BranchExit 等待]
|
||||
K -- 多分支 --> M[并行驱动其他分支]
|
||||
L --> A
|
||||
M --> L --> A
|
||||
```
|
||||
|
||||
参考:
|
||||
- 模式枚举与选项 `backend/src/flow/context.rs:9-15,29-45`
|
||||
- 合流与分支 `backend/src/flow/engine.rs:245-268,502-574`
|
||||
- 组等待策略 `backend/src/flow/engine.rs:62-115,559-573`
|
||||
|
||||
## DSL/Design 转换
|
||||
```mermaid
|
||||
flowchart LR
|
||||
X0[Design JSON 输入] --> X1[校验: 唯一ID/Start&End/合法边]
|
||||
X1 --> X2[兼容 sourcePortID → source_port_id]
|
||||
X2 --> X3[推断节点 kind/name/task]
|
||||
X3 --> X4[解析组: members/parentID/awaitPolicy]
|
||||
X4 --> X5[组装条件: AND组/端口匹配/启发式]
|
||||
X5 --> X6["生成 ChainDef: nodes links groups"]
|
||||
X0 --> Y1[mappers: 节点配置提取]
|
||||
Y1 --> Y2[ctx.nodes.<id>.<executor>]
|
||||
```
|
||||
|
||||
实现位置:`backend/src/flow/dsl.rs:138-170,172-203,246-303` 与 `backend/src/flow/mappers.rs:27-95`
|
||||
|
||||
## 数据模型(ER)
|
||||
```mermaid
|
||||
erDiagram
|
||||
FLOWS {
|
||||
bigint id PK
|
||||
varchar name
|
||||
text yaml
|
||||
text design_json
|
||||
varchar code
|
||||
varchar remark
|
||||
timestamp created_at
|
||||
timestamp updated_at
|
||||
}
|
||||
FLOW_RUN_LOGS {
|
||||
bigint id PK
|
||||
bigint flow_id FK
|
||||
varchar flow_code
|
||||
text input
|
||||
text output
|
||||
bool ok
|
||||
text logs
|
||||
bigint user_id
|
||||
varchar username
|
||||
timestamp started_at
|
||||
bigint duration_ms
|
||||
timestamp created_at
|
||||
}
|
||||
FLOWS ||--o{ FLOW_RUN_LOGS : has
|
||||
```
|
||||
|
||||
## 事件与日志通道
|
||||
```mermaid
|
||||
graph LR
|
||||
engine_push[engine.push_and_emit] --> sse_emit[middlewares.sse.emit_*]
|
||||
engine_push --> ws_emit[middlewares.ws.forward]
|
||||
sse_emit --> client[前端]
|
||||
ws_emit --> client
|
||||
engine_push --> log_handler_db[DatabaseLogHandler]
|
||||
engine_push --> log_handler_sse[SseLogHandler]
|
||||
log_handler_db --> run_log_service
|
||||
log_handler_sse --> run_log_service
|
||||
run_log_service --> db
|
||||
```
|
||||
|
||||
## 执行器生态
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph executors
|
||||
http
|
||||
db
|
||||
variable
|
||||
script_rhai
|
||||
script_js
|
||||
script_python
|
||||
condition
|
||||
end
|
||||
ctx_nodes[ctx.nodes.<id>.*] --> executors
|
||||
ctx_global[ctx.* 顶层] --> executors
|
||||
http --> http_out[(http_response)]
|
||||
db --> db_out[(db_response)]
|
||||
variable --> var_out[(ctx键值写回)]
|
||||
condition --> route[分支选择]
|
||||
```
|
||||
|
||||
注意点:写回策略与幂等,参考 `backend/src/flow/engine.rs:294-375`
|
||||
|
||||
---
|
||||
|
||||
以上图示与说明用于快速理解 Flow 的完整链路:从 DSL/Design 解析到引擎驱动与事件/日志通道,再到数据持久化与执行器生态。结合上文的代码引用,可在 IDE 中跳转到具体实现进行深度阅读。
|
||||
Reference in New Issue
Block a user