系统架构设计:整体架构分层

做风控系统,我最怕什么?

怕的是业务方突然跑过来说:「刚才那笔交易有问题,帮我查查为什么没拦截?」然后你打开日志,发现数据链路断了,规则没跑起来,决策结果根本没生效。这种场景,我经历过不止一次。

所以,架构设计这件事,说白了就是给系统搭骨架。骨架稳了,后面怎么加肉都行。今天我们就来聊聊风控Agent实时监控与预警系统的整体架构分层。

为什么需要分层?

你想想看,一个实时风控系统,每天要处理几百万甚至上千万的事件。如果所有逻辑都揉在一起,改一个规则要重启整个服务,加一个数据源要改核心代码——那运维同学估计得天天加班。

我个人习惯,把系统拆成四个层次:

  • 数据采集层:负责把各种来源的数据「拽」进来
  • 规则引擎层:核心判断逻辑,决定「拦不拦」
  • 决策执行层:执行拦截、放行、人工审核等动作
  • 可视化层:让运营和风控人员看得见、摸得着

每一层各司其职,互不干扰。改规则不用动数据采集,加数据源不用动决策逻辑。嗯,这就是分层的价值。

核心原则:层与层之间通过标准接口通信,不要跨层调用。数据采集层不能直接调用决策执行层的API,必须经过规则引擎层。

整体架构图

我画了一张架构分层图,你可以直观感受一下各层之间的关系:

风控Agent实时监控与预警系统 - 架构分层 可视化层 实时大屏 | 预警看板 | 规则配置界面 | 日志查询 决策执行层 拦截 | 放行 | 人工审核 | 二次验证 | 降级策略 规则引擎层 规则匹配 | 评分卡 | 模型推理 | 策略编排 | 上下文管理 数据采集层 消息队列 | 日志采集 | API接入 | 数据库CDC | 第三方数据

这张图我画得比较简洁,但每一层背后的细节,咱们得一个一个拆开讲。

数据采集层:一切风控的起点

数据采集层,说白了就是系统的「耳朵」和「眼睛」。没有数据,规则引擎就是个空壳子。

我在项目中遇到过一个问题:业务方说「我们数据都推了,为什么规则没触发?」结果一查,数据格式不对,字段名大小写不一致,采集层直接丢弃了。嗯,这种坑踩过一次就记住了。

数据采集层要做什么?

  • 多源接入:HTTP API、消息队列(Kafka/RocketMQ)、日志文件、数据库变更捕获(CDC)
  • 数据清洗:去重、格式校验、字段映射、异常值处理
  • 数据标准化:把不同来源的数据转成统一的事件模型
  • 流量控制:限流、降级、背压处理,防止突发流量冲垮系统

我的经验:数据采集层一定要做「数据质量监控」。我曾经因为上游一个字段突然变成null,导致规则引擎空指针异常,整整半小时没拦截任何风险交易。从那以后,我强制要求采集层必须记录每条数据的质量评分。

数据采集层的核心组件

组件 职责 常用技术
接入网关 接收外部数据,做协议转换 Nginx、Spring Cloud Gateway
消息队列 缓冲、削峰、异步解耦 Kafka、RocketMQ
数据清洗管道 过滤脏数据,标准化字段 Flink、Spark Streaming
数据质量监控 检测数据完整性、时效性 自定义监控 + Prometheus

规则引擎层:风控的大脑

规则引擎层,是整个系统的核心。数据采集层把原料准备好了,规则引擎就要开始「思考」了。

我个人习惯把规则引擎拆成三个部分:

  • 规则仓库:存储所有规则定义,支持热加载
  • 规则匹配器:根据事件特征,快速命中匹配的规则
  • 评分计算器:执行规则逻辑,输出风险分数和决策建议

规则引擎的设计要点

这里有几个坑,我踩过,你注意一下:

避坑指南:我曾经把规则引擎的匹配逻辑写成了线性遍历,结果规则数量到了500条时,单次匹配耗时从2ms飙升到200ms。后来改成了Rete算法,才把性能拉回来。所以,规则引擎一定要用高效的匹配算法,别偷懒。

规则引擎的常见实现方式:

  • 表达式引擎:适合简单规则,如Aviator、MVEL
  • 规则引擎框架:适合复杂策略,如Drools、EasyRules
  • 自研规则引擎:适合高度定制化场景,我见过不少大厂走这条路
// 一个简单的规则示例(伪代码)
rule "高风险交易拦截"
when
  $event.transactionAmount > 10000
  and $event.userRiskLevel == "HIGH"
then
  $event.setDecision("REJECT")
  $event.setReason("单笔交易金额超限且用户风险等级高")
end

决策执行层:说到做到

规则引擎给出了决策建议,决策执行层就要「动手」了。

这一层其实很容易被忽视。很多人觉得「不就是调个接口嘛」,但实际没那么简单。

决策执行层要处理的事情

  • 动作执行:拦截交易、发送告警、触发二次验证、记录日志
  • 幂等处理:同一个事件不能被重复执行,尤其是拦截操作
  • 降级策略:如果下游系统挂了,怎么办?是放行还是拒绝?
  • 异步回调:有些动作需要等待外部系统确认,比如银行扣款结果

关键设计:决策执行层必须支持「补偿机制」。我记得有一次,我们拦截了一笔交易,但下游银行系统没收到通知,结果钱还是扣了。后来我们加了「执行确认+定时补偿」的机制,才彻底解决这个问题。

可视化层:让数据说话

可视化层,是给业务方和运营人员看的。你架构再牛,规则再准,如果别人看不懂,那也没用。

我见过太多风控系统,后台全是表格和数字,运营同学根本不知道怎么看。所以,可视化层一定要做到「一眼看懂」。

可视化层包含什么?

  • 实时监控大屏:展示当前系统吞吐量、拦截率、告警数量
  • 预警看板:展示高风险事件、异常趋势、需要人工介入的列表
  • 规则配置界面:让运营人员可以可视化地调整规则,不用写代码
  • 日志查询:支持按事件ID、用户ID、时间范围快速检索

我的建议:可视化层不要只展示「结果」,还要展示「过程」。比如一个交易被拦截了,要能展示它经过了哪些规则、每个规则的得分是多少。这样运营人员才能知道「为什么拦」,而不是「被拦了」。我吃过这个亏,被业务方追着问了一下午。

各层之间的协作关系

最后,我简单总结一下各层是怎么配合的:

  1. 数据采集层收到一笔交易事件,清洗后发给规则引擎
  2. 规则引擎层根据规则和模型,计算出风险分数和决策建议
  3. 决策执行层根据决策建议,执行拦截、放行或人工审核
  4. 可视化层把整个过程的数据和结果展示出来

每一层都独立部署,通过消息队列或RPC通信。这样即使某一层挂了,其他层还能继续工作。嗯,这就是高可用的基础。

好了,架构分层就聊到这里。下一节我们会深入规则引擎的细节,讲讲规则是怎么匹配的、评分卡是怎么设计的。到时候再细聊。

专注资料整理