4. 规则引擎架构:核心模块、执行流程与性能考量

规则引擎是 Policy Check 自定义规则的“大脑”。它将人类可读的策略声明转化为可执行的判定逻辑,并最终输出合规报告。理解其内部架构,是编写高性能、可维护自定义规则的前提。本章深入解析规则引擎的三大核心模块——解析器、评估器、报告器,梳理一条规则从文本到报告的完整执行流程,并给出生产环境下的关键性能考量。

4.1 核心模块:三组件架构

规则引擎采用经典的“解析-评估-报告”三阶段管道架构。每个模块职责单一、接口清晰,便于独立扩展与测试。

模块 英文名称 核心职责 输入 输出
解析器 Parser 将规则源码(YAML/JSON/Rego)转换为抽象语法树(AST)或中间表示(IR) 规则文本 + Schema 定义 结构化 AST / IR
评估器 Evaluator 遍历 AST/IR,结合上下文数据执行判定逻辑,输出布尔结果与详细原因 AST/IR + 资源数据 + 上下文 判定结果(Pass/Fail/Error)
报告器 Reporter 将评估结果格式化为结构化报告,支持多种输出格式(JSON/CSV/表格) 判定结果 + 元数据 合规报告
架构原则: 三模块之间通过不可变数据结构通信(AST、判定结果对象),避免共享可变状态。这使得每个模块可以独立进行单元测试、性能优化甚至替换实现语言。

4.2 解析器(Parser):从文本到结构

解析器是规则引擎的入口。它负责将用户编写的规则定义(如 Rego 策略、自定义 YAML DSL)转换为引擎内部可遍历的树形结构。

  • 词法分析(Lexer): 将原始字符流拆分为有意义的 序列(关键字、标识符、运算符、字面量)。
  • 语法分析(Parser): 根据预定义的文法规则,将 序列组合为抽象语法树(AST)。AST 保留了规则的逻辑层次与操作符优先级。
  • 语义分析(Semantic Check): 验证 AST 中的变量引用、类型匹配、函数调用是否合法。例如,检查引用的服务目录属性是否存在。
  • 中间表示生成(IR Generation): 将 AST 转换为更接近执行引擎的中间表示(如 DAG 或指令列表),便于后续高效评估。
性能关键点: 解析阶段通常只执行一次(规则加载时),因此对速度要求不如评估器苛刻。但解析器必须提供清晰的错误信息(行号、列号、预期 ),帮助开发者快速定位语法错误。

4.3 评估器(Evaluator):核心判定引擎

评估器是规则引擎的性能核心。它接收解析器产出的 IR 和运行时数据,执行实际的策略判定。

  • 数据绑定: 将服务目录中的资源属性、上下文变量注入评估环境。
  • 条件求值: 遍历 IR 节点,执行比较、逻辑运算(AND/OR/NOT)、集合操作(in/not in)、正则匹配等。
  • 短路优化: 对于 AND 链,一旦遇到 False 立即停止后续条件求值;对于 OR 链,遇到 True 立即返回。大幅减少不必要的计算。
  • 缓存策略: 对同一资源多次引用的子查询结果进行缓存,避免重复计算。
  • 错误处理: 当数据缺失、类型不匹配或函数执行异常时,评估器应返回 Error 状态而非崩溃,并附带错误原因。
避坑指南: 避免在规则中使用高复杂度循环(如嵌套迭代所有子网)。评估器应设置最大执行步数或超时时间(如 5 秒),防止恶意或错误规则导致引擎挂起。

4.4 报告器(Reporter):输出合规结论

报告器将评估结果转化为可消费的格式。它不改变判定逻辑,只负责呈现。

输出格式 适用场景 包含字段
JSON API 集成、CI/CD 管道解析 rule_id, resource_id, status, message, severity, timestamp
CSV 批量导出、Excel 分析 同上,以逗号分隔
表格(终端/Web) 人工审查、即时反馈 带颜色高亮的 Pass/Fail/Error 状态列
SARIF 集成到 GitHub/Security 工具 标准静态分析结果交换格式

4.5 执行流程:一条规则的完整生命周期

下图展示了从规则加载到报告输出的完整执行流程,包含三个核心模块的协作关系。

规则引擎执行流程 规则引擎执行流程(解析 → 评估 → 报告) 1. 解析器 (Parser) 词法分析 语法分析 语义检查 IR 生成 AST/IR 2. 评估器 (Evaluator) 数据绑定 条件求值 短路优化 缓存策略 判定结果 3. 报告器 JSON / CSV 表格 / SARIF 规则定义 (YAML/Rego) 资源数据 (服务目录) 合规报告

4.6 性能考量:生产环境的关键指标

规则引擎的性能直接影响 CI/CD 管道的反馈速度。以下是需要重点关注的维度:

维度 关键指标 优化策略
规则加载时间 解析 + 编译耗时(ms) 预编译规则为二进制 IR;使用增量加载而非全量重载
单规则评估延迟 P50 / P99 耗时(μs/ms) 启用短路求值;避免正则回溯;限制集合遍历深度
并发评估吞吐 规则数/秒 使用无锁数据结构;评估器无状态化,支持水平扩展
内存占用 AST/IR 大小 + 缓存大小(MB) 共享常量池;设置 LRU 缓存上限;及时释放中间结果
错误恢复 单规则崩溃是否影响全局 每个规则在独立沙箱中评估;捕获 panic 并转为 Error 状态
生产建议: 在规则开发阶段,使用 --benchmark 标志对自定义规则进行性能分析。重点关注评估器中的循环次数和函数调用深度。对于超过 100ms 的规则,应主动优化或拆分。

4.7 架构图:模块间数据流与依赖关系

以下架构图从更高维度展示了规则引擎在服务目录集成中的位置,以及各模块之间的数据流方向。

规则引擎架构与数据流 规则引擎架构与数据流 服务目录 资源 Schema + 实例 规则仓库 YAML / Rego 文件 规则引擎核心 解析器 评估器 报告器 缓存层 资源数据 规则定义 合规报告 Pass / Fail / Error
架构要点: 缓存层位于评估器与报告器之间,对重复的资源属性查询(如“所有 VPC 的 CIDR 列表”)进行缓存,避免每次评估都重新遍历服务目录。缓存失效策略建议使用基于资源版本号的主动失效。