Feed 后台设计文章索引
在上一篇文章中,我们谈到「如何用事件抽象 Feed 中多态的内容」,这篇文章会进一步讨论动态 (event) 的分发问题。
当用户分享一个视频时,该视频应该出现在他 Follower 的 Feed 流中。比如吕小荣和 Sam 是 facebook 好友,吕小荣更新状态「我今天感觉好极了」。Sam 登录 facebook 时,会在自己的 feed 流中看到吕小荣的状态更新。
如何实现?通常有拉和推二种做法。
Sam 有 7 个 facebook 好友,每次 Sam 登录,只需要遍历所有好友的产生的 event,按时间逆序排列即可。
step1: 查询 Sam 朋友的主键 ID
select friend_id from friendships where user_id = 3
=> [1, 4, 8, 10, 33, 78, 101]
step2: 在上一篇文章中,我们用 event 来抽象 feed 流中的事件,并且保存在 table event
中。根据好友的主键 ID 过滤 event,并且渲染给 Sam 即可。
select * from events where user_id in [1, 4, 8, 10, 33, 78, 101] order by id desc
优点
缺点
比如 Ryan 在 facebook 有三个朋友 Sam,Bell,Zoey,Bell 嫌弃 Ryan 话多,偷偷屏蔽了 Ryan。
当 Ryan 发布了一条动态「Today is great!」(红颜色 6),系统应当只分发该动态至 Sam 和 Zoey 的队列。因为 Bell 屏蔽了 Ryan,所以 Ryan 的更新并不会分至 Bell 的队列。
下次 Sam/Zoey登录时,会在自己的队列中看到 Ryan 的动态更新 6
;Bell 登录时,则不会看到 6
。
优点
缺点
随着产品的发展,会出现各种各样的商业场景和 feed 流相关。
公司拥有自己的 feed 主页。 (CompanyFeed)
e.g. SAP 的 facebook 主页
热门的 tag 会有自己的 feed 主页,用户可以关注标签。 (TagFeed)
e.g. facebook RocksDB 的 tag 页面
一本书/股票/电影/工作机会/线下聚会也会有自己的 feed 主页 (ObjectFeed)
一个人会有自己的 public feed 主页。(ProfileFeed)
e.g. 吕小荣的 facebook 主页
一个兴趣小组会有自己的 feed 主页。 (GroupFeed)
一个人会有特别好友,他有时只想看特别好友的更新。 (CloseFriendFeed)
理论上讲,当 Ryan 在兴趣小组 RocksDB Developers Public
更新一条带标签的动态 "#RocksDB is great!" 时,
这条内容应该出现在 ②, ④, ⑤,⑥ 四个地方:tag RocksDB
的 feed 主页;Ryan 的个人主页;兴趣小组 RocksDB Developers Public 的主页;Ryan 密友的主页。
推的模式可以将分发逻辑写在代码里,而不是查询语句里。然后根据逻辑将新的动态 (feed_event) 分发至符合条件队列里,满足各种各样的业务需求。受众只需要在相应的队列里读取数据即可,无需复杂的查询语句,大大提高了读的效率。
下一篇文章,我们来谈如何对分发逻辑的抽象。