互联网风控系统架构分析(代码片段)

tangsilian tangsilian     2023-02-03     372

关键词:

本文简单介绍风控具体是做什么的,以及一些常见的风控系统实现的架构。

文章目录


前言

虽然都是从事安全相关工作,而风控一直都是比较神秘的存在。仅大概模糊了解一些风控规则,实际不知道风控系统具体如何实现,如何与业务打通,如何持续运营?带着这些问题,我抽空学习看了一些友商关于风控的实践及开源的风控引擎。把一些个人理解和大家分享一下。

友商相关的风控实践:

网易严选风控实践:https://sq.163yun.com/blog/article/183304443737464832
携程在线风控系统架构:https://mp.weixin.qq.com/s/muufqznNNVidPgamlcurCQ
蚂蚁金服智能风控引擎AlphaRisk介绍:https://www.docin.com/p-2222786093.html
阿里风控大脑关于大数据应用的探索与实践:https://www.bilibili.com/read/cv4178932/

相关的风控开源项目如下:

风控项目备注
六道 —实时业务风控系统同程应急安全响应中心 java系
radar实时风控引擎java系
陌陌风控系统静态规则引擎陌陌 python
星云(TH-Nebula)业务风控系统介绍威胁猎人 java系

一、互联网风控是做什么的?

风控的定义

首先了解两个概念:风险管理和风险控制。

风险管理:是指如何在项目或者企业在一定的风险的环境里,把风险减至最低的管理过程。它的基本程序包括风险识别、风险估测、风险评价、风险控制和风险管理效果评价等环节。

风险控制:是指风险管理者采取各种措施和方法,消灭或减少风险事件发生的各种可能性,或者减少风险事件发生时造成的损失。所以其实风险控制是风险管理中的一个环节。

在互联网行业,风控是在各个业务场景(注册、登录、交易、活动等等)下风险控制的简称,一般称为业务安全风控团队。常根据不同的场景划分为账号安全风控、内容风控、支付风控、交易风控、活动风控等。

业务安全团队的职能就是在各个业务场景中对抗着各类的薅羊毛,欺诈、盗号、作弊、套现以及营销活动被恶意刷单、恶意抢占资源等风险行为,从而保障业务安全。采用的主要措施和手段就是在业务请求中识别出谁、在什么时间、通过什么方式、做了什么事,而风控系统就是为了帮助业务风控同学实现上述流程而构造的系统。

二、常见风控系统的实现架构

1.风控系统的架构

风控系统的定义:根据业务系统传来的数据或埋点信息来判断当前用户或事件有无风险;


早期简单的风控系统如上图:

  • 服务架构:一般由springboot构建,通过RPC/HTTP 接口来接收业务传输的数据。
  • 核心处理逻辑:在短时间内通过规则引擎中配置的规则对数据进行处理,将结果返回给业务方,最后由业务方决策阻断还是放行。
  • 存储逻辑:使用redis高速缓存着黑白名单,redis、mongodb用于词频统计,排序,聚合等计算。mysql存储着风控配置开关。

而随着业务场景复杂,分析数据的体量变大,风控系统中慢慢引入更多功能,来满足各类型业务的需求。

2.风控的系统流程

现阶段风控系统处理流程一般分为: 实时引擎,近实时引擎和离线引擎。

实时引擎
实时风控是整个系统的核心,被业务系统同步调用,完成对应的风控判断。一般风控接口的对处理耗时要求比较高,接口正常及格线T999在50ms左右,才能尽量降低风控逻辑对业务的影响。

准实时引擎(异步的实时计算)
这个流程一般后台逻辑,为风控系统服务,准备和统计实时计算需要的事实数据。

比如:有些规则判断需要事实的相关指标,比如最近一小时登陆次数,最近一小时注册账号数等等,这些指标通常有一段时间跨度,是某种状态或聚合,很难在实时风控过程中根据原始数据进行计算,因为风控的规则引擎往往是无状态的,不会记录前面的结果。从而通过近实时引擎汇总统计全局的检测状态,准备中间数据,以及更新设备及用户最近的交易时间和地点等属性。同时也可以对比同期指标,当某条规则的拦截率突然发生较大变化、全局通过率突然增高或降低等等。

由于近实时处理的原始数据量很大,用户活动的原始数据都要传过来进行计算,这部分往往由一个流式大数据系统来完成。常见的是使用Flink或者storm来对kafka中的消息进行处理。

离线引擎:业务对于风控策略误伤的容忍度低,需要离线流程对样本回溯分析、用历史数据来验证影响。同时离线流程对线上模型就行评估,并发现线上策略漏过的数据,补齐能力到线上模型。


离线引擎常用spark进行为H+1,T+1的定时任务调度来对hive数据分析来实现。

三、核心风险识别环节

