feed流拉取,读扩散,究竟是啥?

简介: 当用户量、数据量、并发量数据逐步增加之后,拉模式会慢慢扛不住了,需要升级优化,但对于“取消关注”与“发布feed”这两个写流程又会有冲击和影响。

任何脱离业务的架构设计都是耍流氓。

哪些产品是feed流典型业务?

答:微博,微信朋友圈,Pinterest是典型的feed流业务,系统中的每一条消息就是一个feed。

这类业务的特点是:

  • 有好友关系,例如关注,粉丝
  • 我们的主页由别人发布的feed组成

这类业务的典型动作是:

  • 关注,取关
  • 发布feed
  • 拉取自己的主页feed流

这类业务的核心元数据是:

关系数据

feed数据

feed流的“拉取”与“推送”实现,是个怎么回事?

答:feed流业务最大的特点是“我们的主页由别人发布的feed组成”,获得朋友圈消息feed流集合,从技术上说,主要有“拉取”与“推送”两种方式。feed流的推与拉主要指的是这里。

今天将简述拉模式(圈内说的较多的是“读扩散”)的核心数据结构,核心流程,优缺点。

例如:某feed系统里有ABCD四个用户,其中:

A关注了BC,D关注了B

image.png

其关系存储又包含关注关系与粉丝关系,“A关注了BC,D关注了B”的潜台词是“B有两个粉丝AD,C有一个粉丝A”。

B发布过四条feed:msg1, msg3, msg5, msg10

C发布过两条feed:msg2, msg8

image.png

每一个用户,都有一个feed队列,记录自己曾经发布的所有feed数据。

在拉模式中,发布一条feed的流程非常简单,例如C新发布了一条msg12:

image.png

此时只需往C的feed队列里加入一条feed即可。

在拉模式中,取消关注的流程也非常简单,例如A取消关注C:

image.png

此时只需要在A的关注列表里删除C,并在C的粉丝列表里删除A即可。

在拉模式中,用户A获取“由别人发布的feed组成的主页”的过程比较复杂,此时需要:

获取A的关注列表

list<gz_uid> = select uid from GZ where uid=A

获取所关注的用户发布的feed

list<msg> = NULL;

for(uid in list<gz_uid>){

         list<some_msg> = 

            select * from F where uid=$uid offset | limit

         list<msg> += list<some_msg>;

}

对消息进行rank排序(假设按照发布时间排序),分页取出对应的一页feeds

sort_msg_by_time(list<msg>);

get_one_page(list<msg>, page_num);

feed流的拉模式(“读扩散”)有什么优缺点?

优点:

  • 存储结构简单,数据存储量较小,关系数据与feed数据都只存一份
  • 取消关注,发布feed的业务流程非常简单
  • 存储结构,业务流程都比较容易理解,非常适合项目早期用户量、数据量、并发量不大时的快速实现

缺点也显而易见:

  • 拉取朋友圈feed流列表的业务流程非常复杂
  • 有多次数据访问,并且要进行大量的内存计算,大量数据的网络传输,性能较低

在拉模式中,系统的瓶颈容易出现在“用户所发布feed列表”的读取上,而每个用户发布feed的频率其实是很低的,此时,架构优化的核心是通过缓存降低数据存储磁盘IO。

当用户量、数据量、并发量数据逐步增加之后,拉模式会慢慢扛不住了,需要升级优化,但对于“取消关注”与“发布feed”这两个写流程又会有冲击和影响,具体架构应该如何迭代,下一章和大家分享 。
架构,不只是设计出来的,更是演进而来的。

目录
相关文章
|
缓存 NoSQL 关系型数据库
|
应用服务中间件 数据库连接 Nacos
Seata常见问题之Seata事物卡住了如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
Web App开发 前端开发 JavaScript
网页浏览和编辑DWG快速入门的方法(WEB CAD SDK)
MxDraw云图在线CAD解决方案,包括MxDraw、MxCAD开发包、图纸转换程序和后端服务。支持多种平台和CPU架构,推荐使用最新版Chrome或Edge浏览器。提供AutoCAD各版本dwg格式支持,具备三维和二维编辑功能。提供入门开发指南和功能丰富的示例。用户可下载开发包进行功能演示,包括在线预览和编辑CAD图纸。
1781 94
网页浏览和编辑DWG快速入门的方法(WEB CAD SDK)
|
自然语言处理 算法 Unix
【数据安全】敏感字过滤方案总结
【数据安全】敏感字过滤方案总结
425 1
|
存储 计算机视觉 Python
NumPy 在图像处理中的应用
【8月更文第30天】NumPy 是 Python 中用于科学计算的核心库之一,它提供了高效的数组操作功能。在图像处理领域,NumPy 的数组结构非常适合存储和操作图像数据。本文将详细介绍如何使用 NumPy 进行图像处理,包括加载图像、显示图像、像素操作、颜色空间转换和简单的滤波器应用等。
599 0
|
JavaScript 前端开发 测试技术
Node.js新手框架推荐
【8月更文挑战第4天】Node.js新手框架推荐
356 3
|
弹性计算 缓存 运维
如何在阿里云配置自动定时重启ECS云服务器?
本文主要介绍了如何使用阿里云的系统运维管理(OOS)服务创建定时任务,自动重启ECS实例。操作步骤包括:登录OOS控制台,设置定时规则,搜索并选择模板,选择要重启的实例,设置执行权限并创建任务。此种方式可以提高服务器运行效率,节省人工运维时间和精力。
|
JSON 缓存 C#
提高游戏开发效率之配置表生成工具
提高游戏开发效率之配置表生成工具
1233 1
提高游戏开发效率之配置表生成工具
|
存储 前端开发 异构计算
简单介绍Skia原理
Skia是一个跨平台的2D图形库。其底层原理包括:画布(Canvas),绘制引擎(Paint Engine),渲染管线(Render Pipeline),影子图片(Skia Pictures),路径(Path)
简单介绍Skia原理