4. 规则引擎入门:规则引擎概念、Drools/Aviator简介、规则与切片的绑定关系
4.1 规则引擎核心概念
规则引擎(Rule Engine)是一种将业务决策逻辑从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策的组件。它接受数据输入,解释业务规则,并根据规则输出决策结果。
在实时交易风控场景中,规则引擎是“大脑”,负责对每一笔交易进行快速、准确的判断。其核心价值在于:
- 解耦:风控策略人员可以独立修改规则,无需开发人员介入代码部署。
- 高效:采用RETE算法等优化技术,能在毫秒级完成大量规则的匹配与执行。
- 可维护:规则以结构化方式存储,便于审计、追溯和版本管理。
关键术语:
事实(Fact):输入引擎的数据对象,如一笔交易记录。
规则(Rule):由条件(LHS)和动作(RHS)组成的逻辑单元。
规则库(Rule Base):所有规则的集合。
工作内存(Working Memory):引擎运行时存放事实和中间结果的区域。
事实(Fact):输入引擎的数据对象,如一笔交易记录。
规则(Rule):由条件(LHS)和动作(RHS)组成的逻辑单元。
规则库(Rule Base):所有规则的集合。
工作内存(Working Memory):引擎运行时存放事实和中间结果的区域。
4.2 Drools 与 Aviator 简介
业界主流的规则引擎方案中,Drools 和 Aviator 代表了两种不同的设计哲学。Drools 是重量级的全功能规则引擎,而 Aviator 是轻量级的表达式求值引擎。在实时风控场景中,两者常被组合使用。
| 特性维度 | Drools | Aviator |
|---|---|---|
| 定位 | 全功能规则引擎(BRMS) | 高性能表达式求值引擎 |
| 规则语言 | DRL(Drools Rule Language) | AviatorScript / 自定义表达式 |
| 推理机制 | RETE 网络 + 前向链推理 | 直接编译求值,无推理 |
| 性能 | 适合复杂规则集(百条以上) | 单条表达式纳秒级执行 |
| 适用场景 | 复杂策略编排、规则间依赖 | 简单阈值判断、特征计算 |
| 学习成本 | 较高 | 较低 |
4.2.1 Drools 规则示例
以下是一个典型的 Drools 规则(DRL 文件片段),用于判断交易金额是否超过单笔限额:
package com.risk.rules;
import com.risk.model.Transaction;
rule "单笔交易金额限额检查"
salience 100
when
$tx : Transaction(amount > 50000)
then
$tx.setRiskLevel("HIGH");
$tx.addHitRule("单笔交易金额限额检查");
System.out.println("触发规则:单笔交易金额超过50000元");
end
4.2.2 Aviator 表达式示例
同样的逻辑,使用 Aviator 表达式可以写为:
// Aviator 表达式字符串
String expression = "amount > 50000 ? 'HIGH' : 'LOW'";
// 执行求值
Map<String, Object> env = new HashMap<>();
env.put("amount", 68000);
Object result = AviatorEvaluator.execute(expression, env);
// result = "HIGH"
选型建议:在实时风控系统中,通常使用 Drools 管理核心的复杂规则(如设备指纹关联、历史行为模式匹配),而将简单的阈值规则(如金额、次数、频率)交由 Aviator 处理,以降低延迟。
4.3 规则与切片的绑定关系
人群切片(Segment)定义了“对谁做风控”,而规则(Rule)定义了“做什么判断”。两者必须通过绑定关系(Binding)才能形成完整的决策单元。绑定关系决定了:
- 作用域:该规则仅对特定切片内的交易生效。
- 优先级:同一切片内多条规则的执行顺序。
- 生命周期:规则在切片内的生效时间、灰度比例等。
4.3.1 绑定关系的实现方式
在系统实现层面,规则与切片的绑定关系通常通过配置中心或数据库表来维护。以下是一个典型的绑定关系表结构:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| segment_id | varchar(64) | 人群切片唯一标识 |
| rule_id | varchar(64) | 规则唯一标识 |
| priority | int | 规则在该切片内的执行优先级(数值越小越优先) |
| status | tinyint | 绑定状态:1-启用,0-禁用 |
| effective_time | datetime | 绑定生效时间 |
| expire_time | datetime | 绑定失效时间 |
注意:绑定关系变更后,需要触发规则引擎的热加载机制,确保新配置立即生效。对于生产环境,建议采用灰度发布策略,先在小比例切片上验证新绑定关系,再全量推送。
4.3.2 运行时决策流程
当一笔交易进入风控系统时,完整的决策流程如下:
- 交易入参:接收交易请求,提取关键字段(金额、用户ID、设备ID、IP等)。
- 切片匹配:根据用户画像和交易上下文,匹配所属的人群切片(可能命中多个切片)。
- 规则加载:根据绑定关系,加载命中切片所关联的所有规则,并按优先级排序。
- 规则执行:将交易事实注入规则引擎,依次执行规则,收集命中结果。
- 决策输出:综合所有规则的输出,生成最终决策(通过/拒绝/人工审核)。
实战要点:在实时风控系统中,规则与切片的绑定关系是策略配置的核心。建议将绑定关系存储在分布式配置中心(如 Apollo、Nacos)中,支持动态下发和版本回滚。同时,建立完善的绑定关系血缘图,便于复盘时快速定位“某个切片下的某条规则为何被触发”。