Instagram Feed 是一个用于分享和联系对您而言重要的人和事的平台。 当您打开 Instagram 或刷新动态时,我们认为您会感兴趣的照片和视频将显示在顶部。
新闻提要是包含由系统中其他实体创建的文本、图像或视频的项目集合,供您阅读。 它总是在变化,而其他组织正在发布新的帖子。
在这篇文章中,我们将仔细研究 Instagram 的 feed 的系统设计。 那么,让我们开始吧。
1。 要求
功能必要性
- 用户的新闻提要是根据用户关注或感兴趣的系统中其他实体的帖子创建的。
- 文字、图片和视频都可以在帖子中找到。
- 用户的新闻提要应使用其他人创建的新帖子进行更新。
非功能性标准
- 新闻提要的创建应实时进行。 最终用户应该只经历 12 秒的延迟。
- 添加新帖子:新帖子在提交到系统后出现在新闻提要请求中的时间不应超过 5 秒。
2. 容量估算
- 截至2021年7.8月,世界人口只有21亿。 它表明全球 32% 的人口是 Facebook DAU(每日活跃用户),XNUMX% 是 Facebook MAU(每月活跃用户)(每月活跃用户)。 这是惊人的。
- 让我们假设我们正在构建的系统有 1 亿个 DAU,以使事情变得更容易。
- 假设一个人在 Facebook 上关注了 500 个人或企业。 一个组或一个页面可能被视为一个实体。
预计流量
假设一位用户平均每天下载新闻提要 10 次。 所以每天大约有 116K QPS 和 1e10 个请求。
存储估计
假设我们在内存中平均维护 500 个来自每个用户的新闻提要的帖子以便快速检索,每个帖子的大小为 1KB。 因此,每个用户 500 KB,所有 DAU 500 TB,以及 5000 台计算机,每台具有 100 GB RAM。
3. 系统 API
userId (GUID):正在获取其新闻提要的用户。
可选选项参数中提供以下字段:
- afterPostId (GUID):从该帖子之后的帖子中获取新闻提要。 如果未指定,请获取最新帖子。
- count(number):每个请求可以返回的最大帖子数。 如果未提供,则后端设置默认的最大数量。
- excludeReplies(布尔值):防止回复包含在新闻提要中。
- 返回的 JSON 包含新闻提要项目的列表。
4. 设计数据库
实体
- 用户
- entityId、名称、描述和时间戳都是必填字段。
- 以下字段是必需的:PostId、标题、文本、authorId 和时间戳。
- 时间戳、url 和 mediaId
关系
- 用户可以关注其他用户或实体。 (m:n)
- Author-Post:用户和实体都可以创建帖子。 为简单起见,假设只有用户可以创建帖子。 (1:n;authorId 是可嵌入的)。
- 每个帖子都伴随着某种形式的媒体。 (1:n)
5. 高级设计
建筑
工作流程
饲料生产
当 Jay 请求她的新闻流时,系统将执行以下操作:
- 检索 Jay 关注的所有人和事物的 ID。
- 聚合帖子:给定这些 ID,获取最新、热门和相关的帖子。
- 根据帖子的相关性和时间对帖子进行排名。
- 缓存:保存创建的提要并将前 20 个帖子发送给 Jay。
- 当 Jay 读完前 20 个帖子时,会发送另一个请求以获取接下来的 20 个帖子。
饲料分配
假设 Jay 正在关注 Aayush,并且 Aayush 发布了任何新内容。 Jay 的新闻提要需要由系统更新:
- 检索 Aayush 的追随者的 ID。
- 添加新文章:将 Aayush 的帖子添加到这些 ID 的关注者的新闻源池中。
- 根据帖子的相关性和时间对帖子进行排名。
- 更新排名帖子的缓存。
- 发布新帖子时应通知关注者。
平台组件
用户的连接由 Web 服务器维护。
上述过程由应用服务器执行。
缓存和数据库:
- 关系数据库用户/实体
- 关系数据库(帖子)
- 图片/视频属性:Aayush storge
- 关系数据库元数据
个性化服务:
- 饲料生产
- 提要通知
6. 详细设计
饲料的产生
扇出读取幼稚实现:
这种草率实施的问题包括:
- 拥有大量朋友/追随者的用户会注意到显着放缓,因为我们必须筛选、合并和排名大量帖子。
- 当用户加载他们的页面时,我们构建了时间线。 这可能很缓慢并且有很多延迟。
- 每次状态更新都会导致所有关注者的动态更新以进行实时更新。 这可能会导致我们的新闻源生成服务出现严重延迟。
我们可以预先生成年表并将其保存在内存中以提高效率。
离线生产(扇出写入)
我们可以有专门的服务器,不断地在内存中创建和存储用户的新闻源。 我们可以在用户需要时从预先生成的保存位置提供新闻提要。
用户的提要应存储在内存中多少个提要项?
根据您的使用行为进行调整。
我们应该为所有用户制作一个新闻源(并将其保存在内存中)吗?
- 对于不经常登录的人。
- 基于 LRU 的缓存是一种简单的方法。
- 更好的解决方案是弄清楚用户如何登录。什么时候登录? 你说的是哪个工作日?
饲料发布
扇出是向所有关注者发送帖子的过程。
扇出读取(拉)
当您请求新闻提要时,系统会收到阅读请求。 扇出阅读向您的所有关注者发送阅读请求,要求他们阅读他们的内容。
优点:
- 写作的过程很便宜。
- 读取数据时,使用各种聚合算法更容易。
缺点:
- 对于一个有很多粉丝的人来说,读操作是相当昂贵的。
- 用户在提取数据之前不会看到新数据。
- 当我们定期拉取最新的帖子时,很难找到合适的拉取节奏,并且大多数拉取请求会返回一个空答案,浪费资源。
扇出写入(推)
当您发送新帖子时,系统会向系统发出写入请求。 写入请求将发送给您的所有关注者,以使用扇出写入更新他们的新闻源。
专业版
- 读取过程成本低廉。
连接器
- 对于拥有数百万粉丝的用户来说, 写 手续太贵。
Feed的排名
今天的排名算法不仅仅按时间顺序对提要进行排序,还试图保证具有更大相关性的项目被优先考虑。
- 选择可以帮助您确定摘要项目相关性的因素,例如喜欢、评论和分享的数量,如果文章包含照片或视频,则项目最后更新的时间等等。
- 根据特征计算分数。
- 使用分数对帖子进行排名。
设置用户留存、广告收入等 KPI,看看我们的排名系统有多有效。
结论
尽管 Instagram 或其母公司 Facebook 是一家大公司,但它对 系统设计。
我尽我最大的努力为您提供 Instagram 提要的高级摘要。
我希望它是有帮助的,你会好好利用它。
发表评论