Engineering Manager / Data · Panel API System Design

Apple 手机 App 数据采集 API:离线重试、批量上传与隐私

定义客户端事件批上报契约、服务端接收语义、去重键和功耗/网络预算。

题目重点:定义客户端事件批上报契约、服务端接收语义、去重键和功耗/网络预算。

题意与假设

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

  • 训练版为匿名或用户已同意的应用使用事件采集,不采集消息正文、定位等敏感数据;实际合法字段与保留策略必须按产品规定。
  • 客户端可离线且请求可能重试,服务端提供 batch ingest,响应的是持久接收而非最终分析完成。

解题路线

  1. 接口可设计 `POST /v1/events:batch`,请求包含 app_version、schema_version、batch_id 与每条 event_id、occurred_at、event_type、允许的 properties;服务端返回已接受/拒绝条目及可重试原因。
  2. 客户端本地有有界队列和批量阈值,遇网络/电量受限延后上传;退出同意后停止采集并按政策处理待上传数据。限制单批大小与重试次数,指数退避加 jitter。
  3. 服务端校验身份/设备令牌、schema、时间偏差、大小和速率,先写可靠队列再确认;以 event_id/producer_scope 做去重,避免请求重发重复计数。
  4. 端到端留事件时间和接收时间;跨版本解析与坏事件隔离,远端配置采样时也保证重要错误类事件可观察。事件属性白名单、最小化保留与访问控制优先于‘先全收再说’。

手动走一遍

App 在地铁离线时累计 20 条允许采集的事件,回网后一个 batch 上传。第一次响应丢失,客户端重试相同 batch_id/event_id;服务器可重复回应接收成功,但下游每个 event_id 只入指标一次。

规模与取舍

带宽约为事件平均字节数 × 有效事件率,加上 batch/header 开销;离线本地缓存空间由最大事件数、单条上限与保留时长共同约束。题目无设备量,不能给固定 QPS。

易错点与追问

容易失分的边界

  • API 返回 200 就声称所有指标处理完成。
  • 无 event_id,离线重发重复计数。
  • 逐事件单请求造成电池和网络开销过高。
  • 无限本地队列吞掉设备存储。
  • 把用户文本或敏感属性装入任意 properties。

继续深挖

  • 部分事件无效时整个 batch 失败还是部分接受?
  • 客户端时钟严重不准,事件时间如何处理?
  • 采样后怎样估计总体指标和置信区间?
  • 用户撤回同意后本地和服务端数据怎样处理?
✓已复制微信号!