如何设计 Twitter/Feed 系统? ✅
答案
一、概览
面向读多写少的社交 Feed,采用 PUSH/PULL/Hybrid 投喂策略 + 多级缓存与流式计算,处理 KOL 冲击与热点扩散,保障 <200ms
读取延迟与高可用。
二、目标与指标(SLO)
- 读取延迟 P95 < 200ms;P99 < 400ms。
- 投喂命中率 ≥ 99%;缓存命中率 ≥ 95%。
- KOL 发布风暴写放大可控,整体可用性 99.95%。
三、总体架构
四、投喂策略
- PUSH:非 KOL 用户采用写时扇出,提前填充
user_id:timeline
缓存;写入限速与批量合并。 - PULL:KOL/热点走读时聚合,从热门池与关注列表增量拉取并归并排序。
- Hybrid:PUSH 非 KOL + PULL KOL,首读预热 + 背景补齐,避免极端写放大。
五、数据与缓存
- 关系索引双写:
follower_id->followee_id
与followee_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 流式投喂