常用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流需要一定时间,所以这期间用户只能拉到旧的微博
未经允许,请不要转载
常用Feed流架构实现的更多相关文章
- 数据人看Feed流-架构实践
背景 Feed流:可以理解为信息流,解决的是信息生产者与信息消费者之间的信息传递问题.我们常见的Feed流场景有:1 手淘,微淘提供给消费者的首页商品信息,用户关注店铺的新消息等2 微信朋友圈,及时获 ...
- Feed流系统重构-架构篇
重构,于我而言,很大的快乐在于能够解决问题. 第一次重构是重构一个c#版本的彩票算奖系统.当时的算奖系统在开奖后,算奖经常超时,导致用户经常投诉.接到重构的任务,既兴奋又紧张,花了两天时间,除了吃饭睡 ...
- 从小白到架构师(4): Feed 流系统实战
「从小白到架构师」系列努力以浅显易懂.图文并茂的方式向各位读者朋友介绍 WEB 服务端从单体架构到今天的大型分布式系统.微服务架构的演进历程.读了三篇万字长文之后各位想必已经累了(主要是我写累了), ...
- 如何打造千万级Feed流系统
from:https://www.cnblogs.com/taozi32/p/9711413.html 在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈 ...
- Feed流系统设计-总纲
https://mp.weixin.qq.com/s/ccxM2thPbzg5vDWgGVJ5vQ 作者:少强 简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代 ...
- feed流拉取,读扩散,究竟是啥?
from:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961214&idx=1&sn=5e80ad6f2 ...
- 流动的推荐系统——兴趣Feed技术架构与实现
流动的推荐系统 我们经常谈论的推荐系统(Recommender System),从形式上看是比较“静态”的推荐,通常位于网页主要信息的周边,比如电商网站的“看了又看”.“买了又买”.这种推荐系统在大多 ...
- 微博Feed流
一.微博核心业务图 二.微博的架构设计图 三.简述 先来看看Feed流中的一些概念: Feed:Feed流中的每一条状态或者消息都是Feed,比如微博中的一条微博就是一个Feed. Feed流:持续更 ...
- Feed 流系统杂谈
什么是 Feed 流 Feed 流是社交和资讯类应用中常见的一种形态, 比如微博知乎的关注页.微信的订阅号和朋友圈等.Feed 流源于 RSS 订阅, 用户将自己感兴趣的网站的 RSS 地址登记到 R ...
随机推荐
- tomcat不需要重启热部署xml文件
项目中,遇到情况,有时候增加struts的配置了,有时候粗心改错了,然后急需要发布线上吧,又不能重启影响其他的,最后发现struts有这个功能呢! 在struts.xml的配置文件中加上一句话就行 & ...
- Oracle粗心大意总结篇
有时候写sql语句不细心的话,很容易犯大错误,导致你纠结好久,找不到原因,慢慢总结: 错误1: SELECT * FROM( SELECT USER.*, ROWNUM AS CON FROM USE ...
- [Linxu] Ubuntu下载mysql
//下载: sudo apt install mysql-server sudo apt install mysql-client sudo apt install libmysqlclient-de ...
- 个人永久性免费-Excel催化剂功能第35波-Excel版最全单位换算,从此不用到处百度找答案
全球化的今天,相信我们经常可以有机会接触到外国的产品,同时我们也有许多产品出口到外国,国与国之间的度量单位不一,经常需要做一些转换运算,一般网页提供这样的转换,但没有什么比在Excel上计算来得更为方 ...
- VUE过滤器的使用 vue 时间格式化
过滤器介绍 官方教程地址:https://cn.vuejs.org/v2/guide/filters.html 过滤器常被用于一些文本格式化 我们可以自定义过滤器,可以实现各种各样的功能. vue时间 ...
- Spring 整合 ibatis
是的,真的是那个不好用的ibatis,不是好用的mybatis. 由于工作需要用到ibatis需要自己搭建环境,遇到了不少的坑,做一下记录. 一.环境配置 Maven JDK1.6 (非常重要,使用S ...
- springBoot综合开发
作者:纯洁的微笑出处:www.ityouknow.com 版权所有,欢迎保留原文链接进行转载:) 上篇文章介绍了Spring boot初级教程:spring boot(一):入门篇,方便大家快速入门. ...
- Shell基本语法---shell脚本的输入以及脚本拥有特效地输出
shell脚本的输入 语法:read -参数 -p:给出提示符.默认不支持"\n"换行 -s:隐藏输入的内容 -t:给出等待的时间,超时会退出read,单位是秒 -n:限制读取字符 ...
- 实用小工具推荐 OpenWrite
[实用小工具推荐]给技术同学们推荐一款比较好用的工具,可以实现一稿多发,主流的技术渠道基本涵盖了:https://www.openwrite.cn/ 因为工作的关系,认识了很多做技术公众号的小伙伴,同 ...
- poj 1068 模拟
题目链接 大概题意就是告诉你有个n个小括号,每一个")"左边有多少个"("都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身). 思路: 我先计算 ...