规则引擎
规则引擎支持可视化流程编排,通过拖拽节点配置数据处理流程,实现复杂的数据处理逻辑。规则引擎采用事件驱动模式,当节点输入数据变化时自动触发流程处理。
核心概念
数据流动机制
规则引擎采用事件驱动的数据流动机制:
- 输出触发传播:当节点的输出属性被设置(set)时,自动触发所有连接到该输出的下游节点
- 自动传播:数据变化会沿着节点连接链路自动传播,直到所有相关节点都完成处理
- 防抖优化:使用智能调度器防止高频触发,确保在快速变化时只执行最后一次
节点生命周期
每个节点实例都有完整的生命周期:
| 生命周期阶段 | 方法 | 说明 |
|---|---|---|
| 初始化 | InitAsync() | 节点创建时调用一次,用于初始化内部状态 |
| 执行 | ChangedAsync() | 输入参数变化时触发,执行节点的业务逻辑 |
| 输出回调 | OutputChangedCallback | 输出属性被设置时触发,通知下游节点 |
执行流程

安全机制
规则引擎内置多重安全保护:
1. 循环依赖检测
在流程启动时自动检测节点连接是否存在循环:
- 使用深度优先搜索(DFS)算法检测图中的环
- 发现循环依赖时记录警告日志
- 防止流程设计错误导致无限循环
2. 执行次数限制
每个节点有最大执行次数限制(默认100次):
- 针对单次传播链:每次从起始节点触发时重置计数器
- 防止意外循环:单次传播链中超过100次自动停止
- 不影响正常使用:不同时间点的多次触发不会累计
- 超过限制时自动停止传播并记录错误
- 可通过
FlowExecutionContext.MaxExecutionCount调整限制
示例说明:
时间线:
T1: 温度传感器触发 → [温度处理]执行1次 → 计数器=1
T2: 温度传感器触发 → [温度处理]执行1次 → 计数器=1(重置后)
T3: 温度传感器触发 → [温度处理]执行1次 → 计数器=1(重置后)
循环依赖场景:
单次触发: [节点A]→[节点B]→[节点C]→[节点A]→[节点B]→...
执行1次 执行2次 执行3次 执行4次 执行5次...
当某个节点执行超过100次时停止
3. 防抖机制
使用智能调度器防止高频触发:
- 短时间内多次触发只执行最后一次
- 避免数据快速变化导致的重复计算
- 提高系统性能和稳定性
功能入口
点击左侧菜单"规则引擎"进入管理页面。

流程列表
| 列 | 说明 |
|---|---|
| 流程名称 | 规则流程的标识名称 |
| 描述 | 流程描述信息 |
| 版本 | 流程版本号 |
| 状态 | 启用/禁用状态 |
操作功能
| 功能 | 说明 |
|---|---|
| 新建流程 | 创建新的规则流程 |
| 详情 | 打开流程编辑器 |
| 启用/禁用 | 切换流程启用状态 |
| 删除 | 删除流程 |
| 刷新 | 刷新流程列表 |
流程编辑器
点击"详情"按钮进入流程编辑器:

工具栏功能
| 功能 | 说明 |
|---|---|
| 流程名称 | 编辑流程名称 |
| 流程描述 | 编辑流程描述 |
| 导出 | 导出流程配置为JSON文件 |
| 导入 | 从JSON文件导入流程配置 |
| 自动布局 | 自动排列流程节点 |
| 删除选中 | 删除选中的节点 |
| 保存 | 保存当前流程配置 |
编辑器布局
| 区域 | 说明 |
|---|---|
| 左侧 | 节点面板,显示可用的节点类型 |
| 中间 | 画布区域,拖拽节点进行流程编排 |
| 右侧 | 属性面板,配置选中节点的参数 |
左侧节点面板
| 功能 | 说明 |
|---|---|
| 节点搜索 | 按名称搜索节点 |
| 分类筛选 | 按分类筛选节点 |
| 分组折叠 | 节点按分类分组,可折叠展开 |
中间画布区域
| 功能 | 说明 |
|---|---|
| 拖拽节点 | 从左侧面板拖拽节点到画布 |
| 连接节点 | 拖拽节点端口连接到另一个节点 |
| 删除节点 | 选中节点后按 Delete 键删除 |
| 小地图 | 右下角显示画布缩略图,便于导航 |
| 节点悬浮提示 | 悬浮显示节点实时参数值(流程启用后) |

