2. 在线推理链路概述

在线推理链路是规则引擎在毫秒级响应约束下,完成从规则加载到动作执行的完整数据流。与离线批量推理不同,在线链路必须同时满足低延迟与高吞吐两个核心约束,任何环节的阻塞都会直接导致服务超时或雪崩。

2.1 链路基本组成

一条标准的在线推理链路由三个串行阶段构成:规则加载 → 条件匹配 → 动作执行。每个阶段内部又包含若干子步骤,如下图所示。

核心原则:规则加载是“一次加载、多次匹配”;条件匹配是“快速剪枝、精确命中”;动作执行是“幂等、可观测、可回滚”。
在线推理链路三阶段流程 阶段一:规则加载 规则源拉取 语法校验 & 编译 RETE / 决策树构建 内存索引建立 版本热加载 (毫秒级完成) 阶段二:条件匹配 事实对象注入 Alpha 节点过滤 Beta 节点 Join 冲突集生成 优先级排序 (微秒~毫秒级) 阶段三:动作执行 动作队列调度 RHS 表达式求值 副作用操作 结果聚合 & 返回 日志 & 监控埋点 (毫秒级完成) ⚠ 规则加载通常由后台线程异步完成,不阻塞在线请求;条件匹配与动作执行处于请求主路径。

2.2 规则加载(Rule Loading)

规则加载是链路的第一道关卡,负责将规则定义从持久化存储(数据库、文件、配置中心)拉取到内存中,并转换为引擎可执行的内部结构。该阶段通常由独立的后台线程或定时任务触发,不占用在线请求的 CPU 时间片。

子步骤 说明 典型耗时
规则源拉取 从 DB / Git / Apollo 等源获取原始规则文本或 DSL 10~200 ms
语法校验 & 编译 解析 DSL 为 AST,校验类型与引用合法性 5~50 ms / 条
RETE / 决策树构建 将规则条件编译为匹配网络或决策树结构 20~500 ms
内存索引建立 为常用字段建立哈希索引,加速后续匹配 5~30 ms
版本热加载 原子切换规则版本,避免加载中请求读到不一致状态 < 1 ms(指针切换)
优化要点:规则加载阶段最容易出现“全量加载阻塞”问题。建议采用增量加载 + 版本快照策略,每次只加载变更规则,并通过 Copy-on-Write 机制保证线上请求无感。

2.3 条件匹配(Condition Matching)

条件匹配是在线推理链路的核心计算瓶颈。引擎接收一个或多个事实对象(Fact),在已加载的规则集中找出所有满足条件的规则,并按优先级排序生成冲突集(Conflict Set)。

现代规则引擎普遍采用 RETE 算法或其变体(RETE-OO、RETE-NT)来优化匹配效率。RETE 网络将规则条件拆解为 Alpha 节点(单条件过滤)和 Beta 节点(多条件 Join),通过状态共享避免重复计算。

RETE 匹配网络核心节点示意 Root 节点 Alpha: age > 18 Alpha: status=1 Alpha: score > 80 Alpha: city=SH Beta Join (age & status) Beta Join (score & city) 终端节点 → 冲突集
常见陷阱:当规则数量超过 10,000 条时,RETE 网络的 Beta 节点 Join 操作可能产生指数级中间结果。必须引入节点共享和约束传播优化,否则匹配延迟会从微秒级飙升到百毫秒级。

2.4 动作执行(Action Execution)

动作执行阶段负责执行匹配成功的规则右部(RHS)逻辑。动作可以是简单的赋值、调用外部服务、发送消息、更新数据库等。由于动作可能产生副作用,该阶段必须保证幂等性和可观测性。

  • 动作队列调度:将冲突集中的规则按优先级依次放入执行队列,支持并行或串行模式。
  • RHS 表达式求值:执行规则右部的赋值、计算、函数调用等逻辑。
  • 副作用操作:调用外部系统(如发短信、扣库存),必须支持重试和熔断。
  • 结果聚合 & 返回:将多个规则执行结果合并为统一响应结构返回给调用方。
  • 日志 & 监控埋点:记录每条规则的命中次数、执行耗时、异常信息,用于后续分析和告警。

2.5 延迟与吞吐量关键指标

在线推理链路的性能评估必须同时关注延迟和吞吐量两个维度,二者通常存在 trade-off 关系。

指标 定义 典型目标值 测量方式
P50 延迟 50% 请求的端到端推理耗时 < 5 ms 服务端埋点 + 百分位统计
P99 延迟 99% 请求的端到端推理耗时 < 20 ms 服务端埋点 + 百分位统计
QPS(吞吐量) 每秒处理的推理请求数 > 10,000 / 单机 压测工具 + 计数器
规则匹配耗时 条件匹配阶段消耗的 CPU 时间 < 2 ms RETE 节点埋点
规则加载耗时 单次全量规则加载的完成时间 < 1 s 后台任务日志
内存占用 规则网络 + 事实缓存占用的堆内存 < 512 MB JVM / 进程监控
延迟与吞吐量的平衡策略:
• 当 QPS 要求高时,可适当增加规则加载的批次大小,减少加载频率,但会略微增加 P99 延迟。
• 当 P99 延迟要求苛刻时,应优先优化 RETE 网络的节点共享率,减少 Beta Join 的中间结果数量。
• 建议设置超时熔断:单次推理超过 50 ms 时直接降级返回默认结果,防止链路雪崩。

2.6 链路整体延迟拆解

一个典型的在线推理请求,其端到端延迟可以拆解为以下组成部分。理解每个环节的耗时占比,是后续优化工作的前提。

端到端延迟 = 网络传输耗时 + 规则加载耗时(异步) + 条件匹配耗时 + 动作执行耗时 + 序列化耗时

典型占比(P50 场景):
- 网络传输:0.5~1 ms(同机房内网)
- 规则加载:0 ms(异步,不阻塞)
- 条件匹配:1~3 ms(RETE 网络匹配)
- 动作执行:0.5~2 ms(RHS 求值 + 副作用)
- 序列化:0.2~0.5 ms(JSON/Protobuf)

合计:2.2~6.5 ms(满足 < 10 ms 的 SLA 要求)