SWE · VO System Design

LinkedIn Feed 设计:读多写少的混合推拉与自己发帖即时可见

普通作者预推到收件箱,大 V 读时合并,解释异步削峰、排序重排、缓存和读写一致性。

题目重点:普通作者预推到收件箱,大 V 读时合并,解释异步削峰、排序重排、缓存和读写一致性。

题意与假设

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

  • 训练版题目描述正文和 inbox 引用分开存;用户可关注其他作者,读 Feed 按权限过滤。具体用户数/关注分布、隐私变更时限和排序模型由面试中询问。
  • 普通关注者允许秒级异步延迟,作者自己的新帖必须立即出现在自己的 Feed;这两个新鲜度要求不同。

解题路线

  1. 持久题目描述、关注关系和 inbox。普通作者发帖后写入内容表并发 fanout 事件,worker 分批把 post_id/基础分写入活跃关注者 inbox;写扩散换取读时低延迟。
  2. 大 V 关注者过多时不预推到每个人 inbox,读 Feed 时从关注的大 V 最近题目描述集合拉取,与 inbox 候选做去重、权限过滤和轻量重排;设阈值应看关注分布与粉丝活跃度,而非固定写死。
  3. inbox 仅保留最近若干候选,历史翻页从作者索引/冷层补拉;分页使用稳定排序键加 post_id 游标,实时重排要防翻页重复。
  4. 作者自己新帖通过写入后直接从作者题目描述表或自写通道合并,不能等待异步 fanout。异步队列持久化、幂等 fanout 和高水位记录可在重试时避免大量重复。
  5. 基础分写入时算,读时结合轻量实时特征重排;活跃用户 inbox 缓存,非活跃用户按需加载。删除/拉黑/权限变化即使 inbox 有旧引用,也须读时最终过滤并触发异步清理。

手动走一遍

普通作者有 500 个关注者,发布后队列分批写其 inbox,几秒内可见;大 V 有 500 万关注者,不发 500 万条 inbox 写,关注者打开 Feed 时拉其最近题目描述合并。作者本人刷新即从自己的 post 表看到新帖。

规模与取舍

普通作者单帖写放大约 O(F_active) inbox 引用,F_active 为活跃关注者;大 V 读时需合并其关注的热点作者候选,成本约 O(C log C) 排序 C 条候选或 Top K 堆 O(C log K)。存储约题目描述正文+inbox 引用总数,受保留窗口与粉丝分布影响;题目无量级数字,示例仅演示。

易错点与追问

容易失分的边界

  • 所有题目描述都全量推给所有粉丝,大 V 写爆。
  • 所有题目描述都读时拉取,读远多于写时读延迟失控。
  • 把 inbox 引用当权限真相,删除或屏蔽后仍展示。
  • 作者自己发帖仍等异步队列。
  • 分页键只用会变的实时分数,导致翻页重复/漏项。

继续深挖

  • 关注关系变化后如何补历史/删旧 inbox 引用?
  • 热点题目描述如何避免 fanout 队列积压?
  • 实时排序分改变时分页如何稳定?
  • 同一用户跨设备刷新怎样定义‘秒级可见’?
✓已复制微信号!