设计一个feed流系统

news2024/11/25 22:45:58

什么是feed流系统

移动互联网时代,Feed流产品是非常常见的,如朋友圈、微博、抖音等,除此之外,很多App的都会有一个模块,要么叫动态,要么叫消息广场,这些也是Feed流产品。只要大拇指不停地往下划手机屏幕,就有一条条的信息不断涌现出来。就像给宠物喂食一样,只要它吃光了就要不断再往里加,故此得名Feed(饲养)。

feed流系统分类

Feed流的分类有很多种,但最常见的分类有两种:

分类例子阐述
Timeline微信朋友圈按发布的时间顺序排序,先发布的先看到,后发布的排列在最顶端。这也是一种最常见的形式。
这种一般假定用户Feed流中的Feed不多,但是每个Feed都很重要,都需要用户看到
Rank抖音、今日头条按某个非时间的因子排序,一般是按照用户的喜好度排序,用户最喜欢的排在最前面,次喜欢的排在后面。
这种一般假定用户可能看到的Feed非常多,而用户花费在这里的时间有限,那么就为用户选择出用户最想看的Top N结果

Feed流中的基本概念

  • Feed:Feed流中的每一条状态或者消息都是Feed,比如微博中的一条微博就是一个Feed。
  • Feed流:持续更新并呈现给用户内容的信息流。每个人微博主页都是一个Feed流。
  • Timeline:Timeline其实是一种Feed流的类型,微博,朋友圈都是Timeline类型的Feed流,但是由于Timeline类型出现最早,使用最广泛,最为人熟知,有时候也用Timeline来表示Feed流。

两种Timeline

img

  • 关注页Timeline(也叫home timeline):展示多个用户的Feed消息的聚合页面(收集自当前用户所关注的其他用户的feed),比如朋友圈,微博的首页等。
  • 个人页Timeline(也叫user timeline):展示单独某个用户(自己或其他用户)发送过的Feed消息的页面,比如微博的个人页等。

比较常见的场景是,一个用户在home timeline里看到了某个很感兴趣的feed,然后进一步点开这个发布者的user timeline,查看这个发布者的其他feed内容。

实现

如果要设计一个Feed流系统,最关键的两个核心,一个是存储,一个是推送。

虽然我们只是以设计一个feed流系统来学习它的原理,但是也应该对标顶级的feed流系统来设计,通过考虑他们所面对的大数据量、高并发场景问题,来使我们能够进行更有价值的思考。

那么最顶级的feed流系统是什么样的呢?以facebook为例,2019年第四季度,facebook有16.6亿日活用户(daily active users),相当于21%的世界人口。25亿月活用户,相当于32%的世界人口。

ok,那我们的目标就是设计一个10亿日活的feed流系统,平均每个用户关注了500个其他用户。

流量预估

假设每个用户平均每天拉取10次feed流,那么每天就有100亿次拉取请求,QPS大约为116K。

存储预估

假设我们为每个用户用缓存存储500条feed以供快速浏览(这500条feed会实时更新,只有极少数人会每天刷超过500条feed),每条feed大约1KB,那就是每人500KB,总共500TB。

我们这里只讲理论,不讲具体的技术选型。具体落地时再考虑使用什么技术组件来满足流量和存储预估的容量。

存储

数据库模型

img

大致可以分为三种信息:

  • Users:记录每个用户的个人信息(是否活跃用户、是否大V)
  • Follows:记录不同用户之间的关系(用户A关注了用户B)
  • FeedItems:记录每条Feed的内容

不同数据之间的关联:一个用户可以关注多个人,一个用户可以发布多条Feed。

数据和存储介质

不同的数据有不同的特性,各自需要单独的存储服务,各自使用合适的存储介质。

持久化存储

数据特性存储介质数据服务简称数据内容
Feed中的媒体内容,如图片和视频占用空间大对象存储Object storeVideo, image file
用户的个人信息,用户之间的关系占用空间小,信息维度多,需结构化存储SQL数据库(如MYSQL)SQL databaseuser metadata
用户个人主页的feed数据数据结构简单,KV结构,V为列表。需持久化存储。NoSQL数据库NoSQL data storeuser timeline

