SWE · System Design

Meta WhatsApp Status:到期、受众与搜索权限

设计限时状态发布、观看与搜索,将权限与到期检查放到读时,避免搜索索引泄漏。

题目重点:设计限时状态发布、观看与搜索,将权限与到期检查放到读时,避免搜索索引泄漏。

题意与假设

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

  • 训练Status是可配置保留时间的临时图文/视频,本例24小时;实际是否24小时、受众名单发布时冻结还是实时变化需确认。
  • Status搜索范围默认只在调用者当前可见且未到期内容;如果要求E2EE,服务端明文全文搜索不可直接成立。

解题路线

  1. 发布记录statusId/owner/mediaRefs/text/createdAt/expireAt/audienceVersion/revision,媒体先READY再发布。接口publish(requestId)、listVisible、view、delete、search(query),所有接口验证owner或受众权限。
  2. 可见性函数统一检查未删除、serverNow<expireAt以及audience关系,list/search/detail都复用。TTL清理只是空间回收,不能等清理作业运行才隐藏已到期内容。
  3. 文本搜索可复用倒排索引AND/OR候选,但每个命中取权威记录再次鉴权/到期过滤。索引事件含revision,delete/expiry tombstone可异步删除,不让迟到旧更新复活。
  4. 观看记录(statusId,viewer)幂等,隐私设置控制owner是否可见已看名单;count不能作为所有身份的公开信息。离线看后上传应保留真实观看时间但到期后是否计数由合同定。
  5. CDN媒体访问用短期限凭证,撤销/到期策略与缓存一致。用户已下载副本不可保证远程抹掉,产品口径限制为服务端可见性而非绝对不可留存。

手动走一遍

状态t0发布、t0+24h到期,搜索索引清理迟了5分钟;读时仍必须隐藏。owner收紧受众后旧索引命中只能成为候选,detail授权失败不返回正文或缩略图。

规模与取舍

发布与受众fanout按好友规模放大,expiry队列按到期速率,索引空间按活Status文本量。索引可有界延迟,但权限和expiry检查需每次读取;用户看列表的读QPS通常高于发布QPS,分别估算。

易错点与追问

容易失分的边界

  • 索引文档里存旧audience然后直接返回,会泄露权限已变化状态。
  • TTL后台删除不是实时可见性判定。

继续深挖

  • 发布时受众快照与实时关系两种政策,删除好友后观看如何不同?
  • E2EE下客户端本地搜索、加密索引或限制搜索范围的取舍是什么?
✓已复制微信号!