信息流(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,避免深分页问题
- 异步:发帖后先写入,后台异步推送给粉丝
- 去重:有的粉丝可能同时被推送又被拉取,需要合并去重
面试要点
必须提到推拉结合的混合模式。这是面试官最想听到的关键词。
评论
评论已关闭。