右侧属性面板
| 功能 | 说明 |
|---|---|
| 节点名称 | 编辑节点显示名称 |
| 节点类型 | 显示节点类型(只读) |
| 实时参数值 | 启用流程后显示节点实时参数值 |
| 输入参数 | 配置节点输入参数初始值 |
| 输出参数 | 显示节点输出参数 |
| 输入输出参数 | 配置输入输出参数 |
节点类型
| 类型 | 说明 |
|---|---|
| 输入节点 | 数据输入源 |
| 处理节点 | 数据处理逻辑 |
| 输出节点 | 数据输出目标 |
| 自定义节点 | 用户自定义的处理节点 |
节点参数类型
每个节点可以定义三种类型的参数:
| 参数类型 | 标记 | 说明 | 数据流向 |
|---|---|---|---|
| 输入参数 | [ExpressionInput] | 节点的输入数据 | 从上游节点接收或配置初始值 |
| 输出参数 | [ExpressionOutput] | 节点的输出数据 | 变化时自动触发下游节点 |
| 输入输出参数 | [ExpressionInOut] | 既可输入也可输出 | 可接收上游数据,变化时也会触发下游 |
参数特性
- 输入参数:只能从上游节点接收数据,不会触发下游节点
- 输出参数:只能输出数据,变化时会自动触发所有连接的下游节点
- 输入输出参数:兼具输入和输出特性,适合需要在处理过程中修改的参数
数据传播示例
简单流程示例
以下是一个简单的温度单位转换流程:
[温度输入] → [摄氏转华氏] → [结果输出]
(25°C) (公式计算) (77°F)
执行过程:
-
初始化阶段:
- 创建所有节点实例
- 调用每个节点的
InitAsync()方法
-
首次执行:
- 温度输入节点执行
ChangedAsync(),输出值设为 25 - 输出变化触发下游的"摄氏转华氏"节点
- "摄氏转华氏"节点的输入参数接收 25
- 执行
ChangedAsync(),计算结果 77 - 输出变化触发"结果输出"节点
- 温度输入节点执行
-
后续变化:
- 当温度输入变化为 30 时
- 自动触发整个链路重新执行
- 最终输出更新为 86
分支流程示例
一个输出可以连接多个下游节点,实现数据分发:
┌→ [报警判断] → [报警输出]
[温度传感器] → [温度处理] ┤
└→ [数据记录] → [数据库写入]
执行过程:
- 温度传感器数据变化
- 触发温度处理节点
- 温度处理节点的输出变化同时触发两个下游节点:
- 报警判断节点
- 数据记录节点
- 两个分支并行执行,互不阻塞
合并流程示例
多个上游输出可以连接到同一个下游节点的不同输入参数:
[温度传感器] → [温度处理] ┐
├→ [综合判断] → [结果输出]
[湿度传感器] → [湿度处理] ┘
执行过程:
- 温度或湿度任一变化都会触发"综合判断"节点
- "综合判断"节点同时接收两个输入参数
- 根据两个参数的综合情况进行判断
循环依赖示例
危险操作
以下示例展示循环依赖,实际使用中应避免此类设计!
[节点A] → [节点B] → [节点C]
↑ ↓
└───────────────────┘
系统保护机制:
- 启动时检测:流程启动时自动检测到循环依赖
- 记录警告:在日志中记录"检测到循环依赖"
- 执行限制:单次传播链中每个节点最多执行100次后自动停止
- 错误日志:超过限制时记录错误并停止传播
执行过程示例:
触发起始节点 → 节点A执行(1次) → 节点B执行(1次) → 节点C执行(1次)
→ 节点A执行(2次) → 节点B执行(2次) → 节点C执行(2次)
→ ... (循环继续)
→ 节点A执行(101次) → ❌ 超过限制,停止传播
正确做法:避免设计循环依赖的流程,使用条件节点或状态机替代。
流程管理
启用/禁用流程
- 启用流程:流程启用后立即开始执行,节点进入运行状态
- 禁用流程:停止流程执行,释放所有节点资源
注意
修改流程配置后,系统会自动重启该流程,所有节点将重新初始化。系统会:
- 停止当前流程执行
- 重新加载流程配置
- 重新检测循环依赖
- 重新初始化所有节点
- 重置执行计数器(每次触发链开始时自动重置)
流程日志
每个流程都有独立的日志文件,记录节点的执行情况和异常信息:
- 日志路径:
Logs/RuleEngine/{流程名称}.db - 日志级别:Info(生产环境)/ Trace(开发环境)
- 支持日志查询和导出
日志内容包括:
- 流程启动/停止事件
- 循环依赖检测结果
- 节点执行次数超限警告
- 节点执行异常信息
- 数据传播路径追踪