SWE · System Design

Meta Instagram:媒体发布、关注Feed与权限变更

设计照片发布与关注流,将上传完成、帖子可见性、Feed分发和私密账户权限分开。

题目重点:设计照片发布与关注流,将上传完成、帖子可见性、Feed分发和私密账户权限分开。

题意与假设

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

  • 训练核心是照片/短视频上传、关注Feed、点赞评论和私密账户;推荐探索与直播暂需另问范围。实际规模没有给定,容量按参数计算。
  • 媒体上传完成不代表post已发布,Feed引用不是永久授权;私密账户/屏蔽/删除需要读时最终校验。

解题路线

  1. client先创建uploadSession拿受限上传地址,上传后hash校验/转码生成variants。createPost带requestId引用READY媒体,post record原子发布并写outbox,失败清理孤儿媒体,不创建半成品Feed卡片。
  2. post记录owner/caption/mediaIds/visibility/version,follow edge记录状态与时间;private follow需要accepted。likes以(user,post)唯一键支持幂等,计数异步读模型不能替代权限事实。
  3. 普通作者fanout-on-write向关注者Feed写post引用,超大关注作者可fanout-on-read混合;分页用稳定cursor与去重,拉流再查post当前可见性,删除/屏蔽不靠慢缓存失效保证。
  4. Feed初版按发布时序,若要ranking再引入候选排序并保留cursor session边界。热帖读缓存与CDN媒体分离;私密资源签名短期URL并约束权限,不能长期公开CDN路径。
  5. 更新visibility/删除发布tombstone和版本事件修复Feed索引,outbox可重放且consumer幂等。最终权限检查解决索引迟到;已下载副本无法承诺绝对回收,这是产品需明示的边界。

手动走一遍

A发图时upload已成功但转码失败,post保持draft不能进入Feed。A从公开改私密,旧Feed仍含postId时读API根据新visibility过滤;只从Feed缓存删除无法保证并发旧引用不泄露。

规模与取舍

发布写放大约posts×followers,混合fanout避免大V单帖爆炸。媒体容量约上传数×各分辨率bytes×保留期;Feed读延迟与转码等待独立量测,不把对象存储大小当元数据QPS。

易错点与追问

容易失分的边界

  • 上传地址无用户/session绑定会允许替换他人媒体。
  • 缓存Feed记录里完整权限结果长期使用,会泄露已转私密帖子。

继续深挖

  • 关注关系变化时是否补历史Feed?需要产品时间范围,否则回填成本无界。
  • 热门帖评论和点赞计数怎样分片并显示可接受的延迟?
✓已复制微信号!