# 信息流系统设计

在这里插入图片描述

# 方案 A:拉模式(Pull / 读扩散)

当用户张三发了一条微博,系统只把微博写入张三自己的发件箱(Outbox)。当李四(张三的粉丝)打开微博时,系统再去查询李四关注的所有人,并从这些人的发件箱里拉取最新微博,最后在内存中做按时间排序的合并。

优点:写操作极轻量(写一次就行)。存储成本低,没有冗余数据。

缺点:读操作极重(读扩散)。如果李四关注了 1000 个人,每次刷新就要读 1000 个人的发件箱,还要做内存排序,高并发下响应极慢。

# 方案 B:推模式(Push / 写扩散)

当用户张三发了一条微博,系统不仅写入张三的发件箱,还会立刻把这条微博的 ID(或内容)复制分发到张三所有粉丝的收件箱(Inbox)。李四刷新微博时,直接读取自己的收件箱即可。

优点:读操作极快(只需读一个收件箱)。

缺点:写操作极重(写扩散)。如果张三有 1000 万粉丝,发一条微博就需要触发 1000 万次写操作

# 方案 C:混合模式

在真实的信息流业务中,大 V(明星、大号)拥有千万级甚至亿级粉丝,如果使用纯推模式,大 V 发一条微博会瞬间造成系统写雪崩。

因此,可以采用基于用户分类的混合模式:

普通用户发微博:采用推模式。粉丝量少,直接推送到所有粉丝的收件箱(Inbox)。

大 V 发微博:采用拉模式。只写入自己的发件箱(Outbox),不进行广播推送。

用户刷新信息流(Feed)时:

首先,读取自己的收件箱(Inbox),这里面包含普通好友推过来的微博。

其次,去查询自己关注列表中是否有大 V,如果有,实时拉取这些大 V 发件箱里的最新微博。

最后,在内存中将两部分数据通过时间戳进行 Merge Sort(归并排序),呈现给用户。