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. python的参数传递是值传递还是引用传递?都不是!

    [写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblo ...

  2. Java中的函数式编程(三)lambda表达式

    写在前面 lambda表达式是一个匿名函数.在Java 8中,它和函数式接口一起,共同构建了函数式编程的框架.   lambda表达式乍看像是匿名内部类的一种语法糖,但实际上,它们是两种本质不同的事物 ...

  3. 【UE4 C++】 Config Settings配置文件(.ini)

    简介 常见存储路径 \Engine\Config\ \Engine\Saved\Config\ (运行后生成) [ProjectName]\Config\ [ProjectName]\Saved\Co ...

  4. 性能利器 Takin 来了!首个生产环境全链路压测平台正式开源

    6 月 25 日,国内知名的系统高可用专家数列科技宣布开源旗下核心产品能力,对外开放生产全链路压测平台产品的源代码,并正式命名为 Takin. 目前中国人寿.顺丰科技.希音.中通快递.中国移动.永辉超 ...

  5. elasticsearch使用ik中文分词器

    elasticsearch使用ik中文分词器 一.背景 二.安装 ik 分词器 1.从 github 上找到和本次 es 版本匹配上的 分词器 2.使用 es 自带的插件管理 elasticsearc ...

  6. eureka服务端和客户端的简单搭建

    本篇博客简单记录一下,eureka 服务端和 客户端的简单搭建. 目标: 1.完成单机 eureka server 和 eureka client 的搭建. 2.完成eureka server 的添加 ...

  7. 2021 ICPC Gran Premio de Mexico 2da Fecha部分题题解

    前面的水题,在队友的配合下,很快就拿下了,剩下几道大毒瘤题,一直罚座三个小时,好让人自闭...但不得不说,这些题的质量是真的高! H. Haunted House 首先看这个题,大眼一扫,觉得是某种数 ...

  8. hdu 3635 Dragon Balls(并查集)

    题意: N个城市,每个城市有一个龙珠. 两个操作: 1.T A B:A城市的所有龙珠转移到B城市. 2.Q A:输出第A颗龙珠所在的城市,这个城市里所有的龙珠个数,第A颗龙珠总共到目前为止被转移了多少 ...

  9. 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本

    目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...

  10. 2021.11.4测试T1-妹子

    题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...