Skip to content

Commit

Permalink
feat: chapter 13
Browse files Browse the repository at this point in the history
  • Loading branch information
honkinglin committed Feb 5, 2025
1 parent 29d824a commit 2f7154d
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions docs/grokking/chapter-13.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,40 @@ getUserFeed(api_dev_key, user_id, since_id, count, max_id, exclude_replies)
- 类似地,可以创建 **FeedMedia** 表来存储动态项与媒体的关系。

![图13-1](/grokking/f13-1.png)

## 6. 高层系统设计

从高层来看,这个问题可以分为两个部分:

**1. 动态消息生成**
新闻动态(Newsfeed)是从用户和实体(页面或群组)的帖子(或动态项)中生成的,用户可以关注这些实体。因此,每当系统收到请求以生成用户(例如 Jane)的新闻动态时,我们将执行以下步骤:

1. 获取 Jane 关注的所有用户和实体的 ID。
2. 检索这些 ID 对应的最新、最受欢迎且最相关的帖子,这些帖子将作为 Jane 新闻动态的候选内容。
3. 根据与 Jane 的相关性对这些帖子进行排序,形成 Jane 当前的新闻动态。
4. 将该动态存入缓存,并返回前 N 条(例如 20 条)帖子以供 Jane 展示。
5. 在前端,当 Jane 滑到底部时,可以从服务器获取接下来的 20 条帖子,以此类推。

需要注意的是,我们在生成新闻动态后会将其存入缓存。那么,如果 Jane 关注的人发布了新的帖子,该如何处理?如果 Jane 在线,我们需要一个机制对新帖进行排序并添加到她的新闻动态中。我们可以定期(如每 5 分钟)执行上述步骤,以便对新帖子进行排序并添加到她的动态中。随后,Jane 会收到通知,提示她有新的动态可获取。

**2. 动态消息推送**
每当 Jane 加载新闻动态页面时,她需要向服务器请求并拉取动态项。当她滑到底部后,可以继续从服务器拉取更多数据。对于新帖子,服务器可以选择两种方式:
- **通知 Jane**,然后由 Jane 主动拉取新内容。
- **服务器直接推送**新帖子到 Jane 的客户端。

我们将在后续详细讨论这两种方案。

**新闻动态服务的高层组件**
我们的新闻动态系统主要包含以下组件:

1. **Web 服务器**:用于维护与用户的连接,并在用户和服务器之间传输数据。
2. **应用服务器**:负责执行存储新帖的工作流,同时用于检索和推送新闻动态给用户。
3. **元数据数据库和缓存**:用于存储用户、页面和群组的元数据。
4. **帖子数据库和缓存**:用于存储帖子及其相关元数据。
5. **视频和图片存储及缓存**:基于 Blob 存储,用于存储帖子中的所有媒体内容。
6. **新闻动态生成服务**:用于收集和排序所有与用户相关的帖子,生成新闻动态并存入缓存,同时支持接收实时更新,将新帖子添加到用户的时间线中。
7. **动态通知服务**:用于通知用户有新动态可查看。

下图展示了系统的高层架构,其中用户 B 和 C 关注了用户 A。

![图13-2](/grokking/f13-2.png)

0 comments on commit 2f7154d

Please sign in to comment.