当前互联网企业存在很多业务风险,有些风险(比如薅羊毛)虽然没有sql注入漏洞利用来的直接,但是一直被羊毛党、刷单党光顾的企业长期生存下来的几率会很低!
实时业务风控系统是分析风险事件,根据场景动态调整规则,实现自动精准预警风险的系统。
本项目只提供实时风控系统框架基础和代码模板。
抽象:某时间段,在条件维度(可以是多个维度复合)下,利用统计方法统计结果维度的值。充分发挥你的想象吧!
要将任意维度的历史数据(可能半年或更久)实时统计出结果,需要将数据提前安装特殊结果准备好(由于事件的维度数量不固定的,选取统计的维度也是随意的,所以不是在关系数据库中建几个索引就能搞定的),需要利用空间换时间,来降低时间复杂度。
redis中数据结构sortedset,是个有序的集合,集合中只会出现最新的唯一的值。利用sortedset的天然优势,做频数统计非常有利。
比如1小时内某ip上出现的账号数量统计:
保存维度
ZADD key score member(时间复杂度:O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量),key=ip,score=时间(比如20160807121314),member=账号。存储时略耗性能。 结构如下:
1.1.1.1
|--账号1 20160807121314
|--账号2 20160807121315
|--账号n 20160807121316
2.2.2.2
|--账号3 20160807121314
|--账号4 20160807121315
|--账号m 20160807121316
计算频数
ZCOUNT key min max(时间复杂度:O(1)),key=ip,min=起始时间,max=截止时间。计算的性能消耗极少,优势明显
redis lua
把保存维度,计算频数,过期维度数据等操作,使用lua脚本结合在一起,可以减少网络IO,提高性能
mongodb本身的聚合函数统计维度,支持很多比如:max,min,sum,avg,first,last,标准差,采样标准差,复杂的统计方法可以在基础聚合函数上建立,比如行为习惯:
getDB().getCollection(collectionName).aggregate(
Arrays.asList(
match(match) --匹配条件维度
, group("$" + field, Accumulators.sum("_count", 1)) --求值维度的次数
, match(new Document("_count", new Document("$gte", minCount))) --过滤,超过minCount才统计
, sort(new Document("_count", -1)) --对次数进行倒叙排列
)
);
建议在mongodb聚合的维度上建立索引,这样可以使用内存计算,速度较快。
drl文件说明:
package rules; --规则包路径
import io.jisi.holtin.web.event.LoginEvent --引入类
import io.jisi.holtin.service.ThresholdService
import io.jisi.holtin.web.event.EventResultType
import io.jisi.holtin.web.event.Event
global ThresholdService thresholdService --引入外部服务
rule "98_threshold_ip" --规则名称,全局唯一
salience 98 --规则优先级,值越大越先执行
lock-on-active true --事件不重复执行该规则
when --条件判断,是否需要进入action
event:LoginEvent(operateIp != null) --判断事件对象是否是LoginEvent类
then
System.out.println(drools.getRule().getName());
if(thresholdService.ip(event.getOperateIp(),20,1000)){
event.setResult(EventResultType.REJECT);
event.executeLog(drools.getRule().getName(),false,"不符合1000ms,20次");--记录风险事件日志
}else{
event.executeLog(drools.getRule().getName(),true,"");--记录风险事件日志
}
end --结束规则
drools的详细文档,请参考官方 http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html_single/index.html
系统默认采用jar打包和运行,建议集群方式部署,然后使用反向代理做负载均衡。
建议jdk 8
项目集成docker部署,在build.gradle 中修改下面的内容即可 =======build docker image====
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。