常用Feed流架构实现
业务中很多需求都会用到类似feed流的架构。
例如
- 微信朋友圈
- 微博
- 动态
- 1对N消息。
一般feed流的架构实现有下面几种。
假如现在的业务场景是微博,然后当前的数据情况是:
用户A关注了用户B和C,用户D关注了用户B
用户B发了微博A,B,用户C发了微博C,D
1. 拉
数据表
- 微博表(字段有:微博ID,微博内容,发布人)
代码逻辑:
- 用户 B发布微博接口,插入记录到微博表,只有一行记录
- 用户A获取我关注的用户的微博接口:
- 获取当前登录用户关注的用户,例如A关注的用户B和C
- 获取B和C发布的所有微博,
- 按时间倒序排列,分页,返回
优缺点:
- 实现简单
- 空间占用较少,一条微博只用一条数据库记录
- 数据量大的情况下, 第2个接口查询较慢(需要用临时表,而且查询数据较多)
2.推
数据表
- 微博表(字段有:微博ID,微博内容,发布人)
- feed流表(字段有:微博ID,发布时间,接收人)
代码逻辑:
- 发布微博接口
- 插入记录到微博表
- 获取当前用户粉丝用户列表,假如当前用户是B,那就是获取A和D
- 插入2行记录到feed流表
- 接收人=A,微博ID=刚才的微博表ID
- 接收人=B,微博ID=刚才的微博表ID
- 用户A获取我关注的用户的微博接口:
- 查询feed流表,找到接收人=A的记录,按发布时间倒序排,分页,返回
优缺点:
- 实现较复杂
- 空间占用较多,一条微博需要插入1+N条记录(N是粉丝用户数)。如果N是几十w或者几百w,对数据库压力非常大,包括空间占用,插入或删除耗时,索引建立等。
- 第2个接口可以用索引,所以查询很快,。
3.推+拉
上面两种方案都有优缺点,当对读的要求很高,同时用户粉丝数很大,就要想办法优化,推+拉是其中一种方案。
具体方法是区分用户:
- 对于经常读取的用户,采用推方案,保证读取的性能
- 对于不常读取的用户,采用拉方案,降低存储压力
从产品的角度看,有很多种方法可以区分用户是否属于经常读,这里提供其中一个可行的方案:
4. 区分活跃用户的推+拉
数据表
- 微博表(字段有:微博ID,微博内容,发布人)
- feed流表(字段有:微博ID,发布时间,接收人)
- 活跃用户表(字段有:用户ID,是否活跃,最新登录时间)
代码逻辑:
- 发布微博接口
- 插入记录到微博表
- 获取当前用户活跃粉丝用户列表,假如当前用户是B,那就是获取A和D,其中A是活跃用户,D是非活跃,那就只获取A。SQL可以用exists,例如:
select * from fans where exists (select * from 活跃表 where 是否活跃=1)
- 插入1行记录到feed流表(D不是活跃用户,就不插入了)
- 接收人=A,微博ID=刚才的微博表ID
- 用户A获取我关注的用户的微博接口:
- 查询feed流表,找到接收人=A的记录,按发布时间倒序排,分页,返回
- APP启动接口(每次APP启动,发送一个请求到后端)
- 如果用户是活跃用户,更新用户最新登录时间
- 如果不是,通过拉方式为用户补发feed流:
- 获取用户所有关注的用户
- 获取这些用户发的微博
- 把这些微博ID插入到用户的feed流表(要避免重复插入)
- 定时任务
- 每天把最新登录时间小于1天前的用户,设置为非活跃
优缺点:
- 第2个接口可以用索引,所以查询很快。
- 数据库压力降低。因为一般粉丝中活跃用户只有小部分,同时补发的时候,可以只补发最新的N条微博,进一步节省空间,当然这些要和产品经理制定好规则。
- 逻辑较复杂
- 因为补发feed流需要一定时间,所以这期间用户只能拉到旧的微博
5.总结
- 如果想简单做,而且对读取要求不高,用拉方式就可以了
- 如果对读取要求高,同时粉丝数不多,例如朋友圈,最多就几千个朋友,建议用推方式
- 如果粉丝数很多,例如微博,动辄几十万到几千万粉丝的,建议用推+拉方式
未经允许,请不要转载
转载于:https://www.cnblogs.com/Xjng/p/11401828.html
常用Feed流架构实现相关推荐
- 数据人看Feed流-架构实践
背景 Feed流:可以理解为信息流,解决的是信息生产者与信息消费者之间的信息传递问题. 我们常见的Feed流场景有: 1 手淘,微淘提供给消费者的首页商品信息,用户关注店铺的新消息等 2 微信朋友圈, ...
- feed流系统重构-架构篇
重构,于我而言,很大的快乐在于能够解决问题. 第一次重构是重构一个c#版本的彩票算奖系统.当时的算奖系统在开奖后,算奖经常超时,导致用户经常投诉.接到重构的任务,既兴奋又紧张,花了两天时间,除了吃饭睡 ...
- 让人欲罢不能的Feed流系统是如何设计的?
作者:少强 原文:https://yq.aliyun.com/articles/706808?utm_content=g_1000064616 简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联 ...
- 亿级规模的 Feed 流系统,如何轻松设计?
阿里妹导读:互联网进入移动互联网时代,最具代表性的产品就是各种信息流,像是朋友圈.微博.头条等.这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长.这些产品都是Feed流类型产品,由于Fe ...
- 动动手指头, Feed 流系统亿级规模不用愁
戳蓝字"CSDN云计算"关注我们哦! 作者 | 少强 责编 | 阿秃 导读:互联网进入移动互联网时代,最具代表性的产品就是各种信息流,像是朋友圈.微博.头条等.这些移动化联网时代的 ...
- 亿级规模的Feed流推荐系统,如何轻松设计?
导读:互联网进入移动互联网时代,最具代表性的产品就是各种信息流,像是朋友圈.微博.头条等.这些移动互联网时代的新产品在过去几年间借着智能手机的风高速成长.这些产品都是Feed流类型产品,由于Feed流 ...
- 微博朋友圈亿级Feed流如何轻松设计?
简介 Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料. 在信息学里 ...
- 如何打造千万级Feed流系统
摘要: Feed流是一个目前非常常见的功能,在众多产品中都有展现,通过Feed流可以把动态实时的传播给订阅者,是用户获取信息流的一种有效方式.在大数据时代,如何打造一个千万级规模的Feed流系统仍然是 ...
- 为什么抖音快手这么吸引你?来看看什么是Feed流吧!
简介: Feed流是一个目前非常常见的功能,在众多产品中都有展现,比如微博,朋友圈,消息广场,通知,IM等.通过Feed流可以把动态实时的传播给订阅者,是用户获取信息流的一种有效方式.在大数据时代,如 ...
最新文章
- Maven多工程的创建
- windows电脑制作mac os u盘重装系统_图文演示u盘重装系统步骤
- html5 数字滚动选择器,Odometer使用JavaScript和CSS制作数字滑动效果
- Java字符串简化_关于java查询语句 如何简化的问题
- RuoYi-Cloud 进阶篇_04( Seata 高可用集群 AT模式 需求实战)
- python-第一个python程序-向世界问好
- 做个环保主义的程序员
- msys2软件包管理工具pacman常用命令
- 将绘图保存到图像文件,而不是使用Matplotlib显示
- 怎样把PDF换成EXCEL
- 从虚拟化到软件定义--重新定义IT产业格局
- 电商入门_仓库管理系统wms
- 计算机CPU核心部件简介
- 美团点评运营数据产品化应用与实践
- 【心理咨询师考试笔记】基础理论(二)——人格心理学
- 2017年大数据可视化机遇,这5大行业不容错过
- 基于STM32F429的语音识别交互系统
- 「react进阶」一文吃透React高阶组件(HOC)
- sja1000 中断_CAN总线 SJA1000中断
- 使用椭球表示物体的语义SLAM
热门文章
- 51单片机数码管小数点c语言,求助一个51单片机控制的数码管计算器带小数点功能的...
- 数据库设计_SQL数据库设计(数据建模)
- git submodule的工作原理
- 基于阈值和深度学习的玉米常见锈病严重程度自动模糊逻辑预测(工具+综述+玉米锈病严重程度数据集)
- Tensorflow2.0数据和部署(二)——基于设备的模型与TensorFlow Lite
- 强化学习组队学习task06——DDPG 算法
- 训练中Loss为Nan的原因,梯度消失或者爆炸的优化
- 泄漏计算机网络安全法情节,第十一章网络安全法第十二章电子商务纠纷的法律解决详细分解.doc...
- thinkpad扩展坞怎么用_顶级雷电3显卡扩展坞到底好用吗?技嘉 RTX2080Ti GAMING BOX测评...
- php过滤style,PHP过滤各种html标签