4、规则引擎架构:规则库、工作内存、议程、执行引擎四大组件详解

规则引擎的核心架构由四个紧密协作的组件构成:规则库(Rule Base)、工作内存(Working Memory)、议程(Agenda)和执行引擎(Execution Engine)。理解这四个组件的职责与交互方式,是掌握规则引擎运行机制的基础。

核心要点:规则引擎的推理过程本质上是“模式匹配 → 冲突消解 → 规则执行”的循环。规则库提供匹配模式,工作内存提供待匹配的事实,议程管理匹配结果的优先级排序,执行引擎负责实际触发规则动作。

4.1 四大组件概述

下表从职责、存储内容、生命周期三个维度对比了四大组件的核心差异:

组件 核心职责 存储内容 生命周期
规则库 存储和管理规则定义 条件(LHS)+ 动作(RHS) 静态(运行时一般不修改)
工作内存 存储当前推理上下文中的事实对象 业务数据实例(Fact) 动态(随推理过程增删改)
议程 管理已激活规则的执行优先级 激活组(Activation) 动态(每次匹配后重建)
执行引擎 驱动模式匹配、冲突消解和规则执行 推理控制状态 会话级(单次推理会话)

4.2 规则库(Rule Base)

规则库是规则引擎的“知识仓库”,它存储了所有已注册的业务规则。每条规则通常由两部分组成:

  • 条件部分(LHS — Left Hand Side):定义规则触发的模式或条件,通常使用布尔表达式、逻辑运算符和模式绑定。
  • 动作部分(RHS — Right Hand Side):定义条件满足时执行的操作,如修改事实、调用外部服务、产生新事实等。
实践建议:规则库应保持“只读”设计。运行时动态修改规则库会引入不可预测的推理行为,建议通过规则版本管理或规则集热加载机制实现规则更新,而非直接修改运行中的规则库。

以下是一个典型的规则定义示例(Drools 语法):

rule "高风险交易拦截"
    when
        $t : Transaction( amount > 10000, riskScore > 80 )
        $c : Customer( level == "普通" )
    then
        $t.setStatus("BLOCKED");
        alertService.sendAlert($t.getId(), "高风险交易");
end

4.3 工作内存(Working Memory)

工作内存是规则引擎的“运行时数据区”,它持有当前推理会话中所有的事实对象(Fact)。事实对象是规则条件匹配的基本单元,通常由业务数据对象(POJO)实例化而来。

工作内存支持以下核心操作:

  • 插入(Insert):将新事实加入工作内存,触发模式匹配。
  • 更新(Update):修改已有事实的属性值,重新触发匹配。
  • 删除(Retract):从工作内存中移除事实,撤销相关激活。
常见陷阱:工作内存中的事实对象应保持不可变或受控可变。频繁修改事实属性而不通知引擎(如直接调用 setter 后未调用 update)会导致规则匹配结果与预期不一致,产生“事实漂移”问题。

4.4 议程(Agenda)

议程是规则引擎的“调度中心”。当规则库中的规则条件与工作内存中的事实匹配成功时,引擎会创建一个激活(Activation),并将其放入议程。议程负责管理这些激活的执行顺序。

议程的排序策略(冲突消解策略)通常包括:

策略名称 排序依据 适用场景
优先级(Salience) 规则显式声明的优先级数值 业务规则有明确重要等级
最近优先(Recency) 激活创建的时间戳 实时事件处理,新事件优先
复杂度优先(Complexity) 规则条件的复杂程度 需要优先处理高约束规则
显式顺序(Explicit) 规则在规则库中的定义顺序 规则之间有明确的先后依赖

4.5 执行引擎(Execution Engine)

执行引擎是规则引擎的“大脑”,它协调其他三个组件完成完整的推理循环。典型的推理循环包括以下步骤:

  1. 模式匹配:执行引擎将工作内存中的事实与规则库中的条件进行匹配,通常使用 Rete 算法或 PHREAK 算法优化匹配效率。
  2. 激活生成:匹配成功的规则生成激活对象,并加入议程。
  3. 冲突消解:执行引擎根据议程的排序策略,从所有激活中选出一个最高优先级的激活。
  4. 规则执行:执行引擎触发选中激活的 RHS 动作,可能修改工作内存中的事实。
  5. 循环检测:如果工作内存发生变化,执行引擎重新进入模式匹配阶段,直到议程为空或达到终止条件。
规则引擎四大组件协作流程 规则库 条件 + 动作 工作内存 事实对象集合 议程 激活队列 执行引擎 推理循环控制 提供规则模式 提供事实数据 生成激活 返回最高优先级激活 事实变更反馈循环 说明:执行引擎从规则库获取模式、从工作内存获取事实,匹配后生成激活放入议程; 议程返回最高优先级激活给执行引擎执行,执行结果可能修改工作内存,触发新一轮匹配。

4.6 四大组件的协作关系

为了更清晰地展示组件之间的数据流向和依赖关系,下图以分层架构视角呈现了四大组件的交互:

四大组件分层协作架构 存储层 规则库(静态规则) 工作内存(动态事实) 调度层 议程(激活排序) 执行层 执行引擎(推理循环) 事实变更反馈 说明:存储层提供规则和事实 → 调度层管理激活优先级 → 执行层驱动推理循环; 执行结果通过反馈箭头影响工作内存,形成“匹配-执行-反馈”闭环。

4.7 组件交互的典型时序

以下是一个完整的规则推理时序,展示了四大组件在单次推理会话中的交互顺序:

步骤 触发组件 操作描述 涉及组件
1 外部调用方 插入事实对象到工作内存 工作内存
2 执行引擎 触发模式匹配,扫描规则库 规则库、工作内存
3 执行引擎 生成匹配成功的激活对象 议程
4 议程 按冲突消解策略排序激活 议程
5 议程 返回最高优先级激活 执行引擎
6 执行引擎 执行激活对应的规则动作 执行引擎
7 执行引擎 动作可能修改工作内存 工作内存
8 执行引擎 检测到事实变更,重复步骤2 全部组件
关键设计原则:
  • 规则库与工作内存分离:规则是静态知识,事实是动态数据,分离设计便于独立管理和优化。
  • 议程作为仲裁层:避免多条规则同时触发时的执行冲突,确保业务逻辑的确定性。
  • 执行引擎的循环控制:必须设置终止条件(如最大循环次数或议程为空),防止无限推理。