网易首页 > 网易号 > 正文 申请入驻

如何设计一个微博feed流

0
分享至

官方网站 www.itilzj.com 文档资料: wenku.itilzj.com

一. 背景

微博,微信朋友圈,抖音等都是典型的feed流产品,也就是我们的浏览内容都是由他人发的feed组成。

本篇文章尝试进行微博feed流的设计解析,如有问题欢迎大家指正。

二. 如何设计一个微博feed流

1. 存储设计

在数据存储上主要分三个部分

1)feed存储

是用户发布的内容存储,这部分内容需要永久存储,用户在查看个人主页的时候不论多久的都要可以看到

数据结构简化如下,根据userId进行水平分表

create table `t_feed`(`feedId` bigint not null PRIMARY KEY,`userId` bigint not null COMMENT '创建人ID'`content` text,`recordStatus` tinyint not null default 0 comment '记录状态')ENGINE=InnoDB;

2)关注关系存储

是用户之间关系的一个存储,也是控制用户能够看到feed范围的依赖,同样需要永久存储。

数据结构简化如下(待优化)根据userId进行水平分表:

CREATE TABLE `t_like`(`id` int(11) NOT NULL PRIMARY KEY,`userId` int(11) NOT NULL,`likerId` int(11) NOT NULL,KEY `userId` (`userId`),KEY `userId` (`likerId`),)ENGINE=InnoDB;


3)feed同步存储

用于feed流展示,可以理解为是一个收件箱,关注的人发布了feed,就要向其中投递。

可以根据业务场景保存一段时间内的内容,冷的数据可以进行归档也可以直接删除。

数据结构简化如下,根据userId进行水平分表:

create table `t_inbox`(`id` bigint not null PRIMARY KEY,`userId` bigint not null comment '收件人ID',`feedId` bigint not null comment '内容ID',`createTime` datetime not null)ENGINE=InnoDB;


2. 场景特点1) 读多写少

读写比例差距巨大,典型的读多写少场景。

2) 有序展示

需要根据timeline或者feed的打分值来进行排序处理展示。

3. 使用推模式实现

推模式也称写扩散模式,当被关注人发布内容后,主动将内容推送给关注,写入关注人的收件箱中。

1)方案

  1. 当被关注人发布一条内容以后,获取所有关注该人的用户,然后进行遍历数据,将内容插入这些用户的收件箱中,示例如下:


/** 插入一条feed数据 **/insert into t_feed (`feedId`,`userId`,`content`,`createTime`) values (10001,4,'内容','2021-10-31 17:00:00');
/** 查询所有粉丝 **/select userId from t_like where liker = 4;
/** 将feed插入粉丝的收件箱中 **/insert into t_inbox (`userId`,`feedId`,`createTime`) values (1,10001,'2021-10-31 17:00:00');insert into t_inbox (`userId`,`feedId`,`createTime`) values (2,10001,'2021-10-31 17:00:00');insert into t_inbox (`userId`,`feedId`,`createTime`) values (3,10001,'2021-10-31 17:00:00');

2、当用户ID为1的用户进行查看feed流时,就将收件箱表中的所有数据进行查出,示例如下:

select feedId from t_inbox where userId = 1 ;

3、对数据进行聚合排序处理


2)存在的问题1. 即时性较差

当大V被很多很多用户关注的时候,遍历进行粉丝进行插入数据非常耗时,用户不能及时收到内容

可尝试的解决方法:

1. 可将任务推入消息队列中,消费端多线程并行消费。2. 使用插入性能高、数据压缩率高的数据库


2. 存储成本很高

每个粉丝都要存储一份关注人的微博数据,大V粉丝量很高的时候,插入数据量成指数级上升。

并且微博可以将关注的博主进行分组,所以数据不仅要在全部收件箱中插入,也要在分组的收件箱中插入。

可尝试的解决方法:

数据冷热分离,热库仅保存短时间内的数据,冷库多保留一段时间的数据,冷热库均定时清理数据。


用户量不断上涨,使用这种设计方案,终究还是会遇到瓶颈

3. 数据状态同步

当被关注用户删除微博或取关某博主时,需要将所有粉丝的收件箱中的内容都删除,依然存在一个写扩散的即时性问题

可尝试的解决方案:

在拉取数据的时候对微博的状态进行判断,过滤已删除/已取关的微博过滤


以上解决方案可以在一定程度上提升效率,但是不能根源上解决问题。

3)小结

推模式仅适用于粉丝量不会太多的情况,例如微信朋友圈,这样能够比较好的控制好即时触达性、以及数据存储的成本。

对于微博大V这种粉丝量很大的场景并不适合。

4. 使用拉模式

拉模式也称读扩散模式,当我们使用拉数据的方式后,用户获取数据流程如下:

  1. 获取所有关注的博主ID。

select liker from t_like where userId = 1;

2. 根据博主ID进行内容拉取。

select * from t_feed where userId in (4,5,6) and recordStatus = 0;


  1. 获取所有内容后根据timeline进行排序。

这样的方案解决了在推模式下存在的三个问题,但是却也引发了另外的性能问题。

假如,用户关注的博主非常多,要拉取所有内容并进行排序聚合,这样的操作必定会耗时很多,请求时延很高。

那么如何做到低耗时,完成快速响应呢?

单纯依靠数据库是无法达到要求的,所以我们要在中间引入缓存层(分片),通过缓存来降低磁盘IO。

1)流程为:

  1. 关注列表缓存

将用户关注的所有博主ID存入缓存中。以用户ID为key,value为关注博主id集合

  1. 微博内容缓存

以博主ID为key,value为微博内容集合。博主发布微博后,将微博内容存入集合中

  1. 获取feed流时

根据关注的博主id集合,在所有缓存分片节点上拉取所有内容并进行排序聚合。

假如缓存分片集群为三主三从,也就是一共需要三次请求即可拉取到所有内容,然后进行时间倒排,响应给用户

2)存在的问题

  1. 系统的读压力很大

假如用户关注了1000个博主,那么需要拉取这1000个博主的所有发布内容,进行排序聚合,对于缓存服务,以及带宽压力都很大。

可尝试的解决方案:

缓存节点一主多从,通过水平扩容,来分散读压力和带宽瓶颈


3)小结

对于大V用户,拉模式能够很好解决写扩散存在的问题,同时也会带来上述存在的问题。

三. 总结

分析完推模式和拉模式的优缺点,我们很容易发现

  1. 推模式适合于粉丝量不大的场景。例如朋友圈,一对一聊天。

  2. 拉模式适合粉丝量巨大的大V用户。例如微博大V。

所以在场景设计时,可以将推模式和拉模式结合使用。逻辑如下

  1. 设定一个大V粉丝量阈值,达到阈值后触发打用户标签事件。

  2. 对于未达到阈值的用户依然使用写扩散方式,这样冗余的数据量不会太大,也不存在即时性问题。

  3. 当达到阈值的用户发微博的时候,将微博内容存入缓存(热数据),不进行写扩散,而是粉丝拉取数据与收件箱中的数据进行排序聚合。

PS:这里还可以通过用户行为去维护一个活跃粉丝列表,对于该列表中的粉丝,同样进行一个写扩散的行为,保证即时触达。

IT架构师/技术大咖的交流圈子,为您提供架构体系知识、技术文章、流行实践案例、解决方案等,行业大咖分享交流/同行经验分享互动,期待你的加入!扫码即可加入哦,随着材料不断增多社群会不定期涨价早加入更优惠

免责声明:

本公众号部分分享的资料来自网络收集和整理,所有文字和图片版权归属于原作者所有,且仅代表作者个人观点,与本公众号无关,文章仅供读者学习交流使用,并请自行核实相关内容,如文章内容涉及侵权,请联系后台管理员删除。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
亏损180亿,多家门店关闭,又一新能源车企倒下!车主成韭菜了?

亏损180亿,多家门店关闭,又一新能源车企倒下!车主成韭菜了?

谈车工坊
2024-11-28 23:10:03
廷贝尔:进很多球的比赛总是很有意思;对阵曼联会很艰难

廷贝尔:进很多球的比赛总是很有意思;对阵曼联会很艰难

懂球帝
2024-12-01 04:23:07
楼市要塌了?澳洲房东,紧急卖房!

楼市要塌了?澳洲房东,紧急卖房!

澳洲财经见闻
2024-11-30 14:55:53
下午16点20,辽篮空降目的地!全员换装,迎来两大喜讯,剑指四连胜

下午16点20,辽篮空降目的地!全员换装,迎来两大喜讯,剑指四连胜

君马体育
2024-11-30 18:24:54
1-4惨败,18分钟连丢4球,中国女足下半场大崩盘,遭世界第11逆转

1-4惨败,18分钟连丢4球,中国女足下半场大崩盘,遭世界第11逆转

侧身凌空斩
2024-11-30 06:41:49
马斯克语出惊人,直言不讳:现在只有特斯拉是中国新能源车的对手

