如何使用RedisGears和RedisBloom构建欺诈检测系统

作者:萨钦·科塔拉托迪,Ajeet辛格莱

想象一下,你的广告产生了大量的流量,但你没有从广告支出中看到预期的结果。这可能不是巧合欺诈者经常试图通过各种复杂的机制窃取数字广告营销预算。假点击会让人觉得是真用户在参与广告,但事实上,当这些假点击推动安装时,安装成本会落到欺诈者的口袋里。随着公司愿意在数字广告上增加支出,广告市场上的欺诈者数量也在增加。

欺诈检测

这篇博文将演示实时欺诈检测如何工作的简化用例,以便您了解如何保持领先于欺诈者。

以下是我们使用的:

  • 基于Python的欺诈检测模块,执行两种欺诈检查:IP黑名单和点击垃圾邮件
  • IP黑名单使用来自RedisBloom包的Redis Cuckoo Filter。
  • 单击垃圾邮件使用Redis排序集。
  • 然后将数据推送到RediStream,RedisGears使用该数据进行处理
  • RedisTimeSeries得到更新,Grafana的Redis数据源显示仪表板

欺诈检测

步骤1:安装Docker#

你可以跟着https://docs.docker.com/get-docker/以便在本地系统上安装Docker。

第二步:准备好Redis#

您需要在本地计算机上启动并运行Redis服务器。您可以使用下面的CLI启动带有RedisGears的Redis服务器。

$docker run-d-p 6379 :6379 redislabs/redismod

该命令将从redis docker repo中提取映像,并使用所有必需的模块启动redis服务器,日志结束如下。

步骤3:克隆存储库#

$ git 克隆https://github.com/redis-developer/redis-datasets.git

步骤4:构建和运行Docker容器#

将目录更改为欺诈检测

$ 光盘 redis数据集/用例/欺诈检测

代码出现在用例/欺诈检测中。该应用程序被必要的包(包括redis模块的客户端包)dockerized。

使用以下命令创建图像:

$ docker build -t redis-fraud:latest .

使用以下命令创建容器:

$docker run-e REDIS_主机 = “主机> <” - e REDIS_港 = 6379 - p 5000 :5000-d redis欺诈

您将获得容器Id,该Id可用于跟踪应用程序日志。

$docker日志-f<容器id>

如果您使用redismod映像在本地运行Redis,请提供主机的IP(而不是localhost或127.0.0.1)。

步骤5:验证应用程序#

让我们看看在这个项目中如何管理连接。

进口 操作系统
进口 雷迪斯
重新开花 . 客户 进口 客户端
单体装饰器 进口 独生子女
@独生子女
RedisConn :
def __init__ ( 自我 ) :
宿主 = 操作系统 . getenv ( “REDIS_主机” )
港口 = 操作系统 . getenv ( “REDIS_端口” )
如果 宿主 港口 :
提高 异常 ( “未提供Redis主机或端口。请在docker run命令中以env形式提供主机和端口” )
港口 = int ( 港口 )
自我 . redis_client = 雷迪斯 . 复述, ( 宿主 = 宿主 , 港口 = 港口 )
自我 . 布鲁姆客户 = 客户端 ( 宿主 = 宿主 , 港口 = 港口 )
def 雷迪斯 ( 自我 ) :
返回 自我 . redis_client
def 布鲁姆 ( 自我 ) :
返回 自我 . 布鲁姆客户

在第2行中,我们为package导入redis包。所有的Redis核心命令都可以在这个Redis包中找到。

在第4行中,我们导入redisbloom包。由于RedisBloom是一个模块,因此用于与该模块交互的客户端也不同。下面我们将看到更多这样的例子。singleton_decorator确保只创建此连接类的一个实例,并且使用os包读取环境变量以形成连接。

现在让我们来看看我们如何使用Redis来解决点击垃圾邮件和IP欺诈。

要点:https://gist.github.com/Sachin-Kottarathodi/c3a0647d3fdd0fe8a76425e0594e11c5

def 知识产权欺诈 ( 自我 , 数据 ) :
存在 = RedisConn ( ) . 布鲁姆 ( ) . cfExists ( 常量 . 布谷鸟过滤器名称 , 数据 [ “知识产权” ] )
如果 存在 :
数据 [ “欺诈类型” ] = 常量 . IP_黑名单
数据 [ “地位” ] = 常量 . 欺诈
返回 存在
def 单击“垃圾邮件” ( 自我 , 数据 ) :
是垃圾邮件吗 = 假的
计数 = RedisConn ( ) . 雷迪斯 ( ) . zcount ( 数据 . 得到 ( “设备id” ) , 数据 [ “ts” ] - 自我 . 单击\u秒中的\u垃圾邮件\u窗口\u , 数据 [ “ts” ] )
如果 计数 >= 自我 . 单击\u垃圾邮件\u阈值 :
是垃圾邮件吗 = 真正的
数据 [ “欺诈类型” ] = 常量 . CLICK_SPAM
数据 [ “地位” ] = 常量 . 欺诈
返回 是垃圾邮件吗
def 出版 ( 自我 , 数据 ) :
RedisConn ( ) . 雷迪斯 ( ) . xadd ( 常量 . 流名称 , 数据 , 身份证件 = ‘*’ )

在上面的代码中,布谷鸟过滤器用于查找列入黑名单的IP欺诈。布谷鸟过滤器是一种概率数据结构,是模块RedisBloom的一部分。使用bloom客户端提供的cfExists方法检查布谷鸟过滤器中是否存在IP。请注意,布谷鸟过滤器可能返回误报。要配置错误率,可以使用cf.reserve命令创建过滤器,并提供自定义存储桶大小。

