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 规则执行流程
- 规则加载:从配置中心拉取最新规则集,缓存到本地内存。
- 指标匹配:根据回测批次ID、策略标签路由到对应规则组。
- 阈值比对:依次执行静态阈值、动态基线、趋势规则。
- 事件生成:命中规则后,生成告警事件(含规则ID、当前值、阈值、触发时间)。
- 事件输出:将告警事件写入消息队列(Kafka / RocketMQ),供告警管理器消费。
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格式,供下游系统(如工单系统)消费 |
3.5 架构总览与交互时序
将数据采集层、规则引擎层、告警通知层串联起来,形成完整的哨兵告警系统架构。下图展示了从指标采集到通知触发的完整数据流:
核心交互时序:
1. Collector 从回测引擎拉取坏账率 → 写入 Redis 缓存
2. Rule Engine 定时从 Redis 拉取最新指标 → 执行规则比对
3. 命中规则后生成告警事件 → 写入 Kafka
4. Alert Manager 从 Kafka 消费事件 → 聚合/降噪 → 调用 Notifier
5. Notifier 根据级别选择渠道 → 推送钉钉/短信/邮件
1. Collector 从回测引擎拉取坏账率 → 写入 Redis 缓存
2. Rule Engine 定时从 Redis 拉取最新指标 → 执行规则比对
3. 命中规则后生成告警事件 → 写入 Kafka
4. Alert Manager 从 Kafka 消费事件 → 聚合/降噪 → 调用 Notifier
5. Notifier 根据级别选择渠道 → 推送钉钉/短信/邮件
整个架构采用异步解耦设计,每个组件都可以独立扩缩容。数据采集层和规则引擎层之间通过缓存解耦,规则引擎层和告警通知层之间通过消息队列解耦,确保任意一层故障不会导致整个系统瘫痪。