SWE / Platform · First Phone System Design

Snowflake 云服务 Metrics 系统:接入、基数控制、查询与告警

Phone 面经明确要求设计云服务指标系统;本文用训练负载推导采集、聚合、保留、告警与高基数防护。

题目重点:Phone 面经明确要求设计云服务指标系统;本文用训练负载推导采集、聚合、保留、告警与高基数防护。

题意与假设

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

  • 训练版采集 counter/gauge/histogram,标签含 tenant/service/region/instance,样本使用 event time;服务支持近实时 dashboard、范围查询与告警。
  • 设 50 万实例,每实例 200 条活跃时序、每 10 秒一个样本,约每秒 1,000 万样本;保留原始 7 天、分钟聚合 90 天。这只是估算场景。
  • 同一 series+timestamp 重试写应可去重;高基数任意 userId/requestId 不能直接当指标标签,应转日志或 trace。

解题路线

  1. Agent/SDK 本地聚合短窗口并批量发送,入口验证 schema、租户配额和标签长度,将样本按 tenant+series hash 分区写 durable log;传输重试附批次 ID。
  2. 流处理器按 event time 聚合 counter rate、histogram bucket 与分钟 rollup,处理迟到样本的修正窗口;raw 与 rollup 分不同保留层。
  3. 时序索引由 metricName+规范化标签集合生成 seriesId,查询计划先过滤标签再扫描时间块;热 series 分片写入后查询合并,避免单一实例的热点。
  4. 高基数预算在接入时测量每租户新增 series 数,超限拒绝或抽样,并给可解释诊断;不要靠压缩算法替代基数控制。
  5. 告警规则在流上增量计算并持久化评估状态,使用持续时间、抖动抑制、静默和缺失数据策略;通知发送需去重与重试。
  6. 设计 SLO 时同时量测接入延迟、样本丢失率、查询 p99、基数、告警时延与误报;故障回放从 durable log 重建聚合。

手动走一遍

service=api、region=us-east 的 request_count 每 10 秒上报。入口按 seriesId 分片,1 分钟窗口求每秒速率并保留 rollup;告警规则要求 5 分钟 error_rate>2%。若 20 秒后补到迟到错误样本,窗口允许修正并重新评估,但通知用 alert fingerprint 防重复。

规模与取舍

训练假设下 50 万×200/10≈1,000 万样本/秒;若每样本连标签与索引平均 100B,原始写入约 1GB/s、每天 86.4TB 未压缩,必须量化聚合、压缩和保留成本。查询成本随匹配 series 数 S 与时间块数 B 增长,不能只报 O(1)。

易错点与追问

容易失分的边界

  • 把 userId 放进指标标签导致 series 爆炸。
  • counter 直接对两个绝对值平均,而不是算增量并处理重启归零。
  • 用处理时间替代事件时间又不交代迟到数据。
  • 只设计写入,忽略范围查询、rollup 与长期保留费用。
  • 告警每个采样点直接发通知,造成抖动和风暴。

继续深挖

  • 直方图分位数怎样合并,为什么不能平均各节点 p99?
  • 跨区域链路断开后,样本回补与重复去重怎样做?
  • 多租户 noisy neighbor 如何限流但保住关键指标?
  • 日志/trace 与 metrics 的关联如何实现?
✓已复制微信号!