设计 news feed 系统

什么是 news feed,news feed 是一个在你的个人主页中不断更新的故事列表, news feed 包括你在 Facebook 上关注的人、页面和小组发布的状态更新信息, 照片、视频、链接、应用活动和点赞。

理解问题

  1. 用户可以在news feed页面发布帖子,且能看到好友发布的帖子
  2. 假设一个用户可以有5000个好友
  3. 网络流量 1000万DAU
  4. 可以包含多媒体文件、图片、视频

高层级设计

  1. 发布feed:当用户发布一个帖子时,响应的数据被写入缓存和数据库,帖子被推送到她好友的news feed中
  2. 构建news feed:假设news feed是按时间倒序聚合好友的帖子而构建的

news feed API

POST /v1/me/feed 进行发布帖子,GET /v1/me/feed 用来获取 news feed

feed 的发布

帖子服务,将帖子持久化到数据库和缓存中。

广播服务,把新内容推送到好友的news feed中,news feed数据存储在缓存中以便快速获取。

通知服务,告知好友有新内容,并发送推送通知。

图11-2

news feed 的构建

news feed在幕后如何构建,高层级设计

图11-3

feed 发布详细设计

集中讨论 Web服务 和 广播服务

图11-4

Web 服务器与客户端通信外,进行 验证用户身份 和 限流,阻止发布垃圾信息和滥用内容很重要。

广播服务,广播是把一个帖子发给所有好友的过程,有两种模型:

写广播,在写入的时候就预先计算好用户发布的帖子被哪些好友订阅,用户在发新帖子立刻被传递 到好友的news feed缓存中。

读广播,直到读取的时候才生成news feed,这是一种按需模型,当用户加载主页 时再拉取最近的动态。

利用混合方案,快速获取news feed很重要,对大部分用户使用推送模型,对于名人或有很多好友 和粉丝的用户,让粉丝按需拉取新内容来避免系统过载。

news feed 获取流程

下面展示了获取 news feed 的详细流程,多媒体内容 图片、视频 等存在CDN中 以便快速获取。

图11-7

缓存架构

缓存对news feed系统很重要,把缓存分为5层

图11-8