大数据风控项目实战 Drools规则引擎

可以借鉴的干货

1,统一存储服务,包含:多种存储库连接封装和服务封装   在统一存储服务
2.获取配置的环境    类:EnvVariable

一、风控项目介绍

对一个复杂支付系统提供统一、全面、高效的风险控制服务

特定:
	1、数据全
	2、响应快

二、风控项目系统架构与技术

系统架构:
	实时风控:  规则前处理、统一规则引擎、规则后处理
	非实时风控: 数据收集入库、流式计算引擎、批量计算引擎
	统一存储服务:数据存储
	BFF:非核心模块,一些基础配置信息,比如设置日交易额最大为500

系统环境需要安装的组件;
	mysql + hbase + redis 
	kafka + flink
	maven私服Nexus(主要存储.drl文件,供Drools读取加载规则)

用到的技术:
	实时风控模块:SpringBoot + Netty + Drools规则引擎
    非实时风控模块:Flink

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、规则设计与规则引擎

1、规则设计

5种典型规则

1、简单型规则:直接读取请求报文进行规则判断
	规则示例:AQ001:对于交易渠道为XXX的所有交易,如果交易手机号和银行签约的手机号一致,则不做任何规则限制

2、数据画像型规则:需要在请求报文基础上添加一些风控因子进行补充判断
	规则示例:LG001:外部导入一批黑名单数据,黑名单用户禁止登录

3、累计型数据规则:需要对用户以往的交易进行进行累计计算的规则
	规则示例:LJ001:设定用户的日交易额为500,超过日交易额的用户,禁止当日所有的交易

4、批量计算型规则:需要对用户以往的交易行为进行批量统计的规则
	规则示例:LJ002:同一个手机号,三日内支付次数超过10次,支付总金额不超过100元,禁止支付12小时

5、复杂事件型规则:需要对用户以往行为组合甄别的规则
   规则示例:LG002:同一个用户,在一天内,连续登录失败5次,则锁定账号,3天内禁止登录
   

2、规则引擎

a、什么是规则引擎?为什么要用规则引擎?
简单来看,规则引擎就是将一段字符串当作一段逻辑运行

使用规则引擎,能够将数据的准备和处理过程分离解耦
	简单的规则引擎:Aviator表达式引擎
b、Drools规则引擎?

官网
中文网

1、drools基础使用
1.pom引入四个依赖
2.resources下写test.drl规则文件
3.java类调用规则文件启动规则引擎
//1、pom依赖
<dependencies>
        <!--drools-->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <!--kie knowledge is everything-->
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-ci</artifactId>
            <version>6.5.0.Final</version>
        </dependency>
        <dependency>
            <!--lombok-->
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
    </dependencies>
//2、test.drl规则文件

/**
	package xxx.xxx.xxx        所在包名,需要与主运行类一致KnowledgeBase
	import xxx.xxx.xxx         跟java类似,规则中引入的类 Student
	globals xxx.xxx.xxx        全局对象,用于处理多个配置文件中都需要定义的相同对象
	function                  定义一些处理函数,基本跟java类似
	queries                    定义一些查询方法
	rule                       规则
 

 rule就是三大块中得规则体,以rule开头,以end结尾,每个规则文件可以包含多个rule。规则体分为三个部分,LHS RHS 属性三大部分
    LHS, LeftHand Side, 指的是条件部分 
    RHS, RightHnad Size,指的是then后面的部分
*/

//包名
package com.test
import com.test.Student

rule "rule1"
 salience 1   //优先级  越大越早执行(2比1早执行)
    when
        $student:Student(age>10)     //这里叫 LHS
    then
        System.out.println("age>10岁的人:" + $student.getName());  //这里叫 RHS
    end


rule "rule2"
 salience 2   //优先级
    when
        $student:Student(gender=="男",age>10)  //这里就是 LHS
    then
        System.out.println("性别为男,age>10岁的人:" + $student.getName());
    end



//3、主运行类调用规则文件启动规则引擎

import org.drools.core.io.impl.ClassPathResource;
import org.kie.api.io.ResourceType;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.runtime.StatefulKnowledgeSession;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class TestDrools2 {
    public static void main(String[] args) {
        //1、获取规则配置文件
        KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        knowledgeBuilder.add(new ClassPathResource("test.drl"), ResourceType.DRL);
        Collection<KnowledgePackage> collection = knowledgeBuilder.getKnowledgePackages();
        KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
        knowledgeBase.addKnowledgePackages(collection);
        //2、获取引擎
        StatefulKnowledgeSession statefulKnowledgeSession = knowledgeBase.newStatefulKnowledgeSession();
        //3、引擎根据规则运行
        List<Student> students = getStudent();
        for (Student student : students) {
            statefulKnowledgeSession.insert(student);
        }
        statefulKnowledgeSession.fireAllRules();
        statefulKnowledgeSession.dispose();
        System.out.println("结束...");

    }

    private static List<Student> getStudent() {
        List<Student> students = new ArrayList<Student>();
        students.add(new Student("张三", 13, "男", new BigDecimal(13)));
        students.add(new Student("李四", 14, "男", new BigDecimal(14)));
        students.add(new Student("王五", 15, "男", new BigDecimal(15)));
        students.add(new Student("赵六", 16, "女", new BigDecimal(16)));
        return students;
    }
}
2、drools高级使用 (规则文件test.drl从maven私服读取)
从maven私服加载规则文件
StatefulSessionStatelessfulSession的使用以及区别。
基于Kie组件动态更新Maven仓库中的规则文件。

四、统一存储服务

数据量小,访问也不会太频繁的元数据                   mysql:事务控制比较好
数据量小,业务价值比较高的数据(计算出来的数据)         redis
数据量大,业务价值相对比较低的数据,大而全             hbase、clickHouse、es


1、数据层封装(对各种连接的封装):
	drisk-common-service项目———connector包
		与各种数据源的交互如:DataBaseRedisKafkaHbaseHTTP
	
	
     
     
2、统一服务封装
	drisk-common-service项目——services包

在这里插入图片描述

五、网络协议层封装(netty)

drisk-realtime-server

 启动类也顺带启动netty服务

六、实时风控引擎整体流程

drisk-realtime-server

在这里插入代码片

七、Drools

Drools官网 https://www.drools.org/

最后、看完这个项目,延伸思考

1、如果不想用netty,如何构建微服务体系?
	 构建message对象,直接丢给engine调用engine的方法,在网络协议层封装里面
	 
2、如果不想用Drools,如何引入新的规则引擎
3、如何保证规则与数据是同步的
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘然生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值