为了识别点击垃圾邮件,我们使用redis包中提供的排序集的zcount方法。使用zcount,我们可以在某个预先配置的窗口中查找设备的点击次数。如果接收到的计数大于某个阈值,我们将其识别为异常。

最后,使用xadd命令将数据推送到Redistream。id=“*”表示Redistream为我们的消息生成唯一id。

定位齿轮:#

当应用程序出现时,会注册一个gear,它会对我们用来推送数据的流做出反应。

要点:https://gist.github.com/Sachin-Kottarathodi/f9dac7a3342a3643e792e2143a6adf7d

从gearsclient导入GearsRemoteBuilder作为GearsBuilder
从redistimeseries。客户端导入客户端
def stream_handler(项):
data =项目(“价值”)
member=json.dumps(
{“device_id”:数据(“device_id”),
“事务id”:数据[“事务id”],
“ts”:数据['ts'],
})
redis.Redis () .zadd (data.get(“device_id”),{成员:数据(' ts ']})
Client().incrby(数据['fraud_type',],1)
GearsBuilder(reader='StreamReader',r=redis\u conn,requirements=[“redis”,“redistemeries”])。foreach(stream\u handler)。register('data\u stream'))

如前所述,由于RedisGears和RedisTimeSeries是模块,我们需要使用它们各自包中提供的客户端。

我们使用GearsRemoteBuilder类来构建Gear。StreamReader确保对来自流的每个新消息都执行stream_handler函数。stream_处理程序使用zadd将数据添加到排序集(此信息在zcount中用于识别click_垃圾邮件),并使用RedisTimeSeries模块的incrby增加清除和欺诈类型的时间序列计数,该模块稍后用于可视化。

欺诈检测

还可以在RedisInsight上检查档位登记。

最后,我们合并了flask应用程序,它公开了触发器的端点。

要点:https://gist.github.com/Sachin-Kottarathodi/2a6cccb29b4a9fdc7d58086af07aa6eb

瓶子 进口 , 请求
fraud_checks 进口 欺诈支票
设置 进口 安装程序
应用程序 = ( __名字__ )
@app . 路线 ( '/' , 方法 = [ “职位” ] )
def check_fraud ( ) :
试一试 :
响应 = 欺诈支票 ( ) . check_fraud ( 请求 . get_json ( ) )
代码 = 200
除了 异常 作为 E :
打印 ( “发生错误” , E )
响应 = str ( E )
代码 = 500
返回 响应 , 代码
如果 __名字__ == “__main__ ' :
安装程序 ( ) . 初始化 ( )
应用程序 . ( 港口 = 5000 , 调试 = 假的 , 宿主 = '0.0.0.0' )

这里,应用程序在端口5000上公开。在启动服务器之前,调用我们的init安装方法来注册设备。端点调用进行欺诈检查并返回响应的函数。

该应用程序是用python编写的,并公开了一个接受一些参数的端点。使用以下命令调用应用程序:

$ 卷曲 --请帖 “localhost: 5000” --标题 “application / json内容类型: --原始数据 '{
“device_id”:“111-000-000”,
“ip”:“1.1.1.1”,
“transaction_id”:“3 e4fad5fs”}’
清洁

由于布谷鸟过滤器最初没有数据可用,所有ip将被允许通过。如果需要添加数据到Cuckoo Filter,请使用cli连接到Redis并执行命令

cf.addnx ip\u cf 1.1 .1.1

再次使用此IP运行post命令。这一次,结果将是ip_黑名单。

欺诈检测

单击“垃圾邮件”:#

该应用程序被配置为允许同一设备在10秒内发生两个事件。要进行验证,请在10秒内发出两个以上的curl请求,结果将是单击“垃圾邮件”.

欺诈检测

可选:可以在“docker run”命令期间配置以下变量-e单击垃圾邮件阈值=3-e单击垃圾邮件窗口\u秒=10

步骤6:部署Grafana#

看到在格拉法纳策划的欺诈侦查活动令人兴奋。要实现此功能,请运行以下命令:

$docker run-d-e “GF_安装_插件=redis应用程序” - p 3000 :3000格拉法纳/格拉法纳

将浏览器指向https://:3000。

欺诈检测

以“admin”身份登录,密码为“admin”,首次登录后可重新设置密码。

欺诈检测

单击左侧面板(配置)上的齿轮图标并选择数据源。

欺诈检测

选择“添加数据源”。

欺诈检测

搜索Redis并选择Redis数据源。

欺诈检测

从中复制并粘贴原始json内容在这里在“通过面板json导入”框中。点击加载。

欺诈检测

这将创建一个“欺诈统计”仪表盘。如果在导入仪表板时出现错误,请尝试更改仪表板的名称和UUID。

欺诈检测

欺诈检测

结论和今后的工作#

  • 如果我们考虑从欺诈检查开始的整个流程,从事件流到数据处理再到可视化(使用insight),所有这些都需要多个组件和广泛的编排。而在Redis生态系统中,大部分问题都被解决了。
  • 这只是对事件进行更多检查的开始。许多其他检查可以使用模块和数据结构来完成。例如Redis提供基于排序集构建的地理空间数据结构。由于纬度和经度可以使用IP到位置转换提供程序从IP派生,因此可以对事件是否具有欺诈性进行深入了解。
  • 要完全拒绝服务请求,可以使用redis cell模块根据密钥对请求进行速率限制。
  • RedisAI和neural-redis可以提高基于欺诈的识别效率。

参考资料和链接#

Baidu