SDE / Infra 内部转组 · System Design

Amazon System Design:千万温度传感器与十秒粒度地图

估算十秒上报的吞吐和多年存储,分离最新温度、历史统计与地图瓦片,处理迟到、设备离线和长期成本。

题目重点:估算十秒上报的吞吐和多年存储,分离最新温度、历史统计与地图瓦片,处理迟到、设备离线和长期成本。

题意与假设

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

  • 训练合同每设备每十秒一条测量,温度为标量,位置相对固定;题目的十秒粒度并不保证设备每十秒成功上报。
  • 时间范围 current 解释为范围内最后一个有效测量值;若问现在温度,则读取 latest。min/max 是有效原始样本极值,非空间插值估计值。
  • 测量含 device_id、sequence、event_time、temperature、quality;实际协议与时间同步规则未公开,接口字段为设计假设。
  • 离线设备显示最后测量时间与 stale 状态,不能用零温度代替缺测。

解题路线

  1. 先估吞吐:100万设备每十秒一条约10万样本/秒,千万约100万/秒。以训练假设每条压缩后32字节估算,原始数据每天约276GB至2.76TB,全年约101TB至1PB,尚未计副本、索引、HTTP开销。容量讨论必须给单位与保留策略。
  2. HTTP 网关按设备身份鉴权、批量接收并限流;持久日志 ACK 后异步处理,按 device_id 分区使同设备顺序可控。设备重试依 device_id+sequence 去重,迟到上报用 event_time 排历史,不让旧事件覆盖 latest。
  3. 分离三层:设备/位置元数据,latest 状态 KV,按设备与时间组织的历史列式块。处理器同时更新 latest 和小时/天 min/max/count/last;跨层失败可以从日志重放,latest 的版本条件更新防乱序。
  4. 查询范围统计将完整小时/天桶的准确极值合并,边缘未对齐片段回读原始块;last 取事件时间最大的有效样本。只有保留桶内 last 的值与时间才能回答历史范围末值,平均温度不能还原极值。
  5. Web 不向浏览器发送千万设备每秒刷新。按缩放层级生成空间瓦片,缩小时按网格聚合极值/平均/有效数量并注明统计口径,放大后查询具体设备。地图颜色编码和 stale 覆盖层分开;千万点显然不能在约830万像素的4K屏逐点一一显示。
  6. 多年运行用冷热分层、压缩与保留合同控制成本;若删除原始数据,只承诺对保留桶边界的准确查询,不再假称任意十秒窗口准确。监控采样覆盖率、端到端新鲜度、迟到分布、队列积压和异常传感器,故障时保留最后值与年龄。

手动走一遍

训练例传感器 A 按 event_time 10:00:00=20℃、10:00:10=21℃上报,稍后重发第一条。latest 仍是21℃,两条历史样本只存各一次。查询10:00:05至10:00:15的 min/max/last 均为21℃;整点桶包含20℃,不能直接套整桶极值回答这个边缘范围。

规模与取舍

写入每样本 O(1) 的状态/桶更新,吞吐与保留量按设备数线性增长。查询跨 B 个聚合桶及 E 个边缘样本约 O(B+E),设备时间索引和缓存另计。地图带宽按可见瓦片与刷新率估,不按全体设备数直接推给客户端。

易错点与追问

容易失分的边界

  • 把采样十秒和 UI 十秒内必达混为硬 SLA。
  • 每次地图刷新全表扫描千万设备。
  • 只存平均值却承诺任意历史 min/max。
  • 离线显示0℃或不显示时间,误导用户。
  • 多年每十秒数据不计算副本、索引与冷热存储费用。

继续深挖

  • 设备时钟漂移五分钟,如何让用户理解数据新鲜度?
  • 一年任意起止十秒窗口须精确极值,保留策略怎么改?
  • 地域网络中断一天后补传,如何保护实时链路?
  • 低成本设备不支持批量上传时,HTTP连接开销如何控制?
✓已复制微信号!