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 数据流图
下图展示一次完整的风控推理请求在四层架构中的流转路径。箭头方向代表数据流动方向,数字标注关键步骤。
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 架构总览图
下图以分层视角展示各模块的部署关系与数据流向,突出进程内通信与异步持久化的设计模式。