万字21图!手把手教你设计一个超级牛逼的 Feed 流系统

★★★建议星标我们★★★
万字21图!手把手教你设计一个超级牛逼的 Feed 流系统文章插图
万字21图!手把手教你设计一个超级牛逼的 Feed 流系统文章插图
2020年Java原创面试题库连载中
【000期】Java最全面试题库思维导图
【020期】JavaSE系列面试题汇总(共18篇)
【028期】JavaWeb系列面试题汇总(共10篇)
【042期】JavaEE系列面试题汇总(共13篇)
【049期】数据库系列面试题汇总(共6篇)
【053期】中间件系列面试题汇总(共3篇)
【065期】数据结构与算法面试题汇总(共11篇)
【076期】分布式面试题汇总(共10篇)
【077期】综合面试题系列(一)
【078期】综合面试题系列(二)
【079期】综合面试题系列(三)
【080期】综合面试题系列(四)
【081期】综合面试题系列(五)
【082期】综合面试题系列(六)
【083期】综合面试题系列(七)
【084期】综合面试题系列(八)
【085期】综合面试题系列(九)
【086期】综合面试题系列(十)
【087期】综合面试题系列(十一)
【088期】综合面试题系列(十二)
【089期】综合面试题系列(十三)
更多内容 , 点击上面蓝字查看
万字21图!手把手教你设计一个超级牛逼的 Feed 流系统文章插图
简介
差不多十年前 , 随着功能机的淘汰和智能机的普及 , 互联网开始进入移动互联网时代 , 最具代表性的产品就是微博、微信 , 以及后来的今日头条、快手等 。 这些移动互联网时代的新产品在过去几年间借着智能手机的风高速成长 。
这些产品都是Feed流类型产品 , 由于Feed流一般是按照时间“从上往下流动” , 非常适合在移动设备端浏览 , 最终这一类应用就脱颖而出 , 迅速抢占了上一代产品的市场空间 。
Feed流是Feed + 流 , Feed的本意是饲料 , Feed流的本意就是有人一直在往一个地方投递新鲜的饲料 , 如果需要饲料 , 只需要盯着投递点就可以了 , 这样就能源源不断获取到新鲜的饲料 。 在信息学里面 , Feed其实是一个信息单元 , 比如一条朋友圈状态、一条微博、一条咨询或一条短视频等 , 所以Feed流就是不停更新的信息单元 , 只要关注某些发布者就能获取到源源不断的新鲜信息 , 我们的用户也就可以在移动设备上逐条去浏览这些信息单元 。
当前最流行的Feed流产品有微博、微信朋友圈、头条的资讯推荐、快手抖音的视频推荐等 , 还有一些变种 , 比如私信、通知等 , 这些系统都是Feed流系统 , 接下来我们会介绍如何设计一个Feed流系统架构 。
Feed流系统特点
Feed流本质上是一个数据流 , 是将 “N个发布者的信息单元” 通过 “关注关系” 传送给 “M个接收者” 。
万字21图!手把手教你设计一个超级牛逼的 Feed 流系统文章插图
Feed流系统是一个数据流系统 , 所以我们核心要看数据 。 从数据层面看 , 数据分为三类 , 分别是:

  • 【万字21图!手把手教你设计一个超级牛逼的 Feed 流系统】发布者的数据:发布者产生数据 , 然后数据需要按照发布者组织 , 需要根据发布者查到所有数据 , 比如微博的个人页面、朋友圈的个人相册等 。
  • 关注关系:系统中个体间的关系 , 微博中是关注 , 是单向流 , 朋友圈是好友 , 是双向流 。 不管是单向还是双向 , 当发布者发布一条信息时 , 该条信息的流动永远是单向的 。
  • 接收者的数据:从不同发布者那里获取到的数据 , 然后通过某种顺序(一般为时间)组织在一起 , 比如微博的首页、朋友圈首页等 。 这些数据具有时间热度属性 , 越新的数据越有价值 , 越新的数据就要排在最前面 。
针对这三类数据 , 我们可以有如下定义:
  • 存储库:存储发布者的数据 , 永久保存 。
  • 关注表:用户关系表 , 永久保存 。
  • 同步库:存储接收者的时间热度数据 , 只需要保留最近一段时间的数据即可 。