风控系统就该这么设计(万能通用),那是相当稳定

news2024/9/27 17:27:10
  • 一、背景

    • 1.为什么要做风控?

    • 2.为什么要自己写风控?

    • 3.其它要求

  • 二、思路

    • 1.风控规则的实现

    • 2.调用方式的实现

  • 三、具体实现

    • 1.风控计数规则实现

    • 2.注解的实现

  • 四、测试一下

    • 1.写法

    • 2.Debug看看

一、背景

1.为什么要做风控?

 

这不得拜产品大佬所赐,我们的业务目前广泛使用了各种人工智能能力,如OCR识别、语音测评等。这些先进的能力往往需要大量资金和资源来支持,因此我们在产品层面也希望对用户的使用次数进行一定的限制。为了保护我们的业务和客户,风控措施是必不可少的。我们还在不断努力研究和开发新的AI技术,以提高我们的能力和服务质量,同时也在积极寻求更多的资金和资源,以满足业务的不断发展和扩张。我们坚信,只有不断创新和努力,才能为客户提供更好的服务和体验,同时也为我们的企业带来更大的发展和成功。 

2.为什么要自己写风控?

那么多开源的风控组件,为什么还要写呢?是不是想重复发明轮子呀.

 

要想回答这个问题,需要先解释下我们业务需要用到的风控(简称业务风控),与开源常见的风控(简称普通风控)有何区别: 

因此,直接使用开源的普通风控,一般情况下是无法满足需求的

3.其它要求 

支持实时调整限制

很多限制值在首次设置的时候,基本上都是拍定的一个值,后续需要调整的可能性是比较大的,因此可调整并实时生效是必须的

 

二、思路 

要实现一个简单的业务风控组件,要做什么工作呢?

1.风控规则的实现

a.需要实现的规则:

  • 自然日计数

  • 自然小时计数

  • 自然日+自然小时计数

自然日+自然小时计数 这里并不能单纯地串联两个判断,因为如果自然日的判定通过,而自然小时的判定不通过的时候,需要回退,自然日跟自然小时都不能计入本次调用!

b.计数方式的选择:

目前能想到的会有:

  • mysql+db事务 持久化、记录可溯源、实现起来比较麻烦,稍微“重”了一点

  • redis+lua 实现简单,redis的可执行lua脚本的特性也能满足对“事务”的要求

  • mysql/redis+分布式事务 需要上锁,实现复杂,能做到比较精确的计数,也就是真正等到代码块执行成功之后,再去操作计数

目前没有很精确技术的要求,代价太大,也没有持久化的需求,因此选用 redis+lua 即可

2.调用方式的实现

a.常见的做法 先定义一个通用的入口

 

在service中调用该方法 

在编写代码的过程中,我们时常会寻求更优雅的实现方式。对于传入的 content 参数,由于它与业务有关,因此我们需要使用 SpEL(Spring Expression Language)来将参数构建成相应的 content。但是我们可以考虑使用注解的方式来实现,这样可以更好地将参数与业务逻辑分离开。当然,这种做法也有一些争议,需要根据具体情况来决定是否使用。

 

三、具体实现

1.风控计数规则实现

a.自然日/自然小时

自然日/自然小时可以共用一套lua脚本,因为它们只有key不同,脚本如下:

 

在这个函数中,KEYS[1] 是与日/小时相关的键,ARGV[1] 是上限值,ARGV[2] 是过期时间。该函数返回当前计数值加 1 后的结果。如果已经达到上限,则实际上不会计数。通过该函数,我们可以轻松地跟踪某个特定时间段内的操作次数。例如,我们可以使用这个函数来记录我们网站的每日或每小时访问量,以便更好地了解网站流量的变化趋势。

b.自然日+自然小时 如前文提到的,两个的结合实际上并不是单纯的拼凑,需要处理回退逻辑

