对Feed流架构的思考

Feed现在已经是一种非常常见的信息展示方式,与传统的信息展现方式(例如新闻,论坛)相比,Feed流实现了个性化的信息推送。

Feed流,从实现方式上来说,有两种主要思路:

  1. 基于推push
  2. 基于拉pull

无论是那种方式,都有一些共识:

  1. 信息的内容和信息的推送是分开的,即posts用来存储信息内容,推送给用户的仅仅是post id;
  2. 信息的推送是异步的。

推push

推的方式,简单的说,就是有一张feeds表,类似于下表:

用户id post id 时间
1 1 2018-01-01
1 2
1 3
2 1
2 2
3 2
4 2 2018-04-05

想要获取某个用户的timeline的时候,只需要查询这个表即可。

每当用户发送post的时候,都需要给这个用户的所有follower在feed表中增加一条记录。

设想一下,当某个用户有上百万个粉丝时,需要推送该用户的feed到每一个粉丝上,虽然推送的过程是异步方式,也需要非常高的代价。而现在,微博上粉丝数最高的明星,已经有上亿的粉丝,如果还是推的方式,这个架构就有点傻了。

拉pull

如果使用拉的方式,就没有feeds表。

拉取的步骤如下:

  1. 查询用户的following列表;
  2. 查询following 用户的posts,排序

这里的第二步,用一个sql语句就可以搞定,我以前还以为需要逐个用户的去查询,然后再合并,这个语句核心是in:

1
select * from posts where uid in [following user list]

据说,目前微博是推拉结合。