2. 在线推理架构设计

在线推理系统是风控规则引擎的核心执行层,负责在毫秒级时间内完成请求解析、规则匹配、决策计算与结果返回。本章从整体架构、请求处理流程、规则库与决策树存储三个维度,拆解一个生产级在线推理系统的设计要点。

2.1 在线推理系统整体架构

一个典型的在线推理系统采用分层架构,从上到下分为接入层、编排层、执行层与存储层。各层职责清晰,通过轻量级协议通信,支持水平扩展与灰度发布。

架构设计原则: 无状态执行、规则与引擎分离、决策可回放、延迟可控(P99 < 50ms)。
在线推理系统整体架构分层 接入层 HTTP/Thrift 网关 · 鉴权 · 限流 · 参数校验 · 协议转换 编排层 策略路由 · 规则集选择 · 决策树调度 · 上下文管理 执行层 规则引擎 · 决策树遍历 · 函数计算 · 评分卡 · 模型调用 存储层 规则库 · 决策树元数据 · 特征缓存 · 结果日志 · 配置中心 关键设计要点 • 接入层与编排层之间通过异步事件总线解耦,避免同步阻塞 • 执行层内置超时熔断与降级策略,保障极端流量下的系统稳定性

2.2 请求处理流程

一次完整的在线推理请求从进入系统到返回决策结果,经历以下核心步骤:

  1. 请求接入: 网关层完成身份鉴权、参数校验与限流,将原始请求转换为内部统一上下文对象。
  2. 策略路由: 编排层根据请求中的业务标识(如场景ID、产品线)匹配对应的规则集版本。
  3. 特征准备: 从请求参数、缓存、外部服务中获取决策所需的全部特征字段。
  4. 规则/决策树执行: 执行层加载规则库或决策树,按优先级或分支逻辑逐条/逐节点计算。
  5. 结果聚合: 合并多条规则/子树的输出,生成最终决策结果(通过/拒绝/人工审核)。
  6. 异步回写: 将决策日志、特征快照、命中规则写入存储层,用于离线分析。
性能优化提示: 特征准备阶段应优先使用本地缓存(如Caffeine),减少对远程服务的依赖;规则执行阶段采用短路模式,一旦命中拒绝规则立即终止后续计算。

2.3 规则库与决策树的存储设计

规则库与决策树的存储设计直接影响推理系统的加载速度、内存占用与更新效率。生产环境通常采用“冷热分离 + 内存索引”的存储策略。

2.3.1 规则库存储模型

存储维度 存储介质 数据结构 说明
规则元数据 MySQL / 配置中心 关系表(规则ID、版本、优先级、状态) 用于规则管理与灰度发布
规则条件 MySQL / 配置中心 JSON / YAML 结构化存储 支持条件组、逻辑运算符、值范围
运行时规则快照 本地内存 + Redis HashMap <场景ID, 规则列表> 预热加载,支持毫秒级查询
规则变更日志 消息队列 + 对象存储 Append-Only 日志 用于审计与回放

2.3.2 决策树存储设计

决策树在存储层面需要同时保留树的结构信息与节点计算逻辑。常见方案是使用邻接表或嵌套集模型,配合内存指针数组实现快速遍历。

决策树存储结构示意(邻接表 + 内存指针) 根节点 (ID:1) 内部节点 (ID:2) 内部节点 (ID:3) 叶子 (ID:4) 通过 叶子 (ID:5) 拒绝 叶子 (ID:6) 通过 叶子 (ID:7) 人工 存储表结构示例(邻接表) node_id | parent_id | condition_expr | pass_child_id | fail_child_id | result_action 内存加载后转换为指针数组,遍历时间复杂度 O(log n)

2.3.3 存储设计关键考量

  • 版本管理: 规则库与决策树均需支持多版本共存,通过版本号实现灰度切换与快速回滚。
  • 增量更新: 采用事件驱动机制,规则变更后仅推送差异部分到内存,避免全量重载。
  • 序列化格式: 推荐使用 Protobuf 或 FlatBuffers 进行内存序列化,减少 GC 压力与反序列化开销。
  • 冷热数据分离: 高频使用的规则集常驻内存,低频规则集存储在 Redis 或本地磁盘,按需加载。
避坑提醒: 决策树的深度不宜超过 20 层,否则在极端特征组合下可能导致栈溢出或超时;建议在编排层设置最大遍历深度限制,并在构建阶段进行静态校验。