在此代码中,KEYS[1]是由天生成的关联密钥,KEYS[2]是由小时生成的关联密钥。ARGV[1]表示天的最大值,ARGV[2]表示小时的最大值,ARGV[3]表示天的过期时间,ARGV[4]表示小时的过期时间。函数返回与上述代码相同的值。

需要注意的是,虽然上述代码粗略地表达了其意图,但是可以进一步完善以增强其可读性。具体而言,当两个条件判断中有一个未能满足时,另一个条件也需要回滚。因此,可以进一步解释该代码的逻辑,并增加注释以使其更易于理解。

2.注解的实现 

a.定义一个@Detect注解

 

其中content是需要经过表达式解析出来的,所以接受的是个String

b.定义@Detect注解的处理类

需要将参数放入到上下文中,并起名为arg1arg2....

四、测试一下

1.写法

使用注解之后的写法:

 


2.Debug看看 

 

  • 注解值获取成功

  • 表达式解析成功

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享:集群吞吐量以1抵5,车企MySQL八大痛点的解决方案

本文来自社区分享,仅限交流探讨。原文作者:李婵玲,某智能车企DBA。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 最近一年,我们完成了从MySQL到OceanBase的替代过程,既降低了架构复杂度…

PostgreSQL 基础知识:psql 入门

PostgreSQL 有一个单独的命令行工具psql,该工具已经使用了几十年,并且包含在任何 PostgreSQL 安装中。许多 PostgreSQL 的长期用户、开发人员和管理员都依赖它来帮助他们快速连接到数据库、检查模式和执行 SQL 查询。 了解如何安装和使用基本psql命令是…

【每日一题】

文章目录 C 技术点多边三角形剖分的最低得分(dp思路,选不选问题)移动石子到连续(思路) C 技术点 1. string类型使用find函数。 int index s.find(""); if (inde ! string:npos){ xx }2. transform函数&…

[代码随想录]二叉树

二叉树 文章目录 二叉树1. 二叉树的递归遍历144.前序遍历94.中序遍历145.后续遍历 *2.二叉树的迭代遍历145.前序遍历94.中序遍历145.后续遍历 3.统一二叉树迭代遍历144.前序遍历94.中序排序145.后序遍历 4.层序遍历102.二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右…

[Dev‘Life] Dubai工签指南

Dubai工作签证一般为两年有效期,主要流程为 PCR-TEST-REPORT(体检)劳动者通识培训(听课)申请ID (录制指纹/掌静脉) 前置查询:Dubai-ICA官网查看签证有效期 免费查询签证的状态,相关查询连接在此: https://…

与伙伴同行,Serverless 让创新触手可及

今天 Serverless 的方式真正意义上做到了云产品、云技术的开箱即用,企业和开发者不需要再关注底层的资源配置,更多地把精力放在业务系统的开发中。 4 月 26 日,在 2023 阿里云合作伙伴大会现场,阿里云智能 CTO 周靖人发表主题演讲…

XML解析(DOM4j)检索(Xpath)

XML在以后更多的是用来作为配置文件的。 一. 配置文件 什么是配置文件 用来保存程序在运行时需要的一些参数。 当配置信息比较复杂的时候&#xff0c;我们就可以用XML。 二. XML概述 三. XML的创建、语法规则 根标签就是写在最外面的标签。 <?xml version"1.0&quo…

【Unity3D小功能】Unity3D中实现Text显示版本功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在项目开发中&#xff0c;会遇到要控制版本的情况&#xff0c;…

Python基础篇

大家好&#xff0c;我是易安&#xff01; Python语言比起C、Java等主流语言&#xff0c;语法更简洁&#xff0c;也更接近英语&#xff0c;对编程世界的新人还是很友好的&#xff0c;这也是其显著优点。最近总有人问我Python相关的问题&#xff0c;这些问题也偏基础&#xff0c;…

Qt绘图类