feed流系统的所有数据都在持久化存储中保存,也是最原始的数据。但是还需要将一些数据放在缓存中,以应对高并发业务请求。

缓存

存储介质都是NoSQL缓存(如Redis)

数据数据服务简称数据内容
feed数据feed items cache serverFeed_id:metadata
个人页Timelineuser timeline cache serverUser_id:(
list(feed_id),
updated_at
)
关注页timelinehome timeline cache serverRank,sort,merge
user_id: (
list(feed_id),
updated_at
)

推送

推拉之争

Pull Model(读扩散)

拉模型就是在查询时首先查询用户关注的所有创作者 uid,然后查询他们发布的所有文章,最后按照发布时间降序排列。用户每打开一次「关注页」系统就需要读取 N 个人的文章(N 为用户关注的作者数), 因此拉模型也被称为读扩散。

img
  • 优点:逻辑清晰直观,实现简单

  • 缺点:每次阅读「关注页」都需要进行大量读取和一次重新排序操作,若用户关注的人数比较多一次拉取的耗时会长到难以接受的地步。

Push Model(写扩散)

推模型就是在创作者发布文章时就将新文章写入到粉丝的关注 Timeline,用户每次阅读只需要到自己的关注 Timeline 拉取就可以了。使用推模型方案创作者每次发布新文章系统就需要写入 M 条数据(M 为创作者的粉丝数),因此推模型也被称为写扩散。

img
  • 优点:拉取操作简单、耗时短,用户体验良好。
  • 缺点:粉丝量大的博主发布feed时,写入量巨大。

在线推,离线拉

推拉模型的对比

-优点缺点
读取快1、逻辑复杂,占用大量存储空间
2、粉丝量大的博主发布feed时写入量巨大
逻辑简单,不占用多余存储空间读取慢,尤其是关注人数多的用户读取feed的速度非常慢

看起来推拉模型各有优缺点,但是在实际上,Feed 流是一个极度读写不平衡的场景,一般读写比例在10:1,甚至100:1以上。虽然推模型占用更多的存储空间,但是拉模型消耗的cpu资源也不逞多让。而且用户很难容忍打开页面时需要等待很长时间才能看到内容。因此无论是从资源消耗还是从用户体验出发,推模型都更有实用价值。

在确定要使用推模型的情况下,如何优化写扩散问题呢?实际上不一定需要把作者的新feed推给每个粉丝,因为粉丝中活跃用户数量是有限的,只需要推给活跃用户即可,而不活跃的用户则是等到他们回归的时候,再使用拉模型来构造feed流即可。

因此目前的feed流系统一般混合使用pull模型和push模型

  • 非活跃用户的feed流,使用pull模型生成
  • 活跃用户的feed流,使用push模型生成

下面的feed发布和feed读取也是以推拉混合模型为基础。

feed发布

img

用户(作者)创建一个新feed的写流程如下:

  1. 客户端向负载均衡服务器发起一个http请求来创建一个新的feed
  2. 负载均衡服务器选择一个负载较低的web服务器,传递http请求
  3. web服务有限流功能
  4. web服务把新feed推到消息队列中做异步处理,并直接返回即时响应
  5. fanout(扩散)服务从消息队列中消费消息,把feed分发给多个服务器,来给该名作者的粉丝们的feed流里新增该feed
  6. object store:存储新feed中的图片、视频等资源
  7. NoSQL data store:把新feed存储在用户的个人主页timeline中(按时间顺序存储)
  8. SQL database:存储用户信息,不过在写新feed的场景下应该不会涉及用户信息的修改。
  9. feed items cache server:对于每一个超过一定粉丝量的用户,会存储他们的一部分最新的feed items内容(不包含图片、视频等媒介)在缓存中。
  10. user timeline cache server:为每个用户缓存他们的个人主页timeline的feed id。
  11. fanout服务请求feed生成服务
  12. feed生成服务请求user info服务获取用户信息,包括:作者是否名人、作者的关注者是哪些用户、关注者们的活跃状态(user info服务把用户信息缓存在内存中)
  13. feed生成服务为关注者们的home timeline新增feed_id,缓存在home timeline cache server中,生成逻辑的详情写在下面
  14. 对于非名人作者,feed生成服务用推模型以O(n)复杂度为每个关注者(不管是否活跃)的home timeline中新增一个新的feed_id(n为关注者数量)
  15. 对于名人作者,feed生成服务使用推拉混合模型,只为活跃关注者生成feed流,不需要管非活跃的关注者,因为他们是使用拉模型来生成home timeline的。
  16. 生成新feed后,更新每个相关的用户的home timeline,对其进行rank、sort和merge。

