实时风控系统技术选型与 Flink 架构设计

基于 Flink 构建兼顾实时性、准确性和可扩展性的风控系统,拆解实时特征计算、规则引擎和模型服务三层协同设计

袋鼠云
袋鼠云
央国企集团 经营分析

基于 Flink 构建实时风控系统的核心思路是用三层协同架构——实时特征计算层、规则引擎层和模型服务层——分别处理不同类型的风控判断逻辑,然后在统一的决策引擎中汇聚结果做出最终裁定。这种分层设计兼顾了实时性(毫秒级响应)、准确性(多种检测手段交叉验证)和可扩展性(规则和模型可以独立迭代)。

风控系统的三个时间窗口

在讨论技术选型之前,需要先明确风控系统在三个时间窗口上的不同要求。

事前预防: 在用户操作发生之前进行风险评估。例如,用户登录时检查设备指纹是否异常、IP 地理位置是否合理。这要求系统在 50 毫秒内返回风险评估结果,否则会严重影响用户体验。

事中阻断: 在用户操作进行中实时检测并阻断可疑行为。例如,一笔支付交易发起后,系统需要在 200 毫秒内完成特征计算、规则匹配和模型评分,决定是否放行。这是实时风控系统最核心的能力。

事后追溯: 在操作完成后进行批量分析,发现事前和事中未能识别的风险模式。例如,分析过去 24 小时内某个账户的所有交易行为,识别分步攻击模式。这允许更高的延迟(分钟到小时级),但需要更复杂的关联分析能力。

Flink 在这三个窗口中都可以发挥作用,但每一层的技术选型和架构设计有显著差异。

第一层:实时特征计算

实时特征计算是风控系统的基座——规则引擎和模型服务都依赖准确的实时特征作为输入。常见的实时特征包括:最近 5 分钟内的交易次数和金额、最近 1 小时内的登录失败次数、当前会话中设备切换次数、用户历史交易金额的统计分布偏差等。

Flink 在实时特征计算中的核心能力是窗口聚合和状态管理。

窗口聚合方面,Flink 支持三种主要窗口类型:

滚动窗口(Tumbling Window)适用于固定时间间隔的统计,如"最近 5 分钟的交易总额"。通过 TUMBLE(event_time, INTERVAL '5' MINUTE) 定义。

滑动窗口(Sliding Window)适用于需要重叠统计的场景,如"最近 1 小时内每 5 分钟的交易趋势"。通过 HOP(event_time, INTERVAL '5' MINUTE, INTERVAL '1' HOUR) 定义。

会话窗口(Session Window)适用于以用户行为间隔划分的场景,如"用户本次会话中的操作序列"。通过 SESSION(event_time, INTERVAL '30' MINUTE) 定义,用户 30 分钟无操作则会话结束。

状态管理方面,Flink 的 RocksDB 状态后端可以存储 TB 级的用户特征状态。一个典型的设计是:为每个用户维护一个 Keyed State,存储该用户的近期行为聚合值。当新的交易事件到达时,Flink 从状态中读取历史聚合值,与当前事件合并后更新状态,并将更新后的特征输出到下游。

一个关键的架构决策是特征存储的位置。 有两种主流方案:

方案一是将实时特征直接存储在 Flink 的内部状态中,通过 Queryable State 或异步 IO 在风控决策时实时查询。这种方案的优势是特征计算和查询在同一引擎内完成,延迟最低。劣势是 Flink 的 Queryable State 在大规模场景下的稳定性和性能仍在持续优化中。

方案二是将实时特征计算结果写入外部存储(如 Redis、HBase),风控决策时从外部存储查询特征。这种方案的优势是特征存储与计算解耦,查询接口更成熟稳定。劣势是增加了端到端延迟(网络往返通常增加 1-5 毫秒)和外部存储的运维负担。

生产环境中方案二更为常见。 Redis 作为特征存储的选择最多,因其单次查询延迟在亚毫秒级,且支持丰富的数据结构(如 Sorted Set 用于时间窗口内的事件列表)。

实时开发 StreamWorks

覆盖采集、开发、运维全链路的云原生一站式实时数据开发平台

了解产品

第二层:规则引擎

规则引擎负责执行业务专家定义的确定性风控规则。典型的规则包括:单笔交易金额超过 5 万元且为新收款方则阻断、同一设备 10 分钟内登录超过 3 个不同账号则标记、用户修改手机号后 24 小时内不允许大额转账等。

规则引擎的选型需要在灵活性和性能之间做出权衡。

方案一:Flink SQL 内嵌规则。 将风控规则直接编写为 Flink SQL 查询。例如:

SELECT user_id,
  CASE
    WHEN amount > 50000 AND is_new_payee = true THEN 'BLOCK'
    WHEN amount > 20000 AND login_fail_count_1h > 5 THEN 'REVIEW'
    ELSE 'PASS'
  END AS risk_decision
FROM enriched_transactions

这种方案的优势是规则执行与特征计算在同一管道中完成,无额外延迟。劣势是规则变更需要重新提交 Flink 作业,无法在运行时动态更新。适合规则变更频率低(周级别)的场景。

方案二:外部规则引擎(如 Drools、Easy Rules)。 在 Flink 作业中通过 Async IO 调用外部规则引擎服务。规则以配置文件或数据库表的形式存储,支持运行时热加载。这种方案的优势是规则变更无需重启 Flink 作业,业务人员可以通过管理界面修改规则。劣势是增加了网络调用延迟和外部服务的运维复杂度。

方案三:Flink + 自定义规则 DSL。 在 Flink 作业中内置一个轻量级规则解释器,将规则定义为 JSON 或 YAML 格式,通过 Flink 的动态管道更新机制(如 Flink SQL 的 ALTER TABLE 或 DataStream 的动态配置更新)实现规则热加载。这种方案兼顾了性能和灵活性,但需要自行开发和维护规则解释器。

规则引擎的另一个关键设计是规则的优先级和冲突解决。 当多条规则对同一笔交易给出不同判断时(如一条规则建议放行、另一条建议阻断),需要预定义优先级策略。常见的做法是"最严格优先"——只要有一条规则判定为阻断,最终结果就是阻断。

第三层:模型服务

模型服务负责执行基于机器学习的风险评分。与规则引擎的确定性判断不同,模型给出的是概率性的风险分数(如 0.0 到 1.0 之间的连续值),需要配合阈值才能做出决策。

模型与 Flink 的集成方式有两种主要模式。

同步模式: 在 Flink 作业中通过 Async IO 调用外部模型推理服务(如 TensorFlow Serving、Triton Inference Server)。Flink 发送特征向量到推理服务,等待返回风险分数,然后将分数与其他判断结果合并。这种模式的优势是架构简单,模型服务可以独立部署和扩展。劣势是网络调用增加了端到端延迟,且模型服务的可用性直接影响风控系统的可用性。

异步模式: 将模型推理集成到 Flink 作业内部(通过 UDF 或 Apache Flink ML)。模型以 ONNX 或 PMML 格式加载到 Flink 的 JVM 进程中,在 Flink 的计算线程内完成推理。这种模式消除了网络调用开销,但要求模型体积较小(通常小于 1GB),且无法利用 GPU 加速。

生产环境中的推荐做法是混合模式。 对于轻量级模型(如逻辑回归、小型梯度提升树),使用异步模式集成到 Flink 作业中,利用 CPU 推理满足延迟要求。对于重量级模型(如深度学习模型、大语言模型),使用同步模式调用 GPU 推理服务,利用 GPU 的并行计算能力处理复杂的模型推理。

三层协同的 Lambda 架构

完整的风控系统通常采用 Lambda 架构,将实时路径(Speed Layer)和批处理路径(Batch Layer)结合。

实时路径(Speed Layer): 由 Flink 集群承担。实时特征计算层从 Kafka 消费交易事件流,计算用户实时特征并写入 Redis。规则引擎层和模型服务层基于实时特征做出风险判断,结果写入决策日志。整个路径的端到端延迟控制在 200 毫秒以内。

批处理路径(Batch Layer): 由 Spark 或类似批处理引擎承担。每天或每小时对全量交易数据进行批量特征计算(如用户历史交易分布、社交网络关联分析),结果更新到特征存储中。批量特征用于离线模型训练和事后追溯分析。

两层的协同方式是: 实时路径使用最新的事件流计算短期特征(如近 5 分钟的交易行为),批处理路径计算长期特征(如近 30 天的交易模式)。风控决策时同时参考短期和长期特征,短期特征提供即时的风险信号,长期特征提供更稳定的基线对比。

金融行业

围绕监管报送、风险监测、客户经营与总分协同,统一数据口径和安全管控,让金融经营与风控有数可依。

了解解决方案

可扩展性设计

随着业务增长,风控系统面临三个扩展性挑战。

数据量增长: 交易事件量从每秒千级增长到万级甚至十万级。Flink 通过增加并行度(TaskManager 数量)线性扩展处理能力。需要注意的是,Keyed State 的状态规模与并行度无关——增加并行度可以提高吞吐量,但单个用户的特征状态大小不变。

规则复杂度增长: 规则数量从数十条增长到数百条。如果使用 Flink SQL 内嵌规则,规则复杂度的增长会导致 SQL 查询的复杂度上升,需要考虑将规则拆分为多个 Flink 作业,按业务域(支付风控、登录风控、营销风控)分别部署。

模型迭代速度增长: 模型从每月更新一次变为每周甚至每天更新。使用同步模式集成外部模型服务时,模型更新只需要更新推理服务中的模型文件,Flink 作业无需重启。使用异步模式时,模型更新需要重新提交 Flink 作业,此时应考虑使用 Savepoint 机制保证作业重启时不丢失状态。

常见故障模式和应对

特征计算延迟飙升。 当某个用户的行为突然暴增(如遭遇爬虫攻击),该用户的状态更新频率急剧上升,可能导致 Flink 作业的 Checkpoint 超时。应对方案是为高活跃用户设置采样率或限流,将异常行为的特征更新降采样后仍保持在可处理范围内。

规则引擎服务不可用。 如果风控规则依赖外部规则引擎服务,该服务的故障会阻断整个风控判断流程。应对方案是在 Flink 作业中实现降级逻辑——当规则引擎超时或不可用时,使用本地缓存的规则副本继续执行判断。

模型推理超时。 GPU 推理服务在高负载时可能出现响应延迟。在 Flink 的 Async IO 调用中需要设置合理的超时时间和重试策略,避免单个慢请求阻塞整个处理管道。建议超时时间设置为 50 毫秒,超时后直接跳过模型评分,仅基于规则引擎的结果做决策。

开启Data+AI 之旅

填写表单,获取专属解决方案

400-002-1024

工作日 9:00-18:00

关注公众号

获取最新产品动态与技术干货

关注公众号

企业微信

扫码添加企业微信