Skip to content

Commit 2f7154d

Browse files
committed
feat: chapter 13
1 parent 29d824a commit 2f7154d

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

docs/grokking/chapter-13.md

+37
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,40 @@ getUserFeed(api_dev_key, user_id, since_id, count, max_id, exclude_replies)
7171
- 类似地,可以创建 **FeedMedia** 表来存储动态项与媒体的关系。
7272

7373
![图13-1](/grokking/f13-1.png)
74+
75+
## 6. 高层系统设计
76+
77+
从高层来看,这个问题可以分为两个部分:
78+
79+
**1. 动态消息生成**
80+
新闻动态(Newsfeed)是从用户和实体(页面或群组)的帖子(或动态项)中生成的,用户可以关注这些实体。因此,每当系统收到请求以生成用户(例如 Jane)的新闻动态时,我们将执行以下步骤:
81+
82+
1. 获取 Jane 关注的所有用户和实体的 ID。
83+
2. 检索这些 ID 对应的最新、最受欢迎且最相关的帖子,这些帖子将作为 Jane 新闻动态的候选内容。
84+
3. 根据与 Jane 的相关性对这些帖子进行排序,形成 Jane 当前的新闻动态。
85+
4. 将该动态存入缓存,并返回前 N 条(例如 20 条)帖子以供 Jane 展示。
86+
5. 在前端,当 Jane 滑到底部时,可以从服务器获取接下来的 20 条帖子,以此类推。
87+
88+
需要注意的是,我们在生成新闻动态后会将其存入缓存。那么,如果 Jane 关注的人发布了新的帖子,该如何处理?如果 Jane 在线,我们需要一个机制对新帖进行排序并添加到她的新闻动态中。我们可以定期(如每 5 分钟)执行上述步骤,以便对新帖子进行排序并添加到她的动态中。随后,Jane 会收到通知,提示她有新的动态可获取。
89+
90+
**2. 动态消息推送**
91+
每当 Jane 加载新闻动态页面时,她需要向服务器请求并拉取动态项。当她滑到底部后,可以继续从服务器拉取更多数据。对于新帖子,服务器可以选择两种方式:
92+
- **通知 Jane**,然后由 Jane 主动拉取新内容。
93+
- **服务器直接推送**新帖子到 Jane 的客户端。
94+
95+
我们将在后续详细讨论这两种方案。
96+
97+
**新闻动态服务的高层组件**
98+
我们的新闻动态系统主要包含以下组件:
99+
100+
1. **Web 服务器**:用于维护与用户的连接,并在用户和服务器之间传输数据。
101+
2. **应用服务器**:负责执行存储新帖的工作流,同时用于检索和推送新闻动态给用户。
102+
3. **元数据数据库和缓存**:用于存储用户、页面和群组的元数据。
103+
4. **帖子数据库和缓存**:用于存储帖子及其相关元数据。
104+
5. **视频和图片存储及缓存**:基于 Blob 存储,用于存储帖子中的所有媒体内容。
105+
6. **新闻动态生成服务**:用于收集和排序所有与用户相关的帖子,生成新闻动态并存入缓存,同时支持接收实时更新,将新帖子添加到用户的时间线中。
106+
7. **动态通知服务**:用于通知用户有新动态可查看。
107+
108+
下图展示了系统的高层架构,其中用户 B 和 C 关注了用户 A。
109+
110+
![图13-2](/grokking/f13-2.png)

0 commit comments

Comments
 (0)