关于规则引擎的思考(3)
做一个安全风控的引擎,用规则配置,需要能够自反馈。所以也不是一个简单的规则引擎。
也就是实时引擎 + 离线引擎两个部分。或者说是 数据平面 + 控制平面也行。
实时引擎在业务流量上处理,离线引擎给实时引擎提供弹药。
- 实时引擎:
逻辑匹配70%:if else
有状态的计算30%:虽然比重小,但实现麻烦。
state管理的流式数据计算。原理参考Spark,Flink,但又不是通用系统。不能用Spark,Flink是需要同步做决策,Spark,Flink显然不合适。
https://spark.apache.org/docs/1.6.2/api/java/org/apache/spark/streaming/State.html
有需求边界夹持,可以做的更快,更小。
举个例子:状态防火墙中的session table,以IP五元祖为key,其中一种状态是tcp状态。
我们使用数据流式处理如何实现呢
key: ip 5-tuple
state: 就是tcp状态顺序,在一定生命周期下统计,有明确开始(create),和退出时机(remove)。
def sequnceFunction(ip, tcp_action, state) := {
if (state.exists) {
if (tcp_ack == FIN_ACK) {
state.remove()
} else {
state.update(transState(tcp_action));
}
} else {
state.update(initStatinitState(tcp_action));
}
这个例子的状态比较具体,如果抽象一些,这个状态大概分为这些
https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/state/state.html
状态 | 场景 | 需求 |
---|---|---|
ValueState | 单值统计 | 需要 |
ListState | 序列统计 | 需要 |
ReducingState | 单值 | 不是简单累加,比如求唯一数量,可以用近似算法HyperHyperLog,这样就变成单值 |
AggregatingState | 复杂统计 | Reducing 和 ListState更复杂的表达,目前不需要 |
MapState | 二维矩阵 | 目前不需要,场景上可以用预测接口PMML替代 |
实时引擎要有嵌入机器学习模型的能力,使用PMML。
- 离线引擎:
需要能和实时引擎配合,因为是离线的,所以Spark,Clickhouse等工具都可以。
离线一般采用定时任务,从配置的规则中执行数据筛选,获得规律的统计参数,模型。然后作用到实时引擎上。可以从机器学习角度理解,就是train完model后,还需要用这个model predict。
Spark ML训练的模型要能更新到PMML中。
模型有很多类型,有数据相关的,如KNN,也有数据无关的,如决策树。
所以最后输出的是
- 数据:如:路由表,风险用户列表。
- 参数:当前没小时访问次数风险阈值,单一用户支付的风险金额。
- 模型:数据+参数的组合组合。
逻辑是这个逻辑,但大多工程实践上AI并没有那么强,所以这些口子留出来。
//状态管理
risk_state(data)
//表查询
risk_table.lookup(data.key)
//动态调参
risk_params(data.val)
//逻辑匹配
if data.a else risk
//模型匹配
risk_module.predict(data.feature)
最终很可能if else起了70%的作用,表查询起了20%的作用,调参数起了7%的作用,模型起了3%的作用。
符合典型的奥卡姆剃刀原理。
大概就是这些想法了。