介绍
背景
公司可能会遇到各类的欺诈、盗号、作弊、套现以及营销活动被恶意刷单等风险,在团队的早期由业务系统自行处理,或者由公司安全团队硬编码的方式部署规则,例如盗号,当登录次数超过一定阈值则弹出验证码或拒绝登录。硬编码方式面临各种困难和挑战,主要包括以下几个方面:
- 策略规则不能沉淀积累,新策略仍需经过开发等一系列才能上线
- 策略无法上线前验证
- 策略规则不能动态组合、实时修改
- 维度、阈值无法实时修改
- 处罚手段不全
- 分析查询功能非常弱,想要的信息查询不了
为此,需要建设一套风控系统,业务及技术目标如下:
业务目标
- 策略制定流程标准化,系统需支撑策略的快速配置、验证、修改、上线
- 系统提供便捷的查询分析工具,针对未知案例可以做到快速响应
- 系统提供完善的处罚手段,在各个业务场景实现细力度的风险控制
技术目标
- 业务接入标准化
- 接入场景定制化
- 策略规则灵活配置及验证
- 高并发
- 服务稳定性
本项目不是一整个风控解决方案,而是聚焦在实时风控引擎的实现
核心概念
事件
Event
某个业务或场景需要接入风控的事件单元,例如:充值事件、下单事件、提现事件等。
每个事件的接入需要传递参数,分为公共参数和业务参数。公共参数包含事件Event、用户uid、设备id、ip地址等,而业务参数则根据各个事件的具体场景定制。
每个事件配置一个或多个规则组。
规则组
绑定在事件上的包含一系列的规则的组合。
规则组可以配置前置表达式:当表达式(Groovy语法)成立时,包含的规则才有效。
规则组状态:ENABLE、TEST、DISABLE 分别对应生效、测试、未生效,规则组标记为TEST时,其包含的规则都为TEST状态。
规则
由一系列指标变量组成的符合Groovy语法的表达式或者一段Groovy代码,是判断风险的最小业务单元。
规则包含惩罚话术:规则命中时,返回给用户的话术。
规则状态:ENABLE、TEST、DISABLE 分别对应生效、测试、未生效,规则标记为TEST时,规则执行但不返回结果也不会执行关联的惩罚。
指标
某个主体在一段时间内累积的数据称为指标,用于 Groovy 表达式中。
例如:
- 某个用户最近3小时第三方不同的充值账号数
- 某个ip最近1小时充值次数
- 某个用户最近5小时消费总金额
针对上述需求我们可以抽象出:
- 分组字段:用户、IP
- 聚合字段:消费金额,对消费金额做累加
- 聚合函数:COUNT、SUM、MAX、MIN、COUNT_DISTINCT、DISTINCT
- 聚合窗口:5小时、3小时
- 前置条件:满足条件才聚合数据
变量
调用外部服务获取的数据赋值给一个变量,用于 Groovy 的表达式中。
名单库
事件接入时可以绑定名单组,一次请求如果命中白名单则PASS,命中黑名单则直接REJECT。
名单信息还可以通过变量的方式应用到规则表达式中。
技术栈
- 后端技术栈:Java、SpringBoot、Mysql、Redis、MongoDB
- 前端技术栈:React、Ant Design Pro