风控系统设计

一、背景

当前互联网企业存在很多业务风险,有些风险(比如薅羊毛)虽然没有sql注入漏洞利用来的直接,但是一直被羊毛党、刷单党光顾的企业长期生存下来的几率会很低!

实时业务风控系统是分析风险事件,根据场景动态调整规则,实现自动精准预警风险的系统。

需要解决的问题:

二、架构图

风控系统的核心就是规则引擎,一个好的规则引擎可以方便业务方随时变更验证逻辑而不用重启服务。既要保证服务的稳定又要不失灵活性。规则引擎我们是采用执行drools脚本,可以灵活变更规则逻辑。这需要对领域模型进行抽象,目前抽象出了策略、规则和指标关系如下图所示:

一般来说业务方在接入风控系统时需要先配置策略规则,然后设定每个规则对应的阈值和分值等级,完了就可以应用上线观测实际预测的效果,实际的预测结果只能依赖离线分析,可能需要对用户历史操作轨迹进行分析,如果预测结果拦截的都是正常操作的用户,这时可能就需要调整阈值。有了这个闭环就知道接下来需要做的事情了,后面所有的架构都是围绕这个闭环来进行。经过重新梳理后架构图如下:

三、风控系统组成

实时规则服务

实时风控服务是整个风控系统的核心服务,是风控系统对外的门面,被所有业务系统同步调用,返回对风控规则的校验结果,保证业务流程正常且安全。

准实时规则计算服务

准实时风控业务需要对一些业务场景进行实时计算,需要借助kafka+flink等实时计算业务,对核心风控指标进行计算规划

离线计算服务

离线计算服务需要对核心指标进行数据建模,借助算法,机器学习,来分析出风险点,将结果反馈上报

四、风控管理平台

风控系统实际是包含两部分内容,一是识别风险,二是对识别后的风险或是自动的或是人工的进行处理。后台系统增加了惩罚管理,相对于原先风险处理硬编码在业务逻辑中,惩罚管理可以做到配置化的分级处理,当然响应可能没有以前及时,但也是近实时的。整体流程如下所示。

五、实现原理

统计学

抽象:某时间段,在条件维度(可以是多个维度复合)下,利用统计方法统计结果维度的值。充分发挥你的想象吧!

Redis

redis中数据结构sortedset,是个有序的集合,集合中只会出现最新的唯一的值。利用sortedset的天然优势,做频数统计非常有利。

比如1小时内某ip上出现的账号数量统计:

保存维度

  1.1.1.1
          |--账号1                20160807121314
          |--账号2                20160807121315
          |--账号n                20160807121316

  2.2.2.2
          |--账号3                20160807121314
          |--账号4                20160807121315
          |--账号m                20160807121316

计算频数

Drools

规则配置:rules/*.drl,规则都是用java语言编写。默认配置了登录事件的部分规则

drl文件说明:

        package rules;                                                                                --规则包路径

        import com.example.riskcontrol.model.LoginEvent                --引入类
        import com.example.riskcontrol.service.DimensionService
        import com.example.riskcontrol.model.EnumTimePeriod
        
        global DimensionService dimensionService                        --引入外部服务

        rule "98_login_ip"                                                          --规则名称,全局唯一
            salience 98                                                                                --规则优先级,值越大越先执行
            lock-on-active true                                                                --事件不重复执行该规则
            when                                                                                        --条件判断,是否需要进入action
                event:LoginEvent()                                                        --判断事件对象是否是LoginEvent类
            then                                                                                        --action
                int count  = dimensionService.distinctCount(event,new String[]{LoginEvent.OPERATEIP},EnumTimePeriod.LASTHOUR,LoginEvent.MOBILE);                --近1小时内该事件ip上出现的mobile数量统计
                if(event.addScore(count,20,10,1)){                                                                                --如果统计结果超过20个,则记10分,并且结果每超1个,再多记1分
                    dimensionService.insertRiskEvent(event,"近1小时内同ip出现多个mobile,count="+count);  --记录风险事件日志
                }                
        end                                                                                                        --结束规则
展开阅读全文

页面更新:2024-03-04

标签:离线   系统   维度   账号   实时   规则   风险   事件   业务   用户

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top