跳到主要内容

规则引擎

规则引擎支持可视化流程编排,通过拖拽节点配置数据处理流程,实现复杂的数据处理逻辑。规则引擎采用事件驱动模式,当节点输入数据变化时自动触发流程处理。

核心概念

数据流动机制

规则引擎采用事件驱动的数据流动机制:

  1. 输出触发传播:当节点的输出属性被设置(set)时,自动触发所有连接到该输出的下游节点
  2. 自动传播:数据变化会沿着节点连接链路自动传播,直到所有相关节点都完成处理
  3. 防抖优化:使用智能调度器防止高频触发,确保在快速变化时只执行最后一次

节点生命周期

每个节点实例都有完整的生命周期:

生命周期阶段方法说明
初始化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)

执行过程

  1. 初始化阶段

    • 创建所有节点实例
    • 调用每个节点的 InitAsync() 方法
  2. 首次执行

    • 温度输入节点执行 ChangedAsync(),输出值设为 25
    • 输出变化触发下游的"摄氏转华氏"节点
    • "摄氏转华氏"节点的输入参数接收 25
    • 执行 ChangedAsync(),计算结果 77
    • 输出变化触发"结果输出"节点
  3. 后续变化

    • 当温度输入变化为 30 时
    • 自动触发整个链路重新执行
    • 最终输出更新为 86

分支流程示例

一个输出可以连接多个下游节点,实现数据分发:

┌→ [报警判断] → [报警输出]
[温度传感器] → [温度处理] ┤
└→ [数据记录] → [数据库写入]

执行过程

  1. 温度传感器数据变化
  2. 触发温度处理节点
  3. 温度处理节点的输出变化同时触发两个下游节点:
    • 报警判断节点
    • 数据记录节点
  4. 两个分支并行执行,互不阻塞

合并流程示例

多个上游输出可以连接到同一个下游节点的不同输入参数:

[温度传感器] → [温度处理] ┐
├→ [综合判断] → [结果输出]
[湿度传感器] → [湿度处理] ┘

执行过程

  1. 温度或湿度任一变化都会触发"综合判断"节点
  2. "综合判断"节点同时接收两个输入参数
  3. 根据两个参数的综合情况进行判断

循环依赖示例

危险操作

以下示例展示循环依赖,实际使用中应避免此类设计!

[节点A] → [节点B] → [节点C]
↑ ↓
└───────────────────┘

系统保护机制

  1. 启动时检测:流程启动时自动检测到循环依赖
  2. 记录警告:在日志中记录"检测到循环依赖"
  3. 执行限制:单次传播链中每个节点最多执行100次后自动停止
  4. 错误日志:超过限制时记录错误并停止传播

执行过程示例

触发起始节点 → 节点A执行(1次) → 节点B执行(1次) → 节点C执行(1次)
→ 节点A执行(2次) → 节点B执行(2次) → 节点C执行(2次)
→ ... (循环继续)
→ 节点A执行(101次) → ❌ 超过限制,停止传播

正确做法:避免设计循环依赖的流程,使用条件节点或状态机替代。

流程管理

启用/禁用流程

  • 启用流程:流程启用后立即开始执行,节点进入运行状态
  • 禁用流程:停止流程执行,释放所有节点资源
注意

修改流程配置后,系统会自动重启该流程,所有节点将重新初始化。系统会:

  1. 停止当前流程执行
  2. 重新加载流程配置
  3. 重新检测循环依赖
  4. 重新初始化所有节点
  5. 重置执行计数器(每次触发链开始时自动重置)

流程日志

每个流程都有独立的日志文件,记录节点的执行情况和异常信息:

  • 日志路径:Logs/RuleEngine/{流程名称}.db
  • 日志级别:Info(生产环境)/ Trace(开发环境)
  • 支持日志查询和导出

日志内容包括

  • 流程启动/停止事件
  • 循环依赖检测结果
  • 节点执行次数超限警告
  • 节点执行异常信息
  • 数据传播路径追踪

相关链接