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. 结对编程——带UI的小初高数学学习软件

    一.简介 本次项目要求: 1.所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限): 2.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: ...

  2. Java泛型背后是什么?

    文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...

  3. JVM详解(六)——对象的实例化、内存布局与访问定位

    一.对象的实例化 1.创建对象的方式 2.创建对象的步骤 脑图:https://www.processon.com/view/link/61701a927d9c087040525226 3.对象属性赋 ...

  4. 什么是产品待办列表?(What is Product Backlog)

    正如scrum指南中所描述的,产品待办事项列表是一个紧急而有序的列表,其中列出了改进产品所需的内容.它是scrum团队承担的工作的唯一来源. 在sprint计划 (Sprint Planning)活动 ...

  5. 【BZOJ2070】列队春游———[组合数学+概率DP]

    数学渣滓不可做の题OTZ Description (单身人士不可做 Input                     |            Output 3                   ...

  6. Bzoj P2054 疯狂的馒头 | 并查集

    题目链接 思路:因为每次染色都会将某些馒头的颜色彻底更改,所以每个馒头的最终的颜色其实是由最后一次染色决定的,那么我们只考虑最后一次染色即可.对此,我们可以从后往前倒着染色,当目前的染色区间中存在白色 ...

  7. python的分支结构

    python分支结构 if结构 python的 if 选择分支结构的基础语法如下,需要注意的是判断条件后面是半角的分号,它的作用相当于Java中的小括号 if 判断条件 : 代码块 elif 判断条件 ...

  8. (一)lamp 环境搭建之编译安装apache

    apache的编译安装: 安装步骤大概参考:http://www.cnblogs.com/iyoule/archive/2013/10/24/3385540.html 简单的将分为三步: (1)安装a ...

  9. [源码解析] PyTorch 如何使用GPU

    [源码解析] PyTorch 如何使用GPU 目录 [源码解析] PyTorch 如何使用GPU 0x00 摘要 0x01 问题 0x02 移动模型到GPU 2.1 cuda 操作 2.2 Modul ...

  10. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...