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. BUAA软工-结对项目作业

    结对项目作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 通过这门课锻炼软件开发能力和经验,强化与他人合作 ...

  2. netty入门实现简单的echo程序

    最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记 ...

  3. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  4. Noip模拟49 2021.9.7

    T1 reverse 又一道板子打假的挂分题,直接挂到倒二.. 考场上思路神奇,居然想到用$bfs$建边然后跑最短路, 其实当时也想到了直接$bfs$,但是不知道为啥觉得$dij$屌就没直接打$bfs ...

  5. C语言基础知识总结大全

    1.入门程序 #include <stdio.h> int main() { printf("Hello World!"); return 0; } 2.数据类型 数据 ...

  6. 嵌入式物联网之SPI接口原理与配置

    本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...

  7. 深入理解Linux C语言内存管理

    问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及语言中,内存管理都十分重要. 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手.现在有一个简单的C源程序h ...

  8. 用python检查矩阵的计算

    鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案,故用Python写出矩阵的简单计算程序,便于检查出错的步骤. 1.行列式 可自行更改阶数 from numpy imp ...

  9. 转:(WIN)S04-CH01 PCIE XDMA开发环境搭建以及环路测试

    摘要: 这一章开始主要介绍 XILINX FPGA PICE IP XDMA IP的使用.XDMA IP使用部分教程分LINUX 篇和WINDOWS篇两个部分.通过实战,面向应用,提供给大家 XILI ...

  10. xiaoxiaole

    common.cpp #include "common.h" common.h #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDE ...