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. javascript-jquery对象的其他处理

    一.对元素进行遍历操作 如果要遍历一个jquery对象,对其中每个匹配元素进行相应处理,那么可以使用each()方法. $("div").each(function(index,e ...

  2. 【UE4 C++】碰撞检测与事件绑定

    概念 碰撞对象通道与预设 默认提供碰撞对象类型,如 WorldStatic.WorldDynamic等.允许用户自定义 默认提供碰撞预设,如 NoCollision.BloackAll.Overlap ...

  3. [技术博客] 敏捷软工——JavaScript踩坑记

    [技术博客] 敏捷软工--JavaScript踩坑记 一.一个令人影响深刻的坑 1.脚本语言的面向对象 面向对象特性是现代编程语言的基本特性,JavaScript中当然集成了面向对象特性.但是Java ...

  4. Asp.Net 熟悉 Spring

    注:(为加强记忆,所以记录下来,对于有些地方为什么那样写,我也不太理解) 一.我们先创建个窗体应用程序Demos,事先熟悉它是这么实现的 第一步,先在项目的根目录下建一个library文件夹,目的是放 ...

  5. Win10下C语言转8086汇编

    目录 Win10下C语言转8086汇编 简介 开始 写C代码 转换成汇编代码 Win10下C语言转8086汇编 简介 最近学习<王爽汇编>,然后突发奇想,想一边写C语言用编译器将其翻译成汇 ...

  6. Python展示文件下载进度条

    前言 大家在用Python写一些小程序的时候,经常都会用到文件下载,对于一些较小的文件,大家可能不太在乎文件的下载进度,因为一会就下载完毕了. 但是当文件较大,比如下载chromedriver的时候, ...

  7. zabbix 监控redis 挂掉自动重启 并发送企业微信

    1.创建redis监控项[配置]-[主机]-[监控项]-创建监控项,监控6379端口(注意关闭防火墙或者开启防火墙端口6379) redis配置文件设置允许任何地址监听: 添加监控项 2.创建redi ...

  8. You (oracle) are not allowed to access to (crontab) because of pam configura

    用oracle用户添加备份计划任务,crontab -e,提示:You (oracle) are not allowed to access to (crontab) because of pam c ...

  9. Flink 的运行架构详细剖析

    1. Flink 程序结构 Flink 程序的基本构建块是流和转换(请注意,Flink 的 DataSet API 中使用的 DataSet 也是内部流 ).从概念上讲,流是(可能永无止境的)数据记录 ...

  10. 你说说RPC的一个请求的流程是怎么样的?

    前言 面试的时候经常被问到RPC相关的问题,例如:你说说RPC实现原理.让你实现一个RPC框架应该考虑哪些地方.RPC框架基础上发起一个请求是怎样一个流程等等.所以这次我就总结一波RPC的相关知识点, ...