Qt绘图类 QPainter绘图1&#xff0e;QPainter与QPaintDevice2&#xff0e;paintEvent事件和绘图区3&#xff0e;QPainter绘图的主要属性4&#xff0e;创建实例 QPen的主要功能1&#xff0e;线条样式2&#xff0e;线条端点样式3. QBrush的主要功能4. 渐变填充 5 QPainter绘制…

Python小姿势 - Python连接MySQL数据库

Python连接MySQL数据库 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;&#xff0c;于1989年底圣诞节期间&#xff0c;为了打发无聊的圣诞节&#xff0c;决心开发一个新的脚本解释程序…

云表无代码开发平台,助力制造业练就数字化转型"硬功"

制造业作为国民经济的基础&#xff0c;也是我国的支柱产业&#xff0c;对我国经济发展具有重要意义。但随着近年来我国制造业转型升级步伐的加快&#xff0c;我国制造业在发展过程中也面临着许多困难和挑战。比如&#xff1a;企业生产设备老化、生产过程自动化程度低、产品质量…

Spark大数据处理讲课笔记3.3 掌握RDD分区

文章目录 零、本讲学习目标一、RRD分区&#xff08;一&#xff09;RDD分区概念&#xff08;二&#xff09;RDD分区作用 二、RDD分区数量&#xff08;一&#xff09;RDD分区原则&#xff08;二&#xff09;影响分区的因素&#xff08;三&#xff09;使用parallelize()方法创建RD…

【计算机视觉】Visual Transformer (ViT)模型结构以及原理解析

文章目录 一、简介二、Vision Transformer如何工作三、ViT模型架构四、ViT工作原理解析4.1 步骤1&#xff1a;将图片转换成patches序列4.2 步骤2&#xff1a;将patches铺平4.3 步骤3&#xff1a;添加Position embedding4.4 步骤4&#xff1a;添加class token4.5 步骤5&#xff…

数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

灰度变换在图像的单个像素上操作&#xff0c;主要以对比度和阈值处理为目的 空间滤波涉及改善性能的操作&#xff08;邻域操作&#xff09;&#xff0c;如通过图像中每一个像素的邻域处理来锐化图像 这两种方法均属于图像增强。 灰度变换 邻域基本增强变换定义数学表达三种基本…

QTableWidget表格控件的用法(非常详细)

QTableWidget表格控件的用法&#xff08;非常详细&#xff09; QTableWidget表格控件的用法&#xff08;非常详细&#xff09;QTableWidget详解1.常用API设置自动调整行高和列宽设置表格内容是否可编辑设置行表头、列表头是否显示 2.添加子项3.右键弹出菜单4.设置风格5.清空6.运…

LED灯内常见驱动电路

如今LED灯已成为照明的主流&#xff0c;使用白炽灯的家庭少之又少。其主要优势是LED灯更节能&#xff0c;相同光效的情况下&#xff0c;LED灯消耗的电能要比白炽灯减少70%以上。 LED灯的寿命比白炽灯要长&#xff0c;使用过白炽灯的人都知道&#xff0c;使用不了多长时间&…

简析Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等

首先得搞清楚&#xff0c;不同锁的作用对象不同。 下面分别是作用于临界区、CPU、内存、cache 的各种锁的归纳&#xff1a; 一、atomic原子变量/spinlock自旋锁 — —CPU 既然是锁CPU&#xff0c;那就都是针对多核处理器或多CPU处理器。单核的话&#xff0c;只有发生中断会使…

生成C++工程的UML类图和类继承关系图

简介 在进行软件开发时&#xff0c;了解代码结构和关系、类之间的继承关系以及类内部的成员函数和变量定义是非常重要的。为此&#xff0c;我们可以使用Doxygen和Graphviz工具来生成UML类图和类集成关系图。 Doxygen是一个用于从注释的C源代码中生成文档的工具&#xff0c;支…

day01刷题记录

刷题 题目一分析题解 题目二分析题解 题目一 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是…