4. 实时PSI监测架构设计
实时PSI监测架构的核心目标是:在数据流经Flink作业的每一个窗口周期内,完成从数据接入、特征分箱、PSI计算到告警输出的全链路处理。本章将围绕整体架构图与模块划分展开,帮助您建立清晰的系统蓝图。
4.1 整体架构图
下图展示了实时PSI监测的端到端数据流。数据从上游消息队列进入Flink作业,经过四个核心模块处理后,最终将结果写入外部存储与告警系统。
架构要点: 数据流为单向管道,分箱与PSI计算模块共享同一个窗口生命周期,避免重复触发。告警输出与Sink并行写入,互不阻塞。
4.2 模块划分
整个Flink作业按职责划分为四个独立模块,每个模块可单独调优与扩展。下表总结了各模块的核心功能与关键技术点:
| 模块名称 | 核心职责 | 关键技术点 | 输出数据 |
|---|---|---|---|
| 数据接入 | 从Kafka/Pulsar消费原始数据,完成解析、清洗与类型校验 | 反序列化器、侧输出流处理脏数据、Watermark分配 | 清洗后的DataStream<RowData> |
| 分箱计算 | 对连续特征进行离散化,生成分箱边界与频数统计 | 等频分箱、等距分箱、分位数近似计算、状态管理 | 分箱边界表 + 频数分布Map |
| PSI计算 | 对比当前窗口分布与基准分布,计算PSI指标 | 分布对齐、零频处理、对数计算、窗口聚合 | PSI指标DataStream<PSIResult> |
| 告警输出 | 根据PSI阈值判断是否告警,并将结果写入外部系统 | 阈值比较、告警去重、多Sink写入(MySQL + 告警平台) | 告警记录 + 持久化存储 |
4.3 模块间数据流与依赖关系
四个模块之间存在明确的数据依赖与协作关系,理解这些关系有助于合理设置并行度与状态TTL。
- 数据接入 → 分箱计算: 数据接入模块输出清洗后的结构化数据,分箱模块按特征字段进行离散化。两者之间通过
DataStream.keyBy(featureName)建立分区关系。 - 分箱计算 → PSI计算: 分箱模块输出每个窗口的频数分布Map,PSI计算模块读取该Map并与预加载的基准分布进行对比。基准分布通常从外部存储(如MySQL)中加载,作为
RichFlatMapFunction的广播状态。 - PSI计算 → 告警输出: PSI计算模块输出包含特征名、窗口时间、PSI值的结果对象。告警输出模块根据预设阈值(如0.1、0.25)判断严重等级,并写入不同的Sink。
设计建议: 分箱计算与PSI计算应使用相同的窗口类型(如TumblingEventTimeWindows),确保分布对比的时间对齐。建议将基准分布存储在Redis或MySQL中,并通过Flink的广播流定期更新。
4.4 模块内部处理流程
每个模块内部包含多个子步骤,下面以分箱计算模块为例,展示其内部处理流程:
4.5 模块间协作示例
以下代码片段展示了如何在Flink中串联四个模块,形成完整的PSI监测作业:
// 1. 数据接入
DataStream<RowData> sourceStream = env
.addSource(new KafkaSource<>())
.name("data-source");
// 2. 分箱计算
DataStream<Map<String, Long>> binningStream = sourceStream
.keyBy(row -> row.getField("feature_name"))
.window(TumblingEventTimeWindows.of(Time.hours(1)))
.aggregate(new BinningAggregate())
.name("binning-compute");
// 3. PSI计算
DataStream<PSIResult> psiStream = binningStream
.connect(broadcastStateDescriptor)
.process(new PSICalculationFunction())
.name("psi-calculation");
// 4. 告警输出
psiStream
.filter(result -> result.getPsi() > 0.1)
.addSink(new AlertSink())
.name("alert-output");
psiStream
.addSink(new MySQLSink())
.name("psi-storage");
注意事项: 分箱计算与PSI计算之间的状态依赖需要谨慎处理。如果基准分布更新频率较高,建议使用广播状态(BroadcastState)而非全局变量,避免因状态不一致导致PSI计算偏差。
4.6 架构设计总结
实时PSI监测架构的核心设计原则可归纳为以下三点:
- 模块解耦: 每个模块只关注单一职责,便于独立测试与调优。数据接入模块可单独调整并行度以应对流量高峰,分箱模块可独立升级分箱算法。
- 状态隔离: 分箱计算使用KeyedState存储每个特征的分箱边界,PSI计算使用BroadcastState存储基准分布,避免状态交叉污染。
- 可观测性: 每个模块输出中间指标(如数据接入TPS、分箱耗时、PSI值分布),便于通过Metrics系统监控作业健康状态。
架构收益: 采用上述架构后,某金融风控场景的PSI监测延迟从小时级降低到分钟级,告警准确率提升至95%以上,且支持100+特征的并行监测。