Feed系统

最近在研究一个个人动态分享平台,对动态的推送方式有些疑惑,于是研究到了以下结果。

简介

在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条资讯或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用户也就可以在移动设备上逐条去浏览这些信息单元。现在的微信、抖音、微博等这种类似个人动态的分享平台,都采用一种Feed流系统。类似私信、通知之类的系统也是Feed流系统的一种。

Feed流本质上是一个数据流,是将 “N个发布者的信息单元” 通过 “关注关系” 发送给 “M个接收者”。

它需要关注的是(用微博举例):用户A在微博发布了一条动态,那么用户A的所有followers都需要接收到这条动态,我们要怎么将这条动态呈现到每个follower上?

系统分析

Feed流本质是数据流,那么从数据层面看,可以将产生的数据分为三类:

  • 发布者的数据:

    发布者的数据按照发布者组织发布之后,需要推送给他的followers。比如微博的个人页面,朋友圈的个人相册。

    发布者的数据一般是需要永久保存的。

  • 关注关系:

    系统中发布者和接收者之间的关系。在微博中,关注是单向流。微信中是好友,是双向流(加了好友相当于微博的互关)。但是,不管是单向流还是双向流,某条数据的流动是单向的。

    用户关系表,需要永久保存。

  • 接收者的数据:

    从发布者获取数据,然后通过某种顺序组织到一起。像微博关注人的动态一般是按照时间顺序(如果没有关注是推荐的话,一般是按照喜好或者说点赞数播放量)。

    接收者的数据一般按照时间热度数据,只需要保留最近一段时间的数据。

Feed流数据的聚合

将存储的关注人的微博数据聚合成源源不断的信息流供用户访问,Feed系统一般有三种解决方案。

推模式

顾名思义,所谓推模式就是当用户发布一条动态之后,将这条动态自动发送(推)给他的followers的收件箱,因为有时候接收者并不在线,那么就需要一个收件箱来存储这个数据,这个存储的地方一般称之为同步库。

推模式的信息聚合简单,因为每一个用户只需要访问自己的收件箱就可以获取到关注人的动态。

问题在于:如果一个发布者拥有上千万个粉丝,那么就需要将这条数据推送千万次。这样会带来极大的写入量,给数据库或者服务器带来极大的压力,并且,这样的一条数据,会被存储多份,占用存储空间也大。如果该发布者还想要编辑或者修改动态,那么还需要在请求一遍所有粉丝的收件箱。因此,采用推模式,存储成本以及数据更新成本会非常高,需要大量的缓存和数据库以及队列机来更新。

拉模式

拉模式就是用户主动的遍历关注人列表,获取关注人列表中的所有动态更新,然后再按照时间聚合再一起,从用户的角度来看,请求的数据和计算量远大于推模式。但是是相当于用户主动的去获取关注人动态,不用发布者推送给每一个粉丝,并且如果要修改数据就需要关注自己的动态,修改即可,也不需要再请求粉丝的收件箱。

推拉结合

对比推模式和拉模式的优缺点,可以发现可以将两者结合起来,拥有粉丝数少的用户采用推模式,粉丝量大的用户采用拉模式。这样虽然合理,但是业务逻辑就比较复杂,难以确定哪些用户该使用推模式,哪些该采用拉模式,所以一般还是采用的拉模式。

