风控系统设计
一、背景
当前互联网企业存在很多业务风险,有些风险(比如薅羊毛)虽然没有sql注入漏洞利用来的直接,但是一直被羊毛党、刷单党光顾的企业长期生存下来的几率会很低! 账号:垃圾注册、撞库、盗号等 交易:盗刷、恶意占用资源、篡改交易金额等 活动:薅羊毛 短信:短信轰炸
实时业务风控系统是分析风险事件,根据场景动态调整规则,实现自动精准预警风险的系统。
需要解决的问题: 哪些是风险事件,注册、登录、交易、活动等事件,需要业务埋点配合提供实时数据接入 什么样的事件是有风险的,风险分析需要用到统计学,对异常用户的历史数据做统计分析,找出异于正常用户的特征 实时性,风险事件的分析必须毫秒级响应,有些场景下需要尽快拦截,能够给用户止损挽回损失 低误报,这需要人工风控经验,对各种场景风险阈值和评分的设置,需要长期不断的调整,所以灵活的规则引擎是很重要的 支持对历史数据的回溯,能够发现以前的风险,或许能够找到一些特征供参考 二、架构图
风控系统的核心就是规则引擎,一个好的规则引擎可以方便业务方随时变更验证逻辑而不用重启服务。既要保证服务的稳定又要不失灵活性。规则引擎我们是采用执行drools脚本,可以灵活变更规则逻辑。这需要对领域模型进行抽象,目前抽象出了策略、规则和指标关系如下图所示:
一般来说业务方在接入风控系统时需要先配置策略规则,然后设定每个规则对应的阈值和分值等级,完了就可以应用上线观测实际预测的效果,实际的预测结果只能依赖离线分析,可能需要对用户历史操作轨迹进行分析,如果预测结果拦截的都是正常操作的用户,这时可能就需要调整阈值。有了这个闭环就知道接下来需要做的事情了,后面所有的架构都是围绕这个闭环来进行。经过重新梳理后架构图如下:
三、风控系统组成实时规则服务
实时风控服务是整个风控系统的核心服务,是风控系统对外的门面,被所有业务系统同步调用,返回对风控规则的校验结果,保证业务流程正常且安全。 准实时规则计算服务
准实时风控业务需要对一些业务场景进行实时计算,需要借助kafka+flink等实时计算业务,对核心风控指标进行计算规划 离线计算服务
离线计算服务需要对核心指标进行数据建模,借助算法,机器学习,来分析出风险点,将结果反馈上报 四、风控管理平台
风控系统实际是包含两部分内容,一是识别风险,二是对识别后的风险或是自动的或是人工的进行处理。后台系统增加了惩罚管理,相对于原先风险处理硬编码在业务逻辑中,惩罚管理可以做到配置化的分级处理,当然响应可能没有以前及时,但也是近实时的。整体流程如下所示。
五、实现原理
统计学 次数统计,比如1分钟内某账号的登录次数,可以用来分析盗号等 频数统计,比如1小时内某ip上出现的账号,可以用来分析黄牛党等 最大统计,比如用户交易金额比历史交易都大,可能有风险 最近统计,比如最近一次交易才过数秒,可能机器下单 行为习惯,比如用户常用登录地址,用户经常登录时间段,可以用来分析盗号等
抽象:某时间段,在条件维度(可以是多个维度复合)下,利用统计方法统计结果维度的值。充分发挥你的想象吧!
Redis
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=截止时间。计算的性能消耗极少,优势明显
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 --结束规则
离婚后,另一方就真的不重要了吗?离婚以后,除非两个人还有经济抚养权等事宜的纠纷,否则两个人各自过活,再也没有交集,对方都不再是彼此的重要他人,这一点必须想清楚。人不能回头看。即使曾经有过特别甜蜜的时刻,即使离婚的
有办法把冰箱卖给黑龙江人吗?这个问题小编第一眼看到的时候,真的觉得太逗了。如果理性一点来说的话,黑龙江也是有夏天的好么?别欺负我读书少。到了夏天我们也不能把东西放外面啊,只要不放冰箱放哪不都得坏啊。不过看到这
遵义和六盘水哪个发达?遵义虽然位于黔北,但它的南面是贵阳,北面是重庆,南北都是大城市,遵义夹在中间,就很容易学到先进的经验,很多遵义人,在全省来看都是比较谦虚的。遵义过去没有的,就向贵阳向重庆学习,逐渐
江西上饶的村民景区门口私自收停车费,已持续2年,你怎么看?景区门口停车场虽属于村民,但是由于景区在人家村民地头上,往往不看僧面看佛面,毕竟这种行为也不会影响到景区正常的运作和收益。现在很多景区门口的停车场都是周边村民的地头,不仅江西景区包
为什么在结婚后,不少苏州男生都住在女方家里?谢谢邀请!以前在网上看了个奇怪的新闻,说聪明的男人大多生女儿。坊间都说苏州土豪多,那么能赚钱的人大多有才,脑袋灵活。那大概就是苏州大多土豪生的都是女儿,娇生惯养的女儿怎么会舍得嫁到
沧州和张家口哪个城市好?沧州气候好,渤海湾上,实际上沧州距离北京保定都很近,但是个人体会是,到天津往北杨村再过去北辰一带往西,气候就开始有些微不同。沙尘会多,干冷。可能与地势变化有关。沧州地处平原开阔地带
请问四川绵阳农村老家想修房子,地平方76,想修两层,大概需要多钱能修好?你好,住宅公园为您解答现在农村建房,大包的话(包工包料)砖混结构市场价在1200元每平,占地76平,两层的话150平左右,加上基础或者屋顶造型等等,毛坯房在25万左右。当然,自己买
你认为天津和北上广最大的不同在哪儿?上海和广州商业气息太浓,人性化的东西比较少,过度崇尚经济利益。相对城市风格是比较自私的,市民风格是斤斤计较的。北京天津人比较大气,符合北方城市市民风格。上海广州空气要好些,这点京津
困难户残疾户大病人,为什么要建档立卡?有什么帮助?改革开放三十多年来,国富民强,尤其是农村农民经过辛勤的劳动,和政策的红利带动下,部分己经达到小康生活。但是还有少部分人由于种种原因还生活非常贫困。其中有因病至贫。因残疾至贫,还有因
蓬莱已经是烟台的一个区吗?悄悄告诉你,蓬莱现在还不是烟台的一个区。有人反对,暂时也不会成为一个区。本来有人提出将蓬莱划成烟台的一个区,但是现在看有人反对,而且反对的厉害。现在已经澄清了,看来暂时是不划成烟台
郑州站到郑州东站打车多少钱?郑州站到郑州东站打车35元左右,坐地铁直接1号线3元,公交车85路1元。高峰期打车的话估计要再高点,这个不确定,给你的建议就是坐地铁,地铁直接一号线方便简单。郑州站位于郑州市二七区