fix:流程设计
This commit is contained in:
99
flowable/流程产品设计.md
Normal file
99
flowable/流程产品设计.md
Normal file
@@ -0,0 +1,99 @@
|
||||
|
||||
|
||||
## 一、 产品功能矩阵
|
||||
|
||||
| 维度 | 功能点 | 业务描述 |
|
||||
| :--- | :--- | :--- |
|
||||
| **流程建模** | **拓扑解析与保存** | 解析执行节点、串/并行网关及连线拓扑;支持流程模板版本管理。 |
|
||||
| | **节点配置映射** | 支持节点级参数配置,包括执行模式(自动/手动)与调用模式(同步/异步)。 |
|
||||
| **数据管理** | **参数快照** | 保存算例启动时的输入参数与仿真参数,支持运行中动态更新。 |
|
||||
| | **文件 I/O 管控** | 自动初始化本地磁盘执行空间;支持基于规则的前序输出文件自动筛选。 |
|
||||
| **执行控制** | **多样化启动** | 支持“一键全量启动”与“指定任意节点启动”。 |
|
||||
| | **精细化状态机** | 流程与节点两级状态管控(待执行/执行中/暂停/完成/异常/取消)。 |
|
||||
| **异常恢复** | **双重重试机制** | 支持“当前节点原位重试”与“前置节点回退重试”。 |
|
||||
| | **人工干预** | 支持“强制放行/跳过”失败节点。 |
|
||||
|
||||
---
|
||||
|
||||
## 二、 核心数据库设计 (Database Schema)
|
||||
|
||||
### 1. 流程模板表 `simulation_flow_template`
|
||||
* **uuid**: 模板唯一标识(替代原 `processDefinitionId`)。
|
||||
* **viewContent**: 静态拓扑 JSON(节点、连线、网关)。
|
||||
* **approveFlowId**: 关联的审批流 ID。
|
||||
|
||||
### 2. 流程实例表 (算例表) `simulation_run`
|
||||
* **uuid**: 算例唯一标识(替代原 `processInstanceId`)。
|
||||
* **status**: 总状态(INIT, RUNNING, SUSPENDED, SUCCESS, ERROR, CANCELLED)。
|
||||
* **viewContent**: **实例运行快照**(启动时从模板拷贝,保证运行中不受模板修改影响)。
|
||||
* **progress**: `totalStep` / `currentStep` / `currentStepName`。
|
||||
* **paramJson**: 流程全局启动参数。
|
||||
|
||||
### 3. 流程节点实例表 `simulation_flow_node`
|
||||
* **runId / nodeId**: 联合主键。
|
||||
* **pre_node_ids / next_node_ids**: 存储入度与出度 ID 列表。
|
||||
* **status**: 节点状态(含 `WAITING_CALLBACK`, `WAITING_USER` 等中间态)。
|
||||
* **inputDirId / outPutDirId**: 物理 I/O 目录关联。
|
||||
* **paramJson**: 节点局部配置参数(含 `isAsync`, `executeMode`)。
|
||||
* **requestJson / resultJson**: 记录执行器入参及回调/执行结果。
|
||||
|
||||
---
|
||||
|
||||
## 三、 系统核心组件 (Core Components)
|
||||
|
||||
### 1. 解析与构建器 (Parser)
|
||||
* **职责**:解析 `viewContent` JSON。
|
||||
* **逻辑**:在算例实例化时,一次性计算每个节点的入度(依赖项)与出度(触发项),打平存储至 `simulation_flow_node`,后续流转不再解析 JSON。
|
||||
|
||||
### 2. 调度推进器 (Dispatcher)
|
||||
* **核心动作**:
|
||||
* **寻找下游**:节点 `SUCCESS` 后,获取其 `next_node_ids`。
|
||||
* **并行汇聚 (AND-Join)**:检查下游节点的所有 `pre_node_ids` 是否全部为 `SUCCESS`。
|
||||
* **并发控制**:采用 **Redisson 分布式锁 (锁粒度: runId + targetNodeId)** + **状态机 CAS (INIT -> RUNNING)**,防止并行分支冲突导致节点重复执行。
|
||||
|
||||
### 3. 执行器工厂 (Executor Factory)
|
||||
* **IProcessExecutor 接口**:定义 `execute`(执行)与 `cancel`(强杀)。
|
||||
* **算子实现**:
|
||||
* `HpcExecutor`:提交 HPC 任务,更新状态为 `WAITING_CALLBACK`。
|
||||
* `LocalAppExecutor`:拉起本地应用,支持同步或异步模式。
|
||||
|
||||
|
||||
### 4. 异步回调中心 (Callback Center)
|
||||
* **职责**:接收外部系统(HPC/本地应用)的结果回传。
|
||||
* **逻辑**:更新节点状态与 `resultJson` -> 判定 `SUCCESS` -> 唤醒 `Dispatcher.dispatchNext()`。
|
||||
|
||||
---
|
||||
|
||||
## 四、 关键业务逻辑流转
|
||||
|
||||
### 1. 执行模式管控 (Auto vs Manual)
|
||||
* **触发点**:`Dispatcher` 准备唤醒节点前。
|
||||
* **逻辑**:检查 `executeMode`,若为 `MANUAL` 则将状态设为 `WAITING_USER` 并停机;待用户调用 `/continueServiceTask` 后,再由 `ExecutorFactory` 真正拉起。
|
||||
|
||||
### 2. 调用模式管控 (Async vs Sync)
|
||||
* **触发点**:`Executor.execute()` 内部。
|
||||
* **逻辑**:
|
||||
* `isAsync: true` -> 记录异步任务,节点设为 `WAITING_CALLBACK`,释放线程。
|
||||
* `isAsync: false` -> 执行完逻辑后立即将状态设为 `SUCCESS`,手动触发 `Dispatcher`。
|
||||
|
||||
### 3. 异常管控与干预
|
||||
* **强制放行**:手动将 `ERROR` 节点改为 `SUCCESS`,由管理员触发 `Dispatcher` 继续向下。
|
||||
* **重试节点**:将 `ERROR` 改回 `INIT`,清理旧数据,由 `ExecutorFactory` 重新拉起。
|
||||
* **暂停/恢复**:修改 `simulation_run.status`;`Dispatcher` 每次调度前校验此状态。
|
||||
|
||||
---
|
||||
|
||||
## 五、 待完成与深度设计 (To-be-discussed)
|
||||
|
||||
### 1. 物理取消与防回调重新激活
|
||||
* **取消逻辑**:取消算例时,需递归调用所有运行中节点的 `Executor.cancel()`(如 HPC 作业)。
|
||||
* **防御机制**:回调中心增加状态校验,若节点状态已为 `CANCELLED`,则丢弃后续回传的 `SUCCESS` 信号。
|
||||
|
||||
### 2. 精细化状态机
|
||||
* 定义严格的状态跳转矩阵(例如:`SUCCESS` 节点禁止跳转回 `RUNNING`,除非经过重置)。
|
||||
|
||||
### 3. 级联回退重试 (Rewind/Retry)
|
||||
* **算法**:从选定节点开始,通过 `next_node_ids` **BFS(广度优先搜索)** 找到所有子图节点。
|
||||
* **清理**:物理强杀运行中节点 -> 逻辑重置所有子图节点为 `INIT` -> 清理磁盘目录 -> 重新启动。
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user