SWE / Applied Scientist · System Design / OOD

Amazon Log Scanner:采集、检索与告警的不同路径

分开日志持久采集、按时间与关键词查询、持续告警,处理重试和高基数。

题目重点:分开日志持久采集、按时间与关键词查询、持续告警,处理重试和高基数。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 题目只给log scanner SD;练习支持按service/time及literal关键词查询,并独立订阅错误模式告警。实际parser、保留期、规模未给。
  • 日志可能含敏感字段,需要在采集侧按规则脱敏;字面查询与regex查询有不同索引和执行成本。

解题路线

  1. agent给每条eventId、eventTime、service、host和序号,批量送持久队列;本地buffer有上限及丢弃/背压策略。确认接受不等于索引已经可查,API区分ingested/indexed位点。
  2. 原日志按日期/service分区压缩对象存储,近窗索引支持倒排和时间过滤。先粗筛service/time再查关键词,避免所有历史日志全文扫;索引丢失可由原流重建。
  3. 告警是流式规则状态,不等于定期重跑整个搜索。按规则key维护阈值/窗口、迟到政策、告警去重和恢复状态;再用通知outbox处理重试。
  4. schema evolution和高基数标签受预算控制,不能把userId等所有字段都放metrics标签。查询分页保留snapshot/游标,避免新增日志使同页重复/漏行。

手动走一遍

agent发出batch后ACK丢失,重发同eventId不产生双日志和双告警。error在索引前已入流,可触发告警但尚不可检索,界面显示索引延迟;冷日志搜索按日期扫描明确有更高延迟。

规模与取舍

假设1TB原日志/日、热窗7天则原量7TB,索引/副本/压缩系数分开;平均写量约11.6MB/s,峰值另测。查询成本由候选posting与扫描字节决定,不是固定O(log N)。

易错点与追问

容易失分的边界

  • 把日志、metric与trace当同一schema存储。
  • 无界本地buffer让故障反过来撑爆应用磁盘。
  • 重复事件导致重复告警,没有恢复/抑制状态。

继续深挖

  • 如何支持跨行stacktrace拼接而不吞掉下一事件?
  • regex无倒排锚点时怎样限时、限范围或转冷查询?
✓已复制微信号!