2. 规则引擎架构设计:整体架构分层与模块职责

低延迟风控规则引擎的架构设计核心在于分层隔离与数据流解耦。每一层只关注单一职责,通过轻量级协议通信,从而在毫秒级响应窗口内完成流量接入、风险决策、规则执行与数据持久化。本章从整体分层、模块职责、数据流三个维度展开。

2.1 整体架构分层

标准低延迟风控规则引擎采用四层架构:接入层、决策层、执行层、存储层。各层之间通过内存队列或共享内存传递上下文,避免跨网络序列化开销。

层级 核心职责 延迟目标 典型组件
接入层 协议适配、流量整形、请求校验、上下文构建 < 0.5 ms Netty、gRPC Gateway、自研协议转换器
决策层 规则匹配策略编排、特征聚合、决策树路由 < 2 ms 决策树引擎、规则集管理器、特征缓存
执行层 原子规则执行、函数计算、表达式求值、动作触发 < 1 ms MVEL/SpEL 引擎、自定义函数库、动作分发器
存储层 规则元数据、特征数据、决策日志、黑白名单持久化 < 1 ms(缓存命中) Redis、RocksDB、本地内存表、Kafka(异步)
设计要点:接入层与决策层之间使用无锁环形缓冲区(Disruptor)传递事件,避免线程上下文切换带来的抖动。执行层采用预编译表达式缓存,将规则编译耗时从运行时剥离到加载阶段。

2.2 模块职责划分

每个层级内部进一步拆分为高内聚模块,模块间通过定义清晰的接口契约协作。以下按层展开模块职责。

2.2.1 接入层模块

  • 协议适配器:支持 HTTP/HTTPS、gRPC、TCP 自定义协议,统一转为内部事件对象。
  • 流量整形器:基于令牌桶或漏桶算法进行限流,防止突发流量击穿下游。
  • 请求校验器:校验必填字段、签名、时间戳,拒绝无效请求。
  • 上下文构建器:将原始请求与设备指纹、IP 信誉等外部数据合并为决策上下文。

2.2.2 决策层模块

  • 策略编排器:根据业务场景(登录、交易、提现)选择对应的规则集执行顺序。
  • 特征聚合器:从存储层拉取实时特征(如近 5 分钟失败次数),合并到上下文中。
  • 决策树路由器:基于决策树快速命中规则组,剪枝无效分支。
  • 结果收集器:汇总所有规则执行结果,生成最终决策(通过/拒绝/人工审核)。

2.2.3 执行层模块

  • 规则执行器:加载预编译规则表达式,逐条执行并收集命中结果。
  • 函数库:提供风控专用函数(IP 归属地判断、设备指纹比对、时间窗口计数)。
  • 动作分发器:根据规则命中结果触发动作(拦截、打标、告警、异步写入)。
  • 超时控制器:监控单条规则执行耗时,超过阈值则强制中断并返回默认决策。

2.2.4 存储层模块

  • 规则元数据存储:存放规则定义、版本、状态,支持热加载。
  • 特征缓存:使用 LRU 或 Caffeine 缓存高频特征,减少 DB 查询。
  • 决策日志:异步批量写入 Kafka,用于事后审计与模型训练。
  • 黑白名单:全量加载到本地内存,支持 O(1) 查询。

2.3 数据流图

下图展示一次完整的风控推理请求在四层架构中的流转路径。箭头方向代表数据流动方向,数字标注关键步骤。

低延迟风控规则引擎数据流图 风控推理请求数据流图 接入层 协议适配 流量整形 上下文构建 决策层 策略编排 特征聚合 决策树路由 执行层 规则执行 函数计算 动作分发 存储层 规则元数据 特征缓存 决策日志 ① 事件 ② 上下文 ③ 结果 ④ 特征回拉 ⑤ 熔断/超时反馈 数据流关键说明 ① 接入层将原始请求转为内部事件,通过 Disruptor 无锁队列投递到决策层。 ② 决策层聚合特征后,将完整上下文传递给执行层;③ 执行层命中规则后触发动作并异步写日志。 1 2 3 4

2.4 模块间协作与关键接口

各层模块通过以下核心接口完成数据交换,接口设计遵循零拷贝与批量处理原则。

接口名称 调用方 提供方 传输内容 协议/方式
EventPublish 接入层 决策层 决策上下文(EventContext) Disruptor RingBuffer
FeatureFetch 决策层 存储层 特征 Key 列表 → 特征值 Map 共享内存 + LRU 缓存
RuleExecute 决策层 执行层 上下文 + 规则 ID 列表 → 命中结果 线程内直接调用
ActionDispatch 执行层 存储层 动作指令(拦截/告警/日志) 批量异步写入 Kafka
低延迟关键实践:决策层与执行层部署在同一个进程内,通过线程池直接调用,避免 RPC 开销。特征缓存使用堆外内存(Off-Heap)存储,减少 GC 压力。决策日志采用批量异步刷盘,单次批量至少 100 条或间隔 5ms。

2.5 架构设计权衡与避坑

  • 避免跨层同步调用:存储层的特征查询必须走缓存,缓存未命中时使用异步回填,不可阻塞决策流程。
  • 规则热加载隔离:执行层维护两套规则快照(当前版本 + 新版本),加载完成后再原子切换,避免加载过程中规则不一致。
  • 超时传播控制:接入层设置全局超时(如 5ms),决策层设置子超时(如 3ms),执行层设置单规则超时(如 0.5ms),层层收敛防止级联超时。
  • 存储层读写分离:规则元数据与特征缓存使用不同的线程池,写操作(日志、异步更新)与读操作(特征查询)隔离,避免写放大影响读延迟。
常见陷阱:将业务逻辑(如复杂的特征计算)放在接入层会导致该层变厚,增加请求延迟。接入层应只做协议转换与校验,所有业务特征计算下沉到决策层或执行层。另外,避免在决策层使用远程 RPC 获取特征,必须使用本地缓存或预加载。

2.6 架构总览图

下图以分层视角展示各模块的部署关系与数据流向,突出进程内通信与异步持久化的设计模式。

规则引擎架构分层总览图 规则引擎架构分层总览图 接入层 协议适配器 | 流量整形器 | 请求校验器 | 上下文构建器 决策层 策略编排器 | 特征聚合器 | 决策树路由器 | 结果收集器 执行层 规则执行器 | 函数库 | 动作分发器 | 超时控制器 存储层 规则元数据存储 | 特征缓存 (Caffeine) | 决策日志 (Kafka) | 黑白名单 (本地内存) 事件流 上下文流 动作流 💡 所有层部署在同一个 JVM 进程内,层间通过内存传递数据,存储层仅缓存与异步写入涉及 I/O 操作。

2.7 本章小结