马斯克语出惊人,直言不讳:现在只有特斯拉是中国新能源车的对手

小企鹅侃世界
2024-11-20 14:56:32
日媒:中国网红擅闯日本政府办公楼拍摄并上传视频,涉及15个日本地方县市…

日媒:中国网红擅闯日本政府办公楼拍摄并上传视频,涉及15个日本地方县市…

日本物语
2024-11-30 16:06:43
好癫!向家是真缺钱了

好癫!向家是真缺钱了

清唱
2024-11-30 19:20:05
半夜接到陌生电话要我挪车,我果断拒绝,第二天才发现躲过一劫

半夜接到陌生电话要我挪车,我果断拒绝,第二天才发现躲过一劫

五元讲堂
2024-09-02 10:53:43
中国女足惨遭吊打:18分钟连丢4球,1-4负世界第11 全场仅1次射正

中国女足惨遭吊打:18分钟连丢4球,1-4负世界第11 全场仅1次射正

风过乡
2024-11-30 07:44:53
2015年胖东来因天价租金被逼走,旧址现状凄惨,当地人却感谢房东

2015年胖东来因天价租金被逼走,旧址现状凄惨,当地人却感谢房东

爱看剧的阿峰
2024-11-30 19:13:13
巴拉圭外长:在与台湾不“断交”基础上,可无条件与中国大陆建交

巴拉圭外长:在与台湾不“断交”基础上,可无条件与中国大陆建交

讯崽侃天下
2024-11-30 22:32:16
华为mate70这招有点猛啊,黄牛们都傻眼了

华为mate70这招有点猛啊,黄牛们都傻眼了

3C毒物
2024-11-30 09:49:25
足坛悲喜夜!巴萨爆冷+53年之耻,枪手5:2,曼城跌到第4,拜仁1:1

足坛悲喜夜!巴萨爆冷+53年之耻,枪手5:2,曼城跌到第4,拜仁1:1

阿超他的体育圈
2024-12-01 03:53:15
突发公告:退出哈尔滨冰雪大世界

突发公告:退出哈尔滨冰雪大世界

鲁中晨报
2024-11-30 22:04:20
突然确诊癌症!浙江90后宝妈惊了:不痛也不痒!很多人发现就是晚期

突然确诊癌症!浙江90后宝妈惊了:不痛也不痒!很多人发现就是晚期

鲁中晨报
2024-11-30 07:20:12
刘洋大校再添一星,最牛女性航天员,晋升女将军已经在路上

刘洋大校再添一星,最牛女性航天员,晋升女将军已经在路上

观察鉴娱
2024-11-30 14:10:57
冰山一角!武汉同济医院骨科沦陷,18名医生收回扣2800万元后续

冰山一角!武汉同济医院骨科沦陷,18名医生收回扣2800万元后续

莆农阿
2024-11-30 19:01:17
卡米拉整容!出席“王后阅览室”美艳逼人,老公查尔斯直接看呆了

卡米拉整容!出席“王后阅览室”美艳逼人,老公查尔斯直接看呆了

小寒嫣语
2024-11-30 21:42:53
断供不了芯片,那就断供指纹识别!

断供不了芯片,那就断供指纹识别!

星辰故事屋
2024-11-28 15:08:39
2024-12-01 04:48:49
IT架构师联盟
IT架构师联盟
IT架构实战分享
710文章数 7653关注度
往期回顾 全部

科技要闻

官宣!华为+广汽,联手造车!

头条要闻

八年来首次 叙利亚反对派武装攻入阿勒颇大部分地区

头条要闻

八年来首次 叙利亚反对派武装攻入阿勒颇大部分地区

体育要闻

历史第一!詹姆斯再创里程碑宝刀不老

娱乐要闻

恶意炒作!李行亮麦琳和好后口碑崩塌

财经要闻

雪松爆雷前实控人张劲在香港抛售房产

汽车要闻

比亚迪方程豹豹8推送首次OTA 新增暴力模式

态度原创

健康
亲子
教育
旅游
军事航空

花18万治疗阿尔茨海默病,值不值?

亲子要闻

巴勒斯坦小女孩喂养妹妹,他们俩是彼此唯一的依靠

教育要闻

傅佩荣:拼命卷孩子,其实是家长太焦虑了

旅游要闻

驻意大利使馆提醒旅意中国公民注意风险防范

军事要闻

叙反对派武装近10年来首次攻入阿勒颇

无障碍浏览 进入关怀版