2. 在线推理架构设计
在线推理系统是风控规则引擎的核心执行层,负责在毫秒级时间内完成请求解析、规则匹配、决策计算与结果返回。本章从整体架构、请求处理流程、规则库与决策树存储三个维度,拆解一个生产级在线推理系统的设计要点。
2.1 在线推理系统整体架构
一个典型的在线推理系统采用分层架构,从上到下分为接入层、编排层、执行层与存储层。各层职责清晰,通过轻量级协议通信,支持水平扩展与灰度发布。
架构设计原则: 无状态执行、规则与引擎分离、决策可回放、延迟可控(P99 < 50ms)。
2.2 请求处理流程
一次完整的在线推理请求从进入系统到返回决策结果,经历以下核心步骤:
- 请求接入: 网关层完成身份鉴权、参数校验与限流,将原始请求转换为内部统一上下文对象。
- 策略路由: 编排层根据请求中的业务标识(如场景ID、产品线)匹配对应的规则集版本。
- 特征准备: 从请求参数、缓存、外部服务中获取决策所需的全部特征字段。
- 规则/决策树执行: 执行层加载规则库或决策树,按优先级或分支逻辑逐条/逐节点计算。
- 结果聚合: 合并多条规则/子树的输出,生成最终决策结果(通过/拒绝/人工审核)。
- 异步回写: 将决策日志、特征快照、命中规则写入存储层,用于离线分析。
性能优化提示: 特征准备阶段应优先使用本地缓存(如Caffeine),减少对远程服务的依赖;规则执行阶段采用短路模式,一旦命中拒绝规则立即终止后续计算。
2.3 规则库与决策树的存储设计
规则库与决策树的存储设计直接影响推理系统的加载速度、内存占用与更新效率。生产环境通常采用“冷热分离 + 内存索引”的存储策略。
2.3.1 规则库存储模型
| 存储维度 | 存储介质 | 数据结构 | 说明 |
|---|---|---|---|
| 规则元数据 | MySQL / 配置中心 | 关系表(规则ID、版本、优先级、状态) | 用于规则管理与灰度发布 |
| 规则条件 | MySQL / 配置中心 | JSON / YAML 结构化存储 | 支持条件组、逻辑运算符、值范围 |
| 运行时规则快照 | 本地内存 + Redis | HashMap <场景ID, 规则列表> | 预热加载,支持毫秒级查询 |
| 规则变更日志 | 消息队列 + 对象存储 | Append-Only 日志 | 用于审计与回放 |
2.3.2 决策树存储设计
决策树在存储层面需要同时保留树的结构信息与节点计算逻辑。常见方案是使用邻接表或嵌套集模型,配合内存指针数组实现快速遍历。
2.3.3 存储设计关键考量
- 版本管理: 规则库与决策树均需支持多版本共存,通过版本号实现灰度切换与快速回滚。
- 增量更新: 采用事件驱动机制,规则变更后仅推送差异部分到内存,避免全量重载。
- 序列化格式: 推荐使用 Protobuf 或 FlatBuffers 进行内存序列化,减少 GC 压力与反序列化开销。
- 冷热数据分离: 高频使用的规则集常驻内存,低频规则集存储在 Redis 或本地磁盘,按需加载。
避坑提醒: 决策树的深度不宜超过 20 层,否则在极端特征组合下可能导致栈溢出或超时;建议在编排层设置最大遍历深度限制,并在构建阶段进行静态校验。