feed读取

img

用户拉取feed流的读流程如下:

  1. 客户端查询DNS服务来做解析域名
  2. 客户端查询CDN来看目标timeline的feed是否有被缓存
  3. 客户端向负载均衡服务发起http请求
  4. 负载均衡服务器选择一个负载较低的web服务器,传递http请求
  5. web服务有限流功能
  6. web服务向timeline服务请求timeline内容
  7. timeline服务请求user info service获取用户信息,包括:当前用户是否活跃、当前用户关注了哪些人、当前用户是否关注了名人。
  8. 假如用户请求的是home timeline,则timeline服务请求home timeline cache server来获取当前用户的home timline的feed_id列表
  9. timeline服务请求feed items cache server,根据feed_id列表获取feed内容
  10. 假如用户请求的是user timeline,则timeline服务请求user timeline cache server来获取目标用户的user timeline的feed_li列表,并且同样到feed items cache server,根据feed_id列表获取feed内容
  11. 前面请求user info service获取用户信息时,如果cache miss了就请求SQL database来获取用户信息
  12. timeline服务请求object store补充feed中的图片和视频数据
  13. feed items cache server缓存不命中时,访问NoSQL data store获取feed内容
  14. 非活跃用户请求home timeline时,不访问home timeline cache server,而是直接用拉模型来实时计算和获取feed流

参考文章

Designing a Social Media News Feed System

Design a News Feed System

如何打造千万级Feed流系统

从小白到架构师(4): Feed 流系统实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】十大算法之一 “决策树”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

截至目前最强的70亿参数大语言模型:开源可商用的RedPajam 7B完全版发布!

RedPajama模型是TOGETHER发布的一个开源可商用的大模型。2023年6月6日,TOGETHER在官方宣布该模型完成训练,经过测试,该模型目前超过所有7B规模的大模型,比LLaMA-7B和Falcon-7B的效果还要好! TOGETHER公司是一家由豪华管…

HDMI之HDCP

概述 HDCP 1.4第1阶段 HDCP 1.4第2阶段 只有REPEATER设备,此阶段才会出现。 HDCP 1.4第3阶段 本文以Repeater为例,连接方式Source[Tx]=>[Rx]Repeater[Tx]=>[Rx]Sink。讲解一下HDCP1.4的通信过程。 设置SCDC 设置TMDS Configuration Rx W A8 20 00 Rx W A8 20 R …

云安全与云渗透

一、引言 随着技术的进步,云计算已成为信息技术领域的主流趋势。企业和个人都在利用云服务实现数据存储和处理的便利,但同时也带来了一系列的安全问题。对于这些问题,我们需要深入理解云安全和云渗透的重要性。本文将详细探讨这两个主题。 …

Leetcode之哈希查找

1. 哈希查找 本质上就是个搜索,但是可以将在一个集合中查找一个元素的时间复杂度降低到O(1)。python中常用的有以下方式: setdict数组模拟 2. 相关算法题 2.1. Leetcode 771 宝石与石头 题目链接题目描述 给你一个字符串 jewels 代表石头中宝石的类…

Java 图片渲染到前端,向前端一次返回多张Base64图片

文章目录 前言图片渲染到前端向前端一次返回多张Base64图片 前言 当我们从服务器读取的图片链接返回给前端,前端可以很轻松的下载和展示,但是对于临时文件,我们不需要保存到服务器,比如PPT转图片,PDF转图片等等&#…

数据结构--》从线性表说起,掌握常用基础算法

目录 初识线性表 线性表的基本操作 顺序表的定义 顺序表的基本操作 单链表的定义 单链表的基本操作 双链表的介绍 循环链表的介绍 静态链表的介绍 初识线性表 线性表是具有相同数据类型的 n (n0) 个数据元素的有限序列,其中n为表长,当n0时线性…

