/首页
/开源
/关于
两种简单快速的动态Feed流设计方案 --- 推和拉
发表@2018-09-13 09:15:21
更新@2023-01-21 22:47:40
##### 远在2017年的10月7号左右,GM就提出这个功能需求,当时老赵刚来没多久,按照我当时的说法就是趁机服务隔离部署,将这一块儿的服务独立部署了,前面用网关直接聚合后端的业务API。当然了,任务就交给老赵和张大彪了。 ##### 那会儿还正在门口办公,为了少吸甲醛,一群人冻得跟孙子似的,上牙磕下牙说动态Feed流的解决方案。实际上很久之前,大约是五六年前我是做过这种feed流的,所以还是有一些感悟和心得在里面的。 ##### 动态Feed流大概类似于微信朋友圈、或者weibo首页。大概意思就是比如你关注了翠花、熊大和光头强,那么如果这三个人发送了新的文字或者图片或者视频动态,你是可以看到的。你与翠花、熊大和光头强之间存在着业务上一种“关注”或者“好友”关系。 ##### 这种需求一般比较简单粗暴的解决方案就是利用数据库的in来解决,这是最简单最粗暴的解决方式。它需要三个核心的数据表来解决问题: - feed表,这个表中记录着“谁几点几分做了一件事情” - feed_content表,这个表则记录了上面表中记录的“一件事情是一件具体的什么事情,比如一张图片一段视频一段抒情装X文案”等等 - follower表,这个表中记录着你关注谁,也就是“关系”表 ##### 来,脑补一下业务流程,比写伪代码还要高端: - 第一,你关注了熊大和翠花,那么,再follower表中就多了两条记录: - 你 | 翠花 - 你 | 熊大 - 第二,翠花发了一条文字动态,熊大发了一条视频动态,那么,feed_content表中多了两条数据: - 翠花 | 文字动态“今天好伤感啊,唉可怜,又要上班” - 熊大 | 视频动态“http://www.qiniu.com/xxoo.mp4” - 第三,除了feed_content表中多两条记录外,feed表中也会多两条记录: - 翠花 | 文字动态(但不包含任何内容) - 熊大 | 视频动态(但不包含任何内容) - 第四,你打开了app或者网页,这个时候会执行下面的流程: - 从follower表中查询你关注了谁,也就是翠花和熊大 - 从feed表中查询这两个人都发了什么动态,按照时间倒序排列,使用sql的in语句(关键) - 从feed_content中逐条获取动态的具体内容都是什么 ##### 嘴巴多嘴的人会多说一句:“我怎么感觉三个表多余呢?两个表就够了吧”。实际上,多个表容易扩展你的业务,假如有一天迫于某种业务需求你feed_content表必须分类,也就是所文字动态是一个表,图文动态是一个表,视频动态是一个表,这个时候上述这种设计方案就会更灵活容易控制了。 ##### 这种方案简单、粗暴、快捷、有效,可以在业务数据不大的时候快速实现并上线。但是,当数据量逐渐变大后或者产品一上线就火爆的情况下,就基本上玩完了,in支撑不了巨大的数据量。 ##### 所以,将上面的方案改进一下,可以作出支撑量更大的方案。核心表依然还是三个就行,我们依然采用冥想地方式来走流程,比写伪代码还高端: - 第一,你关注了熊大和翠花,那么,再follower表中就多了两条记录: - 你 | 翠花 - 你 | 熊大 - 第二,翠花发了一条文字动态,熊大发了一条视频动态,那么,feed_content表中多了两条数据: - 翠花 | 文字动态“今天好伤感啊,唉可怜,又要上班” - 熊大 | 视频动态“http://www.qiniu.com/xxoo.mp4” - 第三,除了feed_content表中多两条记录外,feed表中也会多两条记录: - 翠花 | 你 | 文字动态(但不包含任何内容) - 熊大 | 你 | 视频动态(但不包含任何内容) - 第四,你打开了app或者网页,这个时候会执行下面的流程: - 从feed表中查询这两个人都发了什么动态,按照时间倒序排列,使用sql的where = 你即可(关键) - 从feed_content中逐条获取动态的具体内容都是什么 ##### 这两种方案不同的关键点在于第一种是“你主动从你的偶像中获取动态”,而第二种方案则是“你的偶像发完动态后会主动告诉你”,可以看到的是,第二种方案可以支撑更大的业务量,甚至后期当feed表过大的时候,完全可以“你”来进行分表,可以进一步支撑更大的业务量。 - 用专业术语说,第一种方案就叫做拉 - 用专业术语说,第二种方案就叫做推 ##### 推最大的缺陷在于用户主动拉去动态时候的汇总排序以及分页。 ##### 拉最大的缺陷在于对于粉丝众多的大V会产生灾难一样的数据。假设,熊大有10万个粉丝,那么当熊大发一条动态的时候,就需要在feed表中华丽丽地产出10万条动态,想想,是不是很恐怖? ##### 所以,没有不变的万能的可以应付无数中业务场景的技术方案,变的只有业务组合。为了解决上述问题,更好的方式就是采取二者结合的方案:推拉模式。 ---