3. 哨兵告警系统架构:哨兵系统组件、数据采集层、规则引擎层、告警通知层

哨兵告警系统是回测坏账率监控的“神经中枢”。一个健壮的架构需要将数据采集、规则判定、通知分发三个核心环节解耦,确保在高频回测场景下不丢数据、不误报、不漏报。本章从组件划分、分层职责、交互流程三个维度拆解哨兵系统的标准架构。

3.1 哨兵系统核心组件

哨兵系统由以下五大组件构成,各组件独立部署、通过消息队列或API网关通信:

组件名称 职责 部署形态
数据采集器(Collector) 从回测引擎、数据库、日志流实时拉取坏账率指标 轻量级Agent / Sidecar
规则引擎(Rule Engine) 加载告警规则配置,对指标进行阈值比对、趋势分析、异常检测 无状态微服务集群
告警管理器(Alert Manager) 聚合、去重、降噪、路由告警事件 有状态服务 + Redis
通知分发器(Notifier) 将告警消息推送到钉钉、企微、邮件、短信等渠道 异步Worker池
配置中心(Config Center) 存储规则、阈值、通知模板,支持热更新 Etcd / Nacos
架构要点: 规则引擎与告警管理器分离,避免规则变更时影响告警聚合逻辑;配置中心统一管理阈值,支持灰度发布。

3.2 数据采集层

数据采集层负责从回测系统获取原始指标,并进行清洗、格式化、缓存。采集层需要处理三个关键问题:采集频率、数据完整性、异常标记。

  • 采集方式:支持推模式(回测引擎主动上报)和拉模式(哨兵定时轮询),生产环境推荐推+拉双通道。
  • 指标预处理:对坏账率进行滑动窗口平滑(如5分钟均值),过滤毛刺数据。
  • 元数据注入:为每条指标打上回测批次ID、策略版本、时间戳标签,便于规则引擎溯源。
# 数据采集层核心逻辑示例(伪代码)
class BadRateCollector:
    def __init__(self, window_size=300):
        self.window = deque(maxlen=window_size)
        self.cache = RedisCache()

    def ingest(self, raw_point: dict):
        # 1. 格式校验
        if not self._validate(raw_point):
            self._mark_as_invalid(raw_point)
            return
        # 2. 滑动窗口平滑
        self.window.append(raw_point['bad_rate'])
        smoothed = sum(self.window) / len(self.window)
        # 3. 写入缓存(TTL=60s)
        self.cache.setex(
            f"badrate:{raw_point['batch_id']}",
            60,
            json.dumps({'value': smoothed, 'ts': raw_point['timestamp']})
        )
避坑提示: 采集层不要做规则判断,只负责数据搬运和基础清洗;规则逻辑应全部下沉到规则引擎层,保持采集层轻量。

3.3 规则引擎层

规则引擎是哨兵系统的“大脑”,负责加载告警规则、执行阈值比对、输出告警事件。规则引擎的设计直接影响告警的准确性和响应速度。

3.3.1 规则类型

规则类型 触发条件 适用场景
静态阈值 坏账率 >= 固定值(如 5%) 硬性风控红线
动态基线 坏账率偏离历史同期均值 ±3σ 策略回测异常波动
趋势规则 连续N个周期坏账率单调递增 早期恶化预警
复合规则 静态阈值 + 趋势规则同时满足 减少误报,提升告警置信度

3.3.2 规则执行流程

  1. 规则加载:从配置中心拉取最新规则集,缓存到本地内存。
  2. 指标匹配:根据回测批次ID、策略标签路由到对应规则组。
  3. 阈值比对:依次执行静态阈值、动态基线、趋势规则。
  4. 事件生成:命中规则后,生成告警事件(含规则ID、当前值、阈值、触发时间)。
  5. 事件输出:将告警事件写入消息队列(Kafka / RocketMQ),供告警管理器消费。
规则引擎执行流程 ① 规则加载 ② 指标匹配 ③ 阈值比对 ④ 事件生成 ⑤ 事件输出 规则引擎关键设计 • 规则加载使用本地缓存 + 配置中心Watch机制,实现秒级热更新 • 阈值比对支持短路优化:静态阈值未命中时,跳过后续复杂规则

3.4 告警通知层

告警通知层负责将规则引擎产出的告警事件,经过聚合、去重、降噪后,通过多渠道推送给相关人员。通知层的设计目标是:不轰炸、不遗漏、可追溯。

3.4.1 告警聚合与降噪

  • 时间窗口聚合:相同规则在5分钟内只发一条通知,避免告警风暴。
  • 严重级别分级:P0(立即处理)、P1(需关注)、P2(记录归档),不同级别走不同通知渠道。
  • 抑制规则:如果上游策略已触发P0告警,下游关联规则自动抑制,减少重复通知。

3.4.2 通知渠道与模板

渠道 适用级别 响应时效 模板示例
钉钉/企微机器人 P0, P1 < 30秒 【哨兵告警】回测批次#B20241001 坏账率 5.8% 超过阈值 5.0%
短信 P0 < 2分钟 [哨兵] 坏账率告警:批次#B20241001 当前值5.8%
邮件 P1, P2 < 5分钟 包含详细趋势图、规则ID、历史对比数据
Webhook 所有级别 实时 JSON格式,供下游系统(如工单系统)消费
告警通知层架构 告警事件队列 聚合器 降噪器 分发器 钉钉/企微 短信 邮件 Webhook 通知层关键设计 • 聚合器:相同规则5分钟内只发1条,避免告警风暴 • 降噪器:P0告警触发后,自动抑制关联P1/P2告警

3.5 架构总览与交互时序

将数据采集层、规则引擎层、告警通知层串联起来,形成完整的哨兵告警系统架构。下图展示了从指标采集到通知触发的完整数据流:

核心交互时序:
1. Collector 从回测引擎拉取坏账率 → 写入 Redis 缓存
2. Rule Engine 定时从 Redis 拉取最新指标 → 执行规则比对
3. 命中规则后生成告警事件 → 写入 Kafka
4. Alert Manager 从 Kafka 消费事件 → 聚合/降噪 → 调用 Notifier
5. Notifier 根据级别选择渠道 → 推送钉钉/短信/邮件

整个架构采用异步解耦设计,每个组件都可以独立扩缩容。数据采集层和规则引擎层之间通过缓存解耦,规则引擎层和告警通知层之间通过消息队列解耦,确保任意一层故障不会导致整个系统瘫痪。