mysql 将date字段默认值设置为CURRENT_DATE

我们是否可以在mysql中,将Date字段的默认值设置为CURRENT_DATE(当前日期)? 答案是8.0之前不可以,8.0.13之后可以。 比如在5.7版本中使用如下sql创建表,将会提示语法错误: CREATE TABLE t_order (id bigi…

CentOS 7远程登录jupyter lab

使用cat /etc/redhat-release看到操作系统是CentOS Linux 7.6,使用uname -r看到内核是3.10.0-957.el7.x86_64。 python3 --version看一下python的版本,pip3 --version看一下pip的版本,这是我CentOS 7默认安装好的。 pip3 install jupyterla…

ASEMI代理光宝高速光耦LTV-M601参数,LTV-M601图片

编辑-Z LTV-M601参数描述: 型号:LTV-M601 平均正向输入电流IF:20mA 反向输入电压VR:5V 功耗PI:40mW 输出集电极电流IO:50mA 输出集电极电压VO:7V 输出集电极功耗Po:85mW 电…

【C++从入门到放弃】stack和queue的深度剖析及空间适配器的介绍

🧑‍💻作者: 情话0.0 📝专栏:《C从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! stack…

SMT车间贴片机Feeder管理方案

Feeder(飞达或供料器)是电子厂SMT车间贴片机上一个重要的部件,它的可用状态关系着贴片机生产的质量的稳定性,如何有效率的管理是每一位车间主管人员不可忽视的问题。根据行业协会大数据的分析发现导致贴片机大约30%的损失时间及1%的物料浪费都是因为Feed…

【Leetcode60天带刷】day14二叉树——144.二叉树的前序遍历,145.二叉树的后序遍历,94.二叉树的中序遍历

题目: 144. 二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3]示例 2: 输入:root [] 输出:[]示例 3&#x…

5.4.1 虚拟专用网VPN

5.4.1 虚拟专用网VPN 我们已经学习了因特网的路由协议(5.3.1 因特网的路由协议(一)、5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议、5.3.3 因特网的路由协议(三)OSPF协议、5.3.4 因特…

【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理的详细讲解

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…

开利网络赋能祥兴事业集团推动乡村振兴数字化转型

近日,开利网络到访柳州祥兴实业集团,就即将举办的广西文旅大会数字化部署进行跟踪落地。以“祥兴百朋荷苑”为用户端,祥兴集团针对百朋景区实施了全流程的数字化系统构建,包含景区统一收银、景区导览导航讲解及扫码点餐、预约核销…

Winform模拟Visual Studio工具栏拖拉拽、停靠

背景 随着公司接的业务复杂度提高,软件界面设计需求也相应提升,老板不再满足于单面板的各种跳转,所以明白了吧,不提升自己就等于自愿失业或转行!!! 方案 本来想着自学自写一套控件库来实现&a…

抽象类和接口—javaSE

这里写目录标题 1.抽象类1.1概念1.2语法1.3特性1.4使用 2.接口2.1概念2.2语法2.3特性2.4重要的接口2.4.1给数组对象排序(Comparable、Comparator)2.4.2 Cloneable(浅拷贝) 2.5抽象类和接口的区别 3.object类3.1定义3.2equals3.3获…

智慧文旅-VR全景展示助力开启景区数字化管理新方式

导语: 在数字化时代,旅游业面临着新的机遇和挑战。 为了吸引更多游客并提供独特的旅行体验,结合VR全景技术和智慧文旅的创新模式已经成为不可忽视的趋势。 一.提升旅游感官体验 VR全景技术正以惊人的速度在旅游业中崭露头角。通过…

【自监督论文阅读 2】MAE

文章目录 一、摘要二、引言2.1 引言部分2.2 本文架构 三、相关工作3.1 Masked language modeling3.2 Autoencoding3.3 Masked image encoding3.4 Self-supervised learning 四、方法4.1 Masking4.2 MAE encoder4.3 MAE decoder4.4 Reconstruction target 五、主要实验5.1 不同m…