从业界风险的案例来看,早期的风控的核心处理逻辑都是基于专家对异常用户的历史数据做统计分析,找出异于正常用户的特征编写成规则。而随着业务场景和数据量的增加。现阶段都利用生产力更高的算法模型对大数据进行分析,主动发现异常特征,提前识别。目前常见的风控系统是静态规则和模型两种技术的融合。

1.规则及规则引擎

什么是规则,规则的分类是什么,什么又是规则引擎?

风控的规则是什么?

举个列子:在一些登录场景,为了对抗账号登录的爆破,同一个账号密码输入错误超过三次,账号登录即会受到限制。对应的风控规则可能是同一天内,一个账号,连续登录失败三次。

常见的规则分类:

  • 静态规则:基于某个静态值的限制性规则,比如是否命中黑名单、常用联系人验证、电信服务使用地理范围验证等
  • 统计规则:用统计计算的值来作为验证的条件,如来自某个设备或者IP的申请次数大于某个值
  • 关联规则:指用户在进行了某个操作之后,又执行另外一个操作,带来的风险。例如,修改账号密码后,进行交易操作
  • 行为规则:指用户的异常行为,例如用户在非常驻地址,非常用的设备,非常用的时间,进行了交易操作,一般也认为具备一定的风险。

常用的开源规则引擎:

早起硬编码编写的规则方式不方便维护和协同开发,如果逻辑过多代码冗余且无法更改。遂在风控规则上,业界都将业务决策从应用程序代码中分离出来,使用规则引擎的方式来编写,并根据业务规则做出业务决策。

常见成熟的规则引擎有Drools和Groovy。

Drools规则:

