跳到主要内容

如何设计 Twitter/Feed 系统? ✅

答案

一、概览

面向读多写少的社交 Feed,采用 PUSH/PULL/Hybrid 投喂策略 + 多级缓存与流式计算,处理 KOL 冲击与热点扩散,保障 <200ms 读取延迟与高可用。

二、目标与指标(SLO)

  1. 读取延迟 P95 < 200ms;P99 < 400ms。
  2. 投喂命中率 ≥ 99%;缓存命中率 ≥ 95%。
  3. KOL 发布风暴写放大可控,整体可用性 99.95%。

三、总体架构

四、投喂策略

  • PUSH:非 KOL 用户采用写时扇出,提前填充 user_id:timeline 缓存;写入限速与批量合并。
  • PULL:KOL/热点走读时聚合,从热门池与关注列表增量拉取并归并排序。
  • Hybrid:PUSH 非 KOL + PULL KOL,首读预热 + 背景补齐,避免极端写放大。

五、数据与缓存

  • 关系索引双写:follower_id->followee_idfollowee_id->follower_id,通过 CDC → 流任务保持最终一致。
  • 时间线缓存:Redis List/ZSet;键:timeline:{uid};值:post_id 与时间戳;使用版本号/游标避免重复与乱序。
  • 热点集合:TopK/Count-Min Sketch;KOL 帖子进入热门池,加速 PULL 聚合。

六、读写路径优化

  • 写入:贴源落盘 + 异步投喂;幂等键(post_id + 分片),失败重试与死信队列。
  • 读取:本地缓存 → Redis → 降级直查;合并分页游标,预取下一页。
  • 排序:时间优先 + 互动度加权;A/B 调权重策略。

七、可用性与降级

  • 限流熔断:用户级/接口级令牌桶;热点保护(热点分片/隔离)。
  • 降级:仅时间排序/隐藏富交互;回源保护与读写隔离;媒体走 CDN。

八、可观测

  • 指标:投喂成功率、缓存命中率、回源比例、KOL 发布写放大、P95/P99 延迟。
  • 追踪:消息链路 ID,投喂失败重试率;错序/重复率与纠错处理量。

九、规模与容量规划

  • DAU:目标 10M;关注关系平均 100。
  • 读 QPS:峰值 ~3k;写 QPS:峰值 ~1k(按发布频率 2 次/日估算)。
  • 存储:平均 200B/帖(含元数据);10 年量级 ~10TB,可按用户维度分片。
  • 分区策略:关系/帖子按 user_id 哈希分片,时间线缓存独立集群,热点分片隔离。

面试官视角:

  • 关注热点/KOL 冲击、缓存一致性、重试与幂等;跨区多活与时序一致性
  • 指标:P99 延迟、投喂成功率、缓存命中率、写放大与成本;降级策略

延伸阅读:

  • Fanout on write vs read、Timeline 年代记设计经验
  • Redis 设计与应用、Kafka/Flink 流式投喂