Files
udmin/docs/flow_architecture.md
ayou 75c6974a35 feat(flow): 新增分组执行与异步模式支持
refactor(executors): 将 Rhai 引擎评估逻辑迁移至 script_rhai 模块
docs: 添加 Flow 架构文档与示例 JSON
feat(i18n): 新增前端多语言支持
perf(axios): 优化 token 刷新与 401 处理逻辑
style: 统一代码格式化与简化条件判断
2025-12-03 20:51:22 +08:00

227 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 中跳转到具体实现进行深度阅读。