4、自动巡查系统架构设计:系统目标、整体架构图(数据层、计算层、告警层、展示层)、模块划分与职责
4.1 系统目标与设计原则
阈值漂移自动巡查系统的核心目标,是在信贷风控模型上线后,实现全量、高频、自动化的阈值稳定性监控,替代传统的人工巡检与被动响应模式。系统需满足以下关键设计原则:
- 实时性与周期性结合:支持分钟级实时数据接入与小时级/天级批量计算,确保漂移发现时效性。
- 可扩展性:模块化架构,支持新增监控指标、阈值规则、告警通道时无需重构核心逻辑。
- 低误报率:通过统计显著性检验与动态基线,过滤业务波动导致的假阳性告警。
- 可解释性:告警信息需附带漂移幅度、影响范围、历史趋势,辅助风控人员快速决策。
设计避坑: 初期切忌追求“全指标监控”。建议优先覆盖拒绝率、通过率、坏账率、评分分布KS值等核心业务指标,后续逐步扩展至次级特征与子客群。
4.2 整体架构图(四层结构)
系统采用经典的四层架构:数据层 → 计算层 → 告警层 → 展示层。各层职责清晰,数据流单向闭环,支持横向扩展。
4.3 模块划分与职责
基于四层架构,系统进一步拆分为8个核心模块,每个模块职责明确,接口标准化。
| 所属层级 | 模块名称 | 核心职责 | 关键技术选型 |
|---|---|---|---|
| 数据层 | 数据接入模块 | 对接风控决策引擎、贷后系统、第三方数据源,实时/离线拉取评分、特征、标签数据 | Kafka / Flume / DataX |
| 数据清洗与对齐模块 | 缺失值处理、异常值过滤、时间窗口对齐(如T+0实时 vs T+1离线)、客群标签统一 | Spark SQL / Flink CEP | |
| 计算层 | 统计检验引擎 | 计算PSI、KS、KL散度、卡方检验等统计量,判断分布是否发生显著漂移 | Python SciPy / Spark MLlib |
| 动态基线生成模块 | 基于历史窗口(7天/30天/90天)自动计算阈值基线,支持滑动窗口与季节性调整 | 时序分解(STL) / 指数加权移动平均 | |
| 告警层 | 规则引擎 | 配置告警规则(如PSI>0.1且持续2个周期),支持多条件组合与黑白名单 | Drools / 自研规则DSL |
| 告警聚合与降噪模块 | 合并重复告警、抑制抖动告警、按严重级别(P0/P1/P2)分级推送 | 滑动窗口去重 / 指数退避 | |
| 展示层 | 实时监控看板 | 展示各指标实时漂移状态、历史趋势、告警列表,支持下钻至特征/客群维度 | Grafana / Superset |
| 巡检报告模块 | 自动生成日/周/月巡检报告,包含漂移汇总、影响评估、处置建议 | Jinja2模板 + PDF生成 |
4.4 数据流与模块协作关系
下图展示了各模块之间的数据流转与协作关系,重点体现实时流与离线批处理的双链路融合。
4.5 关键模块设计要点
统计检验引擎设计要点:
- PSI计算:分箱数建议10~20,避免过细导致波动过大;对连续变量使用等频分箱,对离散变量使用自然分箱。
- KS检验:仅适用于评分卡等连续变量,需注意样本量差异较大时的p值失真问题。
- 动态基线:建议采用“7天短期基线 + 30天中期基线”双基线策略,短期基线用于快速发现突变,中期基线用于识别趋势性漂移。
告警层避坑指南:
- 避免“单点触发即告警”:建议设置持续周期数(如连续2个周期超阈值)或累计幅度条件。
- 告警分级必须与响应SLA绑定:P0(严重漂移)需15分钟内响应,P1(一般漂移)需2小时内响应,P2(轻微漂移)可日清。
- 告警消息必须包含漂移指标名称、当前值、阈值、历史趋势图链接、影响客群范围,减少人工排查成本。
4.6 模块部署与扩展建议
| 模块 | 推荐部署方式 | 扩展性说明 |
|---|---|---|
| 数据接入模块 | Kafka Consumer Group + Flink Job | 通过增加分区数提升吞吐量 |
| 统计检验引擎 | Spark Streaming 微批次(批次间隔5~15分钟) | 支持动态资源分配,高峰期自动扩容 |
| 动态基线生成 | 离线Spark任务(每天凌晨执行) | 基线存储于HBase/Redis,支持快速读取 |
| 规则引擎 | 独立微服务(无状态,可水平扩展) | 规则配置存储于MySQL/Etcd,支持热加载 |
| 告警聚合与降噪 | Redis + 定时任务(每分钟扫描) | 使用Redis有序集合实现滑动窗口去重 |
| 展示层 | Grafana + 自研API服务 | Grafana面板模板化,新增指标只需配置JSON |
架构演进建议: 初期可先实现“离线批计算 + 小时级巡检”模式,待数据量和实时性要求提升后,再逐步引入Flink实时计算链路。避免一开始就追求全实时,导致架构复杂度过高。