Drools和Java环境结合的非常好,本身也非常完善,支持很多特性,不过使用比较繁琐,有较高门槛,规则都是用java语言编写,规则文件为rules/*.drl。如下是Drools编写的一条,单个IP上登录的手机号超过20风险值就加1的规则。

	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													--结束规则

drools的详细文档,请参考官方 http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html_single/index.html

Groovy规则:

groovy是一种基于jvm的脚步语言,由于其语法简单,对java程序员入手简单,且能无缝衔接使用java的开源库.在java中运行Groovy脚本,有三种比较常用的类支持:GroovyShell、GroovyClassLoader 以及 Java-Script引擎。

以GroovyShell为例:允许在Java类中(甚至Groovy类)求任意Groovy表达式的值。可使用Binding对象输入参数给表达式,并最终通过GroovyShell返回Groovy表达式的计算结果。

import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.lang.Script;

public class Demo 

    public static void main(String[] args) 

        // 绑定变量到 groovy 执行环境
        Binding binding = new Binding();
        binding.setVariable("foo", new Integer(2));

        // 构建 groovy script
        GroovyShell shell = new GroovyShell();
        Script script = shell.parse("println 'Hello World!'; x = 123; return foo * 10");
        script.setBinding(binding);  // 绑定

        // 执行脚本
        Object value = script.run();

        // 执行结果
        System.out.printf("执行结果:%s, 类型: %s\\n", value, value.getClass().getCanonicalName());

        // 获取执行过程中的变量
        System.out.printf("执行过程中的x变量:%s, 类型: %s\\n", binding.getVariable("x"), binding.getVariable("x").getClass().getCanonicalName());
    

执行结果:

Hello World!
执行结果:20, 类型: java.lang.Integer
执行过程中的x变量:123, 类型: java.lang.Integer

2.特征模型

受限于认知和生产力,人工提取规则只能识别到认知内的风险。而通过有监督和无监督学习的方式能自动化的分类和识别出未知的风险。目前还是LR模型最稳定常用,新的机器学习模型算法XGboost,FFM等模型或许还需要一段时间的实践和迭代。


总结

通过此文我们了解到了互联网公司业务风控具体介入的环节和场景,风控系统实现的架构,以及风控风险识别的实现方式及相关流程。

参考

风控实战,生物探针技术
基于规则的风控系统

机器学习平台痛点与模型提升方法:基于spark的机器学习平台在点融网风控应用介绍

...享。作者简介:刘利,点融网DataScientistTeam负责人,从事互联网数据分析和数据挖掘近十年。现任点融网DataScie 查看详情

网关流控利器:结合ahas实现ingress/nginx流量控制(代码片段)

...阿里内部淘宝、天猫等电商领域有着广泛的应用,在互联网金融、在线教育、游戏、直播行业和其他大型政央企行业也有着大量的实践。流量漏斗防护原则在分布式系统架构中,每个请求都会经过很多层处理,比如从... 查看详情

京东基于spark的风控系统架构实践和技术细节

....dataguru.cn/article-9419-1.html主题 Spark 软件架构1.背景互联网的迅速发展,为电子商务兴起提供了肥沃的土壤。2014年,中国电子商务市场交易规模达到13.4万亿元 查看详情

软件测试-互联网金融风控测试知识都有哪些呢?(代码片段)

大家好,今天我们一起来聊聊,在我们测试互联网金融项目中的风控系统都需要怎么进行测试,测试工作中都有哪些内容需要进行测试,重点测试需要关注什么呢?风控主要的测试节点:1、用户预筛模型... 查看详情

flume+kafka+storm+redis实时分析系统基本架构(代码片段)

今天作者要在这里通过一个简单的电商网站订单实时分析系统和大家一起梳理一下大数据环境下的实时分析系统的架构模型。当然这个架构模型只是实时分析技术的一个简单的入门级架构,实际生产环境中的大数据实时分析... 查看详情

秒杀系统架构分析与实战(代码片段)

1秒杀业务分析2秒杀技术挑战3秒杀架构原则4秒杀架构设计5大并发带来的挑战6作弊的手段:进攻与防守7高并发下的数据安全8总结 1秒杀业务分析正常电子商务流程(1)查询商品;(2)创建订单;࿰... 查看详情

flume+hadoop+hive的离线分析系统基本架构(代码片段)

...0c;所以在这里通过做一个简单的网站点击流数据分析离线系统来和大家一起梳理一下离线分析系统的架构模型。当然这个架构模型只能是离线分析技术的一个简单的入门级架构,实际生产环境中的大数据离线分析技术还涉及... 查看详情

mpp架构海量数据分析仓库——greenplum介绍(代码片段)

一、Greenplum背景时间回到2002年,互联网行业经过近10年的发展,数据量正处于快速增长期:  1、传统的主机计算模式在海量数据面前,除了造价昂贵外,在CPU计算和IO吞吐上不能满足海量数据的计算需求;  2、传统数据库... 查看详情

系统架构实战:支付平台的架构设计(代码片段)

互联网平台架构日益成为互联网发展的基石,对于Java开发者和架构师而言,只有在了解架构背后的原理后,才能写出更高质量的代码,才能设计出更好的方案,才能在错综复杂的平台架构下产出价值,才... 查看详情

微服务架构之旅——《走进springcloud》(代码片段)

近十年国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了,像618、双十一这样的活动不断逼迫我们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思想已经不能满足... 查看详情

互联网架构多线程并发编程高级教程(上)(代码片段)

#基础篇幅:线程基础知识、并发安全性、JDK锁相关知识、线程间的通讯机制、JDK提供的原子类、并发容器、线程池相关知识点?#高级篇幅:ReentrantLock源码分析、对比两者源码,更加深入理解读写锁,JAVA内存模型、先行发生原则... 查看详情

秒杀系统架构分析与实战--转载

原文地址:http://developer.51cto.com/art/201601/503511.htm互联网正在高速发展,使用互联网服务的用户越多,高并发的场景也变得越来越多。电商秒杀和抢购,是两个比较典型的互联网高并发场景。虽然我们解决问题的具体技术方案可能... 查看详情

用系统架构中的系统思维分析一个咖啡厅系统(代码片段)

此文是对《系统架构》中第2章系统思维的笔记,前前后后看了很多遍,为了达到活学活用,尝试用系统思维分析一个生动的现实生活中的案例,这样有助于更深刻的理解及现实的建模能力。现分享给大家一起讨论... 查看详情

用系统架构中的系统思维分析一个咖啡厅系统(代码片段)

此文是对《系统架构》中第2章系统思维的笔记,前前后后看了很多遍,为了达到活学活用,尝试用系统思维分析一个生动的现实生活中的案例,这样有助于更深刻的理解及现实的建模能力。现分享给大家一起讨论... 查看详情

用系统架构中的系统思维分析一个咖啡厅系统(代码片段)

此文是对《系统架构》中第2章系统思维的笔记,前前后后看了很多遍,为了达到活学活用,尝试用系统思维分析一个生动的现实生活中的案例,这样有助于更深刻的理解及现实的建模能力。现分享给大家一起讨论... 查看详情

电商秒杀系统架构分析与实战!(代码片段)

点击上方关注“终端研发部”设为“星标”,和你一起掌握更多数据库知识来源:https://my.oschina.net/xianggao/blog/5249431秒杀业务分析正常电子商务流程(1)查询商品; (2)创建订单; (3)... 查看详情

针对dns学习后的一个模拟互联网架构实验(代码片段)

互联网DNS架构实验针对系统学习DNS后的一个实验架构图共7台主机,联合实现互联网dns架构1将客户端dns服务器指向本地dns服务器2将网站搭建好root:~#yuminstallhttpdroot:~#cd/var/www/html/root:/var/www/html#echo192.168.64.57,hello>index.htmlroot:/var/www... 查看详情

搭建高可用系统架构与性能优化(代码片段)

...单。在哪些场景中会存在单点?先来看一下一个典型互联网高可用架构。典型互联网高可用架构:(1)客户端层,这一层是浏览器或者APP,第一步先访问DNS-server,由域名拿到nginx的外网IP(2)... 查看详情