首页 › AI System Design › 第11章:设计新闻推送系统

第11章:设计新闻推送系统

简介​

新闻动态系统用于展示用户好友发布的、不断更新的帖子列表(包括状态更新、照片、视频和链接)。典型应用包括 Facebook 的新闻动态、Instagram 的信息流以及 Twitter 的时间线。本章将探讨可扩展新闻动态系统的架构设计。​

步骤1:理解问题​

Requirements​

平台:系统同时支持网页端和移动端应用。​

功能:用户可以发布动态、用户可以在动态中查看好友的帖子。​

排序:为简化起见,动态消息按时间倒序进行排序。​

规模:每位用户最多可拥有5,000位好友、日活跃用户数(DAU)达1,000万、动态内容可能包含文字、图片和视频。​

步骤2:概要设计​

Overview​

该设计包含两条主要流程:​

动态发布:用户发布一条动态,该动态会被写入数据库,并同步到其好友的动态列表中。​

动态消息构建:用户通过按时间倒序聚合好友的动态来获取自己的动态消息。​

News Feed APIs​

动态消息发布API:​

◦

端点: POST /v1/me/feed、这是一个 GitHub 仓库页面,标题为“system-design-notes/01. Scaling at main · liquidslr/system-design-notes”。上下文。​

动态消息获取API:​

◦

端点: GET /v1/me/feed、Params: auth_token (authentication).​

Feed Publishing​

​

飞书文档 - 图片

​

User Interaction: The user publishes a post via the feed publishing API.​

负载均衡器:将流量分发至 Web 服务器。​

Web服务器:对请求进行身份验证并重定向至各服务。​

发布服务:将帖子存储到数据库和缓存中。​

广播服务:将该帖子传播至好友的新闻动态缓存中。​

Notification Service: Sends notifications to friends.​

​

​

News Feed Building​

​

​

用户交互:用户通过检索 API 请求其新闻资讯。​

负载均衡器:将流量分发至 Web 服务器。​

Web 服务器:将请求转发至新闻资讯服务。​

动态消息服务:从动态消息缓存中获取帖子ID,并从数据库或缓存中检索完整的帖子详情。​

​

​

步骤3:设计深度剖析​

Feed Publishing Deep Dive​

Web服务器:​

◦

使用以下方式对用户进行身份验证auth_token.​

◦

实施速率限制以防止垃圾信息。​

扇出服务:​

◦

写时扇出:在写入时将帖子推送到好友的动态中。​

▪

优点:实时更新,快速获取动态。​

▪

缺点:对于好友较多的用户来说,资源消耗较大。​

◦

读取时的扇出:在读取时拉取帖子。​

▪

优点:对不活跃用户高效。​

▪

缺点:动态消息获取较慢。​

◦

混合模式:对大多数用户采用推送模式,对高连接数用户(如名人)采用拉取模式。​

该扇出服务的工作原理如下:​

a.

获取好友ID:从图数据库中检索好友列表。​

b.

从缓存中筛选好友:在缓存中读取用户设置,以排除特定的好友(例如被静音的好友或具有选择性分享偏好的人)。​

c.

发送至消息队列:将经过筛选的好友列表与新帖子的ID一并发送至消息队列,以供后续处理。​

新闻动态获取深度解析​

Cache Architecture​

缓存被划分为五层:​

动态消息缓存:存储帖子ID,以便快速检索。​

内容缓存:存储帖子详情(热门帖子存于热缓存中)。​

社交图谱缓存:存储用户关系数据。​

操作缓存:用于记录用户操作(点赞、回复、分享等)。​

计数缓存:用于维护点赞、回复、关注者等的统计数量。​

​

​

​

​

关键优化​

Scaling​

数据库扩展:​

◦

水平扩展与分片。​

◦

为高流量查询使用只读副本。​

无状态 Web 层:使 Web 服务器保持无状态,以实现水平扩展。​

Caching​

将频繁访问的数据存储在内存中。​

使用缓存层以降低延迟并减轻数据库负载。​

Reliability​

一致性哈希:将请求均匀地分发到各台服务器。​

消息队列:解耦系统各组件并缓冲流量。​

Monitoring​

跟踪QPS(每秒查询数)和延迟等关键指标。​

监控缓存命中率,并据此调整相关配置。​