Feed系统设计分析(类似微博的用户动态分享问题)的更多相关文章

  1. 常用社交网络(微博等)动态新闻(feed、新鲜事)系统浅析(转)

    add by zhj:同时也看看国外牛逼公司是怎么做的吧 Stream-Framework    Python实现的feed Twitter 2013 Redis based, database fa ...

  2. 百万用户时尚分享网站feed系统扩展实践

    Fashiolista是一个在线的时尚交流网站,用户可以在上面建立自己的档案,和他人分享自己的以及在浏览网页时看到的时尚物品.目前,Fashiolista的用户来自于全球100多个国家,用户达百万级, ...

  3. 微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

    sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed ...

  4. Feed系统架构资料收集

    完全用nosql轻松打造千万级数据量的微博系统 微博feed系统的push和pull模式和时间分区拉模式架构探讨 关于如何构建一个微博型广播 关于如何构建一个微博型广播2 用 mongodb 储存多态 ...

  5. Feed系统架构资料收集(转)

    add by zhj:有些链接已经失效,后续会修改. 原文:http://blog.csdn.net/zhangzhaokun/article/details/7834797 完全用nosql轻松打造 ...

  6. php + Redis 写的类似于新浪微博的feed系统

    最近接了一个feed系统的外包,类似于微博那种!客户端是ios和android,服务器用的php,数据库用的是redis.分享下服务器和数据库部分的功能!希望对大家有帮助. 关于redis的介绍,大家 ...

  7. ASP.NET路由系统实现原理:HttpHandler的动态映射

    我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求.我们可以通过H ...

  8. Linux系统下给非root用户添加sudo权限

    Linux系统下给非root用户添加sudo权限 有时,在linux系统中非root用户运行sudo命令,会提示类似信息:  xxx is not in the sudoers file. This ...

  9. Linux系统下查看已经登录用户并踢出的方法

    LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务. 查看用户的操作 查看当前用户: [ROOT@LOCALHOST ROOT] # W                    ...

随机推荐

  1. NXOpen.UF.UFView.CycleObjects 的使用

    Public Sub CycleObjects(ByVal view As NXOpen.Tag, ByVal type As NXOpen.UF.UFView.CycleObjectsEnum, B ...

  2. Sequence Model-week1编程题2-Character level language model【RNN生成恐龙名 LSTM生成莎士比亚风格文字】

    Character level language model - Dinosaurus land 为了构建字符级语言模型来生成新的名称,你的模型将学习不同的名字,并随机生成新的名字. 任务清单: 如何 ...

  3. 记一个非常诡异的关于 shared_ptr 的 bug

    问题描述 今天写项目的时候遇见一个特别诡异的 bug,体现在在执行某条语句时,程序会莫名崩溃,并且给出的错误信息也非常难懂,只有一个malloc(): invalid size (unsorted)错 ...

  4. BUAA 2020 软件工程 提问回顾与个人总结

    BUAA 2020 软件工程 提问回顾与个人总结 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾 ...

  5. 基于jpa的specification实现动态查询

    spring data jpa为我们实现简单的crud操作提供了极大的方便.但大部分情况下,系统中都存在大量的动态查询操作,这个时候就可以借助spring data jpa的 Specificatio ...

  6. 2021.7.21考试总结[NOIP模拟22]

    终于碾压小熠了乐死了 T1 d 小贪心一波直接出正解,没啥好说的(bushi 好像可以主席树暴力找,但我怎么可能会呢?好像可以堆优化简单找,但我怎么可能想得到呢? 那怎么办?昨天两道单调指针加桶,我直 ...

  7. 21.8.7 test

    \(NOIP\) 测试 考的一般般. \(T1\) WOJ4656 签到题,其实就是算 \(\sum\limits_{i=1}^n i^2\) #include<bits/stdc++.h> ...

  8. netty系列之:netty实现http2中的流控制

    目录 简介 http2中的流控制 netty对http2流控制的封装 Http2FlowController Http2LocalFlowController Http2RemoteFlowContr ...

  9. 使用spire.doc导出支持编辑Latex公式的标准格式word

    背景 之前有的教辅标注需求,在导出题库的时候希望顺便导出可以查看word,方便线下预览成品效果,因为只是用来预览并且为了沿用前端的样式,当时方案就是直接生成html,写个word的文件头,这样就可以用 ...

  10. 修改openstack镜像--支持root密码登陆

    一.前言 从openstack官方下载的云镜像一般都是普通用户密钥登陆,比如centos镜像的普通用户为centos,ubuntu镜像的普通用户为ubuntu,虽然密钥登陆系统相比密码登陆来说比较方便 ...