零售信贷风控「决策引擎 + 特征平台」高并发低延迟架构实战

一、业务与性能目标

维度 目标值 备注
日均调用 1500 万 峰值 3 万 QPS
决策延迟 P99 ≤ 50 ms 含特征
系统可用性 99.99 % 全年故障 < 50 min
规则迭代 分钟级灰度 业务自助发布

二、总体架构图


总体架构图

核心组件:

决策引擎:规则/模型执行引擎

特征平台:统一特征计算

缓存层:Redis Cluster扛住90%+特征请求

实时计算:Flink流式特征加工


三、特征平台
3.1 数据分层

层级 技术 延迟 用途
热特征 Redis Cluster + 本地 Caffeine < 5 ms 实时规则、模型入参
温特征 HBase 5-30 ms 近 7 天滑动窗口
冷特征 Iceberg on OSS 分钟级 训练样本回溯

3.2 架构分层

层级 关键模块 技术要点与落地建议
接入层 多源数据管道 • Batch:Sqoop / DataX → Hive / Iceberg 近线宽表
• Stream:Kafka → Flink CEP / 双流 Join 做秒级特征
• 外部:征信、三方数据统一 API Gateway
加工层 特征工厂 • 低代码画布:拖拽算子(窗口聚合、图特征、Embedding)
• 特征市场:内置“7 日交易统计”“多头借贷”等模板一键复用
• 版本控制:Git-like 语法,每次变更生成 version_id,可秒级回滚
服务层 特征服务(Feature Service) • 在线:Redis + 自研 Feature-SDK(支持批量、管道化查询)
• 近线:Kafka Streams 计算结果直接落 Kafka Topic,供推理服务订阅
• 离线:Hive → Airflow 每日调度 → 训练样本

3.3 实时计算链路
Kafka → Flink CEP → Redis Sink

  • KeyBy(user_id) 保证状态局部性
  • 预计算“过去 30 分钟借款金额”等 200+ 实时指标
角色 场景 Flink 如何落地
实时特征计算引擎 • 滑动/滚动窗口统计(近 30 min 登录次数)
• 序列特征(最近 50 次点击物品 ID)
• 维度补全(user_id 关联画像)
• Kafka Source → Flink SQL CEP → Redis Sink(10 ms P99)
• "滑窗转固窗"优化:把 hopWindow 拆成 pane,State 缩小 80%,CPU 降 40%
• 流批一体:同一条 SQL 既能冷启动回溯(Batch),又能实时更新(Streaming)
样本拼接 & 冷启动 • 实时样本:show + click 双流 Join → Kafka → 训练集群
• 冷启动:先用 Flink-Batch 把历史补齐,再从零点启动流任务
• 统一 Catalog(Iceberg/Hive),保证 schema 完全一致
• Checkpoint + 两阶段提交,实现端到端 Exactly-Once

Flink 在特征平台负责“实时生产、流批一体、低延迟供给”,在决策引擎侧负责“规则/模型热计算、事件驱动编排”,两者通过“统一消息层 + 统一特征 SDK”实现毫秒级闭环。

• 决策引擎通过 统一 Feature-SDK 在 5-10 ms 内完成特征拉取;
• 若实时缺失,触发 Flink 回溯补数接口,100 ms 内返回补齐结果。

关键配置/代码片段
• 实时特征 SQL(示例)

CREATE TABLE pay_events (
  user_id STRING,
  amt DOUBLE,
  ts TIMESTAMP(3),
  WATERMARK FOR ts AS ts - INTERVAL '5' SECOND
) WITH ('connector'='kafka', ...);

INSERT INTO redis_sink
SELECT
  user_id,
  SUM(amt) OVER w AS total_amt_1h
FROM pay_events
WINDOW w AS (
  PARTITION BY user_id
  ORDER BY ts
  RANGE BETWEEN INTERVAL '1' HOUR PRECEDING AND CURRENT ROW
);

• 规则 CEP Pattern(示例)

Pattern<TransactionEvent, ?> pattern =
  Pattern.<TransactionEvent>begin("start")
         .where(evt -> evt.getType().equals("withdraw"))
         .timesOrMore(3)
         .within(Time.minutes(10));

Flink 在 特征平台 扮演“实时 ETL + 窗口计算 + 样本生成”的角色;
在 决策引擎 扮演“事件驱动 Worker + 规则热计算”的角色;
两者通过 统一消息总线(Kafka)和统一特征 SDK 实现毫秒级、低耦合、可灰度的协同闭环。


四、决策引擎
4.1 整体架构
• 流量入口:网关 → 风控决策服务集群(Spring Boot + Drools)
• 决策数据:统一特征平台(Redis Cluster + 本地 Caffeine 二级缓存)
• 规则热更新:规则中心(MySQL + Git + Jenkins)→ 消息队列(Kafka “rule-update” Topic)→ 各节点监听并 reload KieBase
• 异步落库:决策结果 → 消息队列(Kafka “risk-result” Topic)→ 风控结果库(MySQL 分库分表)
• 高可用:同城双活 + 跨城冷备,网关层用 Nginx + Keepalived,服务层用 Kubernetes HPA 自动伸缩

4.2 代码片段
特征 SDK(Java 代码片段):

FeatureReq req = FeatureReq.newBuilder()
        .setUserId(uid)
        .setEventTime(now)
        .addFeatureIds("f_30min_loan_amt")
        .build();
Map<String, FeatureValue> feats = FeatureSDK.get(req, 50, TimeUnit.MILLISECONDS);

Drools 规则示例:

rule "拒绝_30min_借款>1w"
when
    $u : User(userId == $uid)
    $f : Feature(fId == "f_30min_loan_amt", value > 10000)
then
    insert(new Decision("REJECT", "30min_loan_amt"));
end

4.3 Flink实时计算:

角色 场景 Flink 如何落地
规则/模型热计算节点 • 风控“7 日累计提现金额 > X 元”规则
• 实时欺诈检测(CEP 序列匹配)
• 把规则 DSL 翻译成 Flink SQL / CEP Pattern
• keyBy(rule_id+uid) → 状态后端(RocksDB) → 下游 Kafka Topic 供决策引擎订阅
决策流编排 Worker • Conductor 工作流的“实时特征节点”
• 需要毫秒级出参
• Flink Job 作为 Conductor 的一个 Task Worker,暴露 HTTP/gRPC 接口,返回计算好的特征 JSON,决策引擎直接调用

4.4 性能优化
• KieBase 预编译池:启动阶段加载 50 个常用规则包,减少首次编译 200 ms+。
• 使用 KieSession 池化(commons-pool2)+ ThreadLocal 避免频繁创建/销毁
• 把规则包拆成 feature-group.drl + rule-group.drl,减少 KieBase 大小,平均加载时间 <200 ms
• 短路求值:命中“拒绝”立即终止后续节点。
• 决策服务无状态:K8s HPA 水平扩展,单节点 2C4G 可扛 1.5k QPS。

4.5 灰度与回滚
• Canary ConfigMap:按客户白名单比例 5% → 20% → 100%。
• 回滚策略:版本号不一致或错误率>0.1% 时,5 s 内切回旧版本。

4.6 监控告警
• 延迟监控:Prometheus feature_latency_ms{quantile="0.99"} > 50 ms 即触发告警。
• 漂移监控:离线 vs 在线特征差异 > 1% 自动暂停新规则。


五、决策引擎和特征平台协同落地挑战

特征平台与决策引擎协同落地时,挑战集中在“实时性、一致性、可运维、可扩展”四条主线,可细化为 8 个高频痛点与对应的缓解思路:

主线 具体挑战 典型症状 缓解/解决方案
实时性 1. 毫秒级低延迟难以保证 特征查询 P99 从 30 ms 突然飙到 200 ms+,拖慢整个决策链路 • 在线缓存:Redis + 本地 Caffeine 二级缓存
• 热点特征预计算:Flink 预聚合 → Kafka → 决策引擎订阅
一致性 2. 离线训练 vs 在线推理特征漂移 线下 AUC 0.92,上线后掉到 0.78 • 统一特征逻辑:一份 DSL 同时生成批 & 流 SQL
• 时间对齐:所有特征返回 event_time,决策引擎拒绝过期数据
一致性 3. 特征版本 & 规则版本不同步 规则已上线,但新特征仍在灰度,导致空值异常 • 元数据中心统一版本号(feature_v2025.07.22)
• 蓝绿/金丝雀:决策引擎按白名单切流,失效自动回滚
可运维 4. 高并发压垮特征服务 大促或放量时 CPU 100%,最终熔断 • 限流+熔断:Sentinel / Hystrix 保护,失败率>5% 时降级使用缓存数据
• 异步批量:决策引擎一次批量 GetFeatures,减少 RTT
可运维 5. 缺乏可追溯的血缘与监控 线上特征异常,无法快速定位是上游数据源还是计算逻辑 • 血缘图谱:Airflow + OpenLineage
• 监控:Prometheus 指标(空值率、延迟、漂移)
可扩展 6. 新事件/新数据源接入周期长 新业务场景需要 2~3 周才能闭环 • 低代码画布:拖拽式配置解析器、字段映射、窗口算子
• 配置化 DSL:JSON + Jinja2 模板,支持秒级热更新
可扩展 7. 决策流节点增减导致入参变化 删除节点后决策流缺失变量,trace 直接 FAILED • 静态校验:CI 阶段扫描缺失变量
• 默认值兜底:特征平台对缺失特征返回 default + 告警
成本 8. 存储与计算成本随特征膨胀 90 天滚动窗口特征占用 TB 级内存 • TTL 自动淘汰 + 冷热分级(SSD→S3→Glacier)
• 特征重要性评估,下线低 ROI 特征

一句话总结:
“实时一致难、运维扩展贵”是两大核心矛盾;通过缓存+限流保实时、血缘+版本保一致、低代码+监控保运维、TTL+重要性评估控成本,才能持续放大特征平台与决策引擎的协同价值。


决策引擎和特征平台协同落地

六、落地时间线

周次 任务
1-2 搭建 Flink 实时链路 + Redis 缓存
3-4 决策引擎容器化 + 规则灰度
5-6 全链路压测(3w QPS)、熔断限流演练
7 上线监控、告警、SOP 文档
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容