3. 灰度发布架构设计:整体架构图、灰度网关层、规则引擎层、数据存储层、监控告警层
风控数据质量规则的灰度发布并非单一模块的变更,而是一套分层解耦、流量可控、可观测的架构体系。本节从四层架构出发,阐述每一层的职责、关键组件与交互关系,确保规则从“小流量验证”到“全量上线”的路径清晰、可回滚、可审计。
3.1 整体架构图
灰度发布架构采用“流量接入 → 规则路由 → 数据持久 → 观测反馈”的线性分层模型。各层通过标准接口通信,降低耦合度,便于独立扩缩容与灰度策略调整。
架构要点: 四层之间通过异步消息或轻量 RPC 通信,灰度网关层负责流量切分,规则引擎层专注策略计算,数据存储层保证可回溯,监控告警层提供决策依据。任何一层出现问题,均可通过灰度标签快速回退。
3.2 灰度网关层
灰度网关层是流量的“第一道关卡”,负责识别请求来源、注入灰度标签、按策略分发流量。该层通常部署在业务接入层与规则引擎之间,对业务无侵入。
| 组件 | 职责 | 技术选型参考 |
|---|---|---|
| 流量识别器 | 解析请求头、用户 ID、设备指纹等,提取灰度因子 | Nginx Lua / OpenResty / 自定义 Filter |
| 灰度标签管理器 | 根据灰度策略生成标签(如 canary:true),注入请求上下文 | Redis + 本地缓存 / 配置中心 |
| 路由分发器 | 将带标签的请求转发至对应规则引擎集群 | Kong / Spring Cloud Gateway / Envoy |
| 降级熔断器 | 当灰度集群异常时,自动切换至基线集群 | Hystrix / Sentinel / 自研熔断 |
灰度标签设计示例: 采用 JSON 格式,包含灰度版本号、规则集 ID、流量百分比、过期时间。网关层仅做透传,不解析规则内容,保持轻量。
{
"gray_version": "v2.3.1",
"rule_set_id": "rs_20250301",
"traffic_percent": 5,
"expire_at": "2025-03-15T23:59:59Z"
}
3.3 规则引擎层
规则引擎层是灰度发布的核心计算单元。它接收网关层转发的请求,根据灰度标签加载对应版本的规则集,执行数据质量校验,并输出评分与明细。
- 规则版本管理: 每个规则集维护多个版本(基线版、灰度版),支持热加载与版本回滚。
- 灰度策略执行: 根据标签中的
gray_version选择规则版本;若标签缺失或过期,自动降级至基线版。 - 质量评分引擎: 对每条数据记录计算完整性、准确性、一致性、时效性等维度得分,输出
quality_score。 - 结果标记: 在输出结果中增加
gray_trace字段,记录本次执行使用的规则版本与灰度策略,便于下游分析。
注意: 规则引擎层必须支持“无状态”部署,灰度标签与规则版本信息通过请求上下文传递,避免依赖本地文件或数据库中的灰度配置,防止因配置不一致导致灰度范围失控。
3.4 数据存储层
数据存储层负责持久化规则配置、灰度快照、执行结果明细,为后续的监控分析、问题回溯、灰度效果评估提供数据基础。
| 存储类型 | 存储内容 | 选型建议 |
|---|---|---|
| 规则配置库 | 规则定义、版本元数据、灰度策略配置 | MySQL / PostgreSQL + 配置中心 |
| 灰度快照库 | 每次灰度发布的规则快照、流量比例、时间窗口 | Elasticsearch / MongoDB |
| 结果明细库 | 每条数据的质量评分、灰度标签、执行时间 | ClickHouse / HBase(时序场景) |
| 指标时序库 | 规则执行耗时、通过率、异常率等聚合指标 | Prometheus + Thanos / VictoriaMetrics |
存储策略: 灰度快照库建议保留最近 30 天的快照数据,结果明细库按天分区,保留 7 天用于实时分析,历史数据归档至冷存储。指标时序库保留原始数据 15 天,聚合数据保留 90 天。
3.5 监控告警层
监控告警层是灰度发布的“眼睛”和“手”,负责实时采集各层指标、检测异常、触发告警,并通过看板展示灰度进展与质量对比。
监控告警层的关键指标分为三类:
- 流量指标: 灰度流量占比、基线/灰度请求量对比、灰度标签缺失率。
- 质量指标: 灰度规则通过率、质量评分分布、规则执行耗时 P99。
- 异常指标: 规则执行错误数、灰度集群超时率、数据存储写入失败率。
告警规则示例: 当灰度规则的通过率低于基线版本 5% 以上,且持续时间超过 2 分钟,触发 P1 级告警,自动暂停灰度流量并通知值班人员。
# Prometheus 告警规则片段
- alert: GrayQualityDrop
expr: |
(rate(gray_rule_pass_count[2m]) / rate(gray_rule_total_count[2m]))
- (rate(baseline_rule_pass_count[2m]) / rate(baseline_rule_total_count[2m]))
< -0.05
for: 2m
labels:
severity: critical
annotations:
summary: "灰度规则通过率低于基线 5%"
description: "灰度版本 {{ $labels.gray_version }} 通过率下降,请立即检查。"
灰度看板设计建议: 在 Grafana 中创建“灰度对比视图”,左侧展示基线指标,右侧展示灰度指标,中间用差值曲线展示偏离程度。同时增加“灰度进度条”,实时显示当前灰度流量百分比与剩余时间。