系统设计面试:设计一个社交媒体的信息流(News Feed)

信息流(News Feed / Timeline)是社交媒体的核心,也是系统设计面试的经典题。

需求

  • 用户看到自己关注的人发的帖子
  • 按时间倒序排列
  • 支持图片和视频
  • 千万级 DAU

推模式 vs 拉模式

推模式(Fan-out on Write): - 用户发帖时,预先推送到所有粉丝的信息流里 - 读的时候直接从 Redis 拿,O(1) - 缺点:明星用户有上亿粉丝,写扩散成本巨大

拉模式(Fan-out on Read): - 用户查看信息流时,实时拉取所有关注的人的最新帖子 - 写操作简单 - 缺点:关注的人多了,读操作很慢

混合模式(实际用的方案)

  • 普通用户(粉丝少):用推模式,发帖时推送给粉丝
  • 大 V(粉丝多):用拉模式,粉丝查看时实时拉取
  • 最终结果合并:推的结果 + 拉的结果 → 排序 → 返回

存储设计

  • 帖子存储:MySQL 分库分表(按 user_id 分片)
  • 信息流缓存:Redis List(每个用户一个 Timeline,存储最近 1000 条)
  • 图片/视频:CDN + 对象存储
  • 热数据:最近 3 天的帖子在 Redis,更久的在 MySQL

核心优化

  • 分页:用游标(cursor)而不是 offset,避免深分页问题
  • 异步:发帖后先写入,后台异步推送给粉丝
  • 去重:有的粉丝可能同时被推送又被拉取,需要合并去重

面试要点

必须提到推拉结合的混合模式。这是面试官最想听到的关键词。

关于 Zihao Zhang

后端开发工程师。关注 Java/Spring Boot/Redis/MySQL 技术栈,分布式系统,OLAP 数据库,AI Agent 开发与应用。

评论

评论已关闭。