草庐IT

风控核心子域——名单服务构建及挑战

是咕咕鸡 2023-03-28 原文

引言

名单服务是风控架构中重要子域,对风险决策的性能、用户体验、成本管控、风险治理沉淀都有重要影响,本文将详细介绍名单服务设计思路和实现。

背景

什么是名单?

名单服务通常有几个部分组成:

风险类型

  • 黑名单:绝对会被拒绝的用户。大部分是历史数据清洗出来作弊或者破坏业务的用户,这部分用户对企业无价值且放之进入会破坏生态平衡
  • 灰名单:灰名单上的客户需要进一步审核。这部分用户可能存在某些风险,但是没有明确的证据表明他们是“黑”的
  • 白名单:这部分客户是正常用户,是企业数分人员基于历史表现清洗出来的合规高价值用户,可以直接放行

名单维度

  • 主键:手机号、用户 ID、身份证号、IP、设备标识、wifi MAC 地址等等
  • 业务域:全域、业务子域、细分领域等等,这边需要字典服务来枚举出需要管控的粒度和场景

时间维度
名单是有一定的生效期的,不同的行为会导致锁定期不一样,生效时间可以灵活设置

为什么需要名单服务?

  • 最易构建的决策能力:风控前期的构建是比较依赖名单决策的,策略数分人员通过历史数据判定哪些是“坏用户”,直接将其存储到名单库中,后续请求直接在第一道名单决策中踢出,而不需要执行后续策略在判定一次。策略相对名单来说是非常“重”的,且名单服务构建简单便捷,省时省力。
  • 性能考虑:名单判定一般是在决策流的第一道,试想,对企业服务来说,大部分用户其实都是正常的,如果每个用户的请求都过一遍策略,对成本是极大的浪费,同时对性能来说也是极大的挑战。此时名单服务通过白黑名单,将大部分用户直接决策出去,只对不明确的客户和有风险的客户来做决策,极大地减少了开销。

设计实现

名单服务的特点如下:

  • 名单数据来源:可以是实时产生、离线跑批生产、运营人员手动批量导入等等,形式多样
  • 性能足够好:属于决策流入口必过服务之一,即最大流量冲击,需要经得起峰值压力,RT 要足够小
  • 稳定性:高性能同时还需要高质量保证,如果名单服务出问题,后果不堪设想,流量全部流放到下游,可能会出现服务雪崩
  • 质量保证:任何名单添加到名单库中都需要重视,随意的添加可能会给企业带来难以想象的损失,所以得有完备的审核记录及添加原因,最重要的是生效时间的设定

整体名单服务的数据流图如下所示,重要节点会作明确说明:

实时链路名单查询设计

考虑到名单有时效性及性能要求,且名单数据结构整体简单(多维度,单个维度存储内容小),选择 Redis 存储名单数据非常适合快速查询,数据结构如下:

说明:

  • 采用 Redis Hash 结构存储数据
  • 为何不用 TTL 来存储过期时间?:一是 expire 最大过期时间不能超过 Integer.MAXVALUE 不能满足长时间的过期诉求;二来 Redis 本身定位是缓存,不是永久存储,即数据是可丢失的,需要自己保证服务的高可用

依赖于 Redis 集群良好的性能,基本能满足线上峰值高 QPS 查询需求,且 RT 能很好的控制在 10 ms 以内。如上所说就是要保障高稳定性需求,如何保障名单数据的高可用是首要问题。

高可用设计

Redis 本身定位是缓存,不能永久保存数据,且集群瘫痪或者数据部分缺失应对业务影响较小(能及时恢复的情况下,运维保障集群的可用性),如下是高可用数据设计架构:

说明:

  • T+1 Job 保证数据稳定:每天离线任务全量覆盖,从关系数据库 PG/MySQL 中抽数 push 到 Redis 中即可
  • Redis 集群出问题:不管是老集群重启还是更换到新集群,先用 RDB 恢复数据,保证线上可用,再立即执行离线任务做精确覆盖(T 日的数据丢失需要立即覆盖),考虑到读写同时进行可能会有问题,需要分集群切流

同时需要关注多线程问题,同一个维度,在同一时间可能存在批量更新情况,尤其是离线任务恢复时,历史数据会存在对一个维度多次更新问题,不考虑多线程问题可能会导致数据被篡改。

数据安全审计

名单库的风险点在于:随意地添加名单可能导致“坏用户”畅通无阻,“好用户”无法在进入业务流程

名单的生产来源及定性原因不明确,线上在排查问题时也只能干瞪眼,为了能回溯名单操作,需要做到如下几点:

  • 写日志:任何写动作需要追加日志,且需要做持久换存储,方便做名单时序数据分析
  • 黑名单 & 白名单需要审计:尤其是线上单独添加这种,必须指明原因且要对操作负责
  • 跑批任务审计:离线任务或者算法推数等需要控量,否则在迭代更新过程中出现 BUG 问题,导致名单数据猛增,后果不堪设想

异动监控

监控重中之重

能第一时间感知问题,监控的维度如下:

  • 决策层面监控:灰、白、黑名单决策数量监控
  • 元数据产出层面监控:任何名单猛增或猛跌都是需要去定性是否正常
  • 拉黑踢白:没有永久犯错的人,也没有永久的好人,名单之间的流动也需要关注

总结

名单服务在风控域中是最重要的子域之一,是风控流量的“网关”。名单库对整个风控决策的稳定性,性能提升起到决定性影响。

同时名单服务也是“高危”的,如果使用不当,可能会给企业良好用户带来困扰,给那些“黑产”敞开门户,需要做好数据审核及异动监控。

往期精彩

欢迎关注公众号:咕咕鸡技术专栏
个人技术博客:https://jifuwei.github.io/ >

若有收获,就点个赞吧

有关风控核心子域——名单服务构建及挑战的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  8. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  9. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  10. ruby - Rails 开发服务器、PDFKit 和多线程 - 2

    我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:

随机推荐