模块职责重定义:ANR采集层、分析层、上报层、告警层的职责边界划分

在原有 ANR 监控系统中,采集、分析、上报、告警四个环节往往耦合在同一个模块内,导致链路难以独立升级、故障半径大、拦截策略固化。本章将四层拆分为独立模块,明确每一层的输入、输出、信任边界与容错契约。目标是:采集层只做“源头抓取”,分析层只做“模式判定”,上报层只做“可靠传输”,告警层只做“分级触达”。任何跨层耦合都视为设计坏味,必须在架构评审中否决。

3.1 四层职责边界速览

层级输入核心职责输出依赖方向
采集层系统 Signal 信号 / Trace 帧 / Logcat原生信息收集、初步时间戳标定、缓冲去重原始 ANR 记录(JSON 序列化)→ 分析层(单向推送)
分析层原始 ANR 记录堆栈聚合、关键线程识别、主因分类(IO/死锁/LongMsg)结构化分析结果(含置信度评分)→ 上报层(单向推送)
上报层结构化分析结果批量压缩、重试、持久化(本地队列)、到后端服务鉴权成功/失败回调 + 丢弃统计→ 后端(网络)
告警层分析结果中的风险项 / 聚合阈值告警触发策略匹配、去重、分级通知(IM/Pager/Metric)告警事件 ID + 暂停控制→ 外部通知通道
边界核心原则:下层决不允许直接依赖上层的数据格式或调用上层接口。采集层与告警层之间没有任何直接通信链路。

3.2 数据流与控制流

数据流严格单向:采集 → 分析 → 上报 → 告警。每一层处理完即推送至下一层,不持有下游句柄。控制流则通过“健康探针 + 背压信号”逆向传递:上层模块仅向直接下层发送“暂停/恢复”指令,避免级联穿透。

  • 采集层→分析层:内存队列 + 回调;队列满时采集层主动丢弃最旧记录并打丢弃标记。
  • 分析层→上报层:Binder 回调(跨进程场景)或 LocalBroadcast(同进程);分析层不等待上报结果。
  • 上报层→分析层(控制):上报层使用独立的“限流 Channel”回传压缩预算或重试状态,分析层据此调整聚合窗口大小。

3.3 信任链路设计

四层之间并非完全信任,每层需对上游数据进行合法性校验,防止恶意数据或格式异常导致整链崩溃:

校验方向校验内容处理策略
分析层校验采集层时间戳单调性、JSON Schema 基础格式、必填字段非空格式错误:直接丢弃并计入“采集层脏数据”指标
上报层校验分析层主因分类是否在枚举范围内、置信度 [0, 1]非法值:降级为“Unknown”分类,不阻断上报
告警层校验上报层触发时间不得晚于当前时间 + 5s(容忍时钟偏差)时间异常:延迟 30s 再匹配,若仍异常则丢弃
风险点:采集层如果连续产生大量脏数据,分析层会频繁丢弃,导致“假分析延迟”表象。因此需在分析层增加脏数据占比仪表盘,当占比超过 5% 时自动拉高采集层的日志级别并触发研发告警。

3.4 选型权衡

  • 采集层框架:优先选择平台监听钩子(如 Android 的 AnrDataListener、Signal Catcher 线程)而非定期拉取;减少系统 API 调用频次。
  • 分析层模型:轻量决策树 vs. 离线训练模型。线上推荐使用决策树(if-else 堆栈特征匹配),避免 GPU 开销;离线可复跑深度学习做召回优化。
  • 上报层协议:HTTP/2 长连接 vs. gRPC Stream。高吞吐场景下建议 gRPC(自带压缩与流控),但需权衡客户端资源(内存 2~5 MB 额外开销)。
  • 告警层去重:滑动时间窗口布隆过滤器(内存 < 1 MB)比全量 hash 存储更适合移动端,误报率可接受在 1% 以内。

3.5 落地步骤与验收标准

  1. Step 1:定义层间共享的 protobuf 消息协议(AnrRecord、AnrAnalysis、UploadPayload),并生成 Java/Kotlin 桩代码。
  2. Step 2:采集层独立打包为 lib-anr-collector.aar,无分析/上报依赖。
  3. Step 3:分析层实现基于 protobuf 的 AnrAnalyzer 接口,不隐含工厂或 SPI 注入。
  4. Step 4:上报层与告警层分离为两个 Service/WorkManager 后台任务,分别拥有独立进程(Android 多进程场景)。
  5. Step 5:集成测试验证:在 mock 采集层注入各种畸形数据,检查分析层是否按校验规则丢弃;通过注入已知 ANR 场景验证分类召回率 > 90%。

验收标准:

  • 四层模块可单独升级而不影响其他层(接口兼容性由 protobuf 保证)。
  • 任意一层崩溃(如分析层 OOM)不导致采集或上报层挂死——靠独立进程 + 生命感知回调。
  • 数据流端到端延迟 ≤ 3s(从采集层收到信号到告警层触发)。
  • 脏数据丢弃不影响正常链路吞吐(分析层 QPS ≥ 500/s)。
ANR 四层职责边界与数据流 采集层 Signal / Trace / Logcat 分析层 堆栈聚合 / 主因分类 上报层 压缩 / 重试 / 持久化 告警层 策略匹配 / 去重 / 分级 暂停/恢复 信任链说明 每层对上游做格式/语义校验(如时间戳单调性、枚举合法性),脏数据丢弃并记录指标。 控制流(橙色虚线)仅允许直接下层向直接上层传递背压,禁止跨级干预。