华为云 PB 级数据库 GaussDB(for Redis) 揭秘第六期:Feed 流场景中的应用
摘要:探讨常见的 Feed 流系统包含的概念、架构和挑战以及如何使用高斯 Redis 设计一个 Feed 流系统。
本文分享自华为云社区《华为云PB级数据库GaussDB(for Redis)揭秘第六期:Feed流场景中的应用》,原文作者:高斯 Redis 官方博客。
一、背景
GaussDB(for Redis)(下文简称高斯 Redis),是华为自研的强一致、持久化 NoSQL 数据库,兼容 Redis5.0 协议。
在互联网时代,我们日常生活充斥着 Feed 流,微信朋友圈、微博、抖音以及头条等等都在使用 Feed 流,将我们关注的好友或感兴趣的内容及时推送给我们,使我们沉沦其中无法自拔,带来商业价值的提升。接下来将和大家一起探讨常见的 Feed 流系统包含的概念、架构和挑战以及如何使用高斯 Redis 设计一个 Feed 流系统。
二、 概念
Feed 流系统从形式上是 Feed 生成者将生产的 Feed 经过存储分发系统传递给 Feed 消费者,最终以某种展现形式。
1. Feed:单次推送的内容。 一条微博就是一个 Feed。
2. Feed 流:由连续的 Feed 组成的信息流。
3. 展现形式:展示形式目前主要有 Timeline 和 Rank。比如微博以 Timeline 展示。头条客户端主要以推荐 Rank 来进行展示。
4. Feed 生产者:对于微博就是每个用户,针对头条就是推荐算法。
5. Feed 消费者:接收 Feed 通知的主体。
6. 同步存储系统:这部分一般又可以分为三部分(具体实现会略有差异)。
6.1 内容存储模块:这部分关心 Feed 原始内容如何存储。如你发的一条微博。
6.2 关联关系存储模块:对于微博存储的是用户的关注人和被关注人,对于头条存储的是人群(根据用户画像对所有用户进行分类)
6.3 信箱模块:一般又可叫做消息传递模块,Feed 消息存储到信箱,才能最终形成 Feed 流。
三、架构设计
通过上述的概念介绍,我们来看 Feed 如何从 Feed 生产者最终流转到 Feed 消费者。
Feed 生产者创作一条内容后发到 Server 端,Server 端先将消息内容存储到消息存储模块,接着根据信箱模块的设计查询关系存储库将通知信息写入信箱模块, Feed 消费者通过查询信箱获取及时消息。
消息存储模块:
Feed 内容一般都是半结构化数据,数据量大,需要持久化内容,逻辑上就是一个 KV 系统,ID 到内容的映射关系。
关系存储模块:
关联关系会发生新增和删除,是一个变长的集合,需要能够支持快速的增删查动作,一般不需要支持 join 等复杂操作。因此 NoSQL 数据库比较适合这类数据的存储。
信箱模块:
说到信箱模块一般大家都会讨论是采用推模式、拉模式或推拉模式结合方式。在华为云 PB 级数据库 GaussDB(for Redis)揭秘第五期:高斯 Redis 在 IM 场景中的应用也有过讨论。
推模式,在查询完关联关系后,将 Feed 通知写入到每个 Feed 消费者的收件箱中,Feed 消费者查询自己的收件箱就能获取完整的 Feed 流,通知会写入每个需要通知的人收件箱,写会放大。
拉模式,将 Feed 通知写入自己的发件箱,Feed 消费者先查询关系库,然后从所有关注人的发件箱中获取 Feed 消息后合并展示,因此收件箱被读次数和被关注人数目有关,读会放大。
推拉模式结合:针对大多数用户的写入用推模式,特定用户采用拉模式,Feed 消费者读取时分别读取自己的收件箱和特定用户的发件箱,合并之后展示。
究竟选用哪种模式,看具体业务场景和要求。
很多业务在具体实现的时候,会先将消息写入消息队列,一方面可以起到流量削峰的作用,另一方面可以实现一些特定的推送优化逻辑,如判断为垃圾广告或者敏感词不进行推送。
四、技术挑战
我们首先从微信朋友圈公布的数据来感受一下。在 2021 年 1 月 19 日,在微信公开课 Pro 上微信创始人张小龙披露微信最新数据:微信每天有 7.8 亿用户进入朋友圈,1.2 亿用户发表朋友圈。平均每人打开浏览十几次,每天 100 亿次浏览量。若我们想实现类似的 Feed 流系统会有什么挑战。从存储量上来看,若用户平均每天发送 3 次朋友圈,每条内容 1kB,一年大约 1000 亿条记录,存储容量接近 100TB。从访问请求次数来看,每天写入和读取 OPS 峰值至少百万级别,用户写入和读取延迟都要有实时性,响应时间至少都要在秒级内,否则用户分分钟关闭 APP。因此我们需要一个持久化、海量存储、高吞吐、易扩展、低延迟、低存储成本的分布式存储系统。
五、高斯 Redis 的优势
5.1 高斯 Redis 简介
高斯 Redis 是华为云数据库团队自主研发且兼容 Redis5.0 协议的云原生数据库,采用计算存储分离架构。存储侧使用自研的存储系统 DFV,容量无限扩展、强一致、高可靠。计算侧基于 LSM 存储引擎实现,具有极佳的写性能和读性能。利用计算分离架构的优势,高斯 Redis 扩容无需进行数据拷贝,实现秒级扩容,充分发挥了云原生的弹性伸缩、资源共享的优势。
5.2 Feed 流场景如何利用高斯 Redis 优势
针对 Feed 流场景,可以按照如下方式使用高斯 Redis:
1. 消息内容存储
利用高斯 Redis 的 KV 结构即可实现,高斯 Redis 采用存储计算分离架构,可以轻松支撑海量数据存储及低延迟访问延迟。
2. 关联关系存储
高斯 Redis 集合结构或字典结构可以轻松实现关联关系的增删改查。
3. 信箱存储
信箱从实现上就是一个队列,支持从指定位置消费的能力。高斯 Redis 的 Stream 结构可以实现队列能力,轻松实现 Feed 流消息读取。
5.3 高斯 Redis Feed 流实践
以下用高斯 Redis 实现一个简单的微博样例,采用写扩散模型,用以说明可行性。
系统中存在四个用户,Jay、Jolin、ZhangSan、LiSi。其中 ZhangSan、LiSi 关注了 Jay,LiSi 同时关注了 Jolin。
以上实现了一个简单的微博系统,真实系统会比这个复杂,会涉及业务场景特定处理逻辑。用高斯 Redis 作为 Feed 流存储底座是比较理想的技术选型。
六、总结
高斯 Redis 具有持久化、海量存储、高吞吐、易扩展、低延迟、低存储成本等优点, 作为 Feed 流存储底座非常合适,其优异的读写性能和高级特性将会极大简化应用开发。同时,高斯 Redis 在开源 Redis 基础之上,较好平衡了性能和成本,能够广泛应用在智慧医疗、流量削峰、计数器等领域。
七、结束
本文作者:华为云高斯 Redis 团队。
更多技术文章,关注高斯 Redis 官方博客:
https://bbs.huaweicloud.com/community/usersnew/id_1614151726110813
八、参考资料
1. 《GaussDB(for Redis)官方主页》
https://www.huaweicloud.com/product/gaussdbforredis.html
2. 《华为云 GaussDB(for Redis)与自建开源 Redis 的成本对比》
3. 《华为云 PB 级数据库 GaussDB(for Redis)揭秘第一期:Redis 与存算分离》 https://bbs.huaweicloud.com/blogs/238584
4. 《华为云 PB 级数据库 GaussDB(for Redis)揭秘第二期:Redis 消息队列 Stream 的应用探讨》 https://bbs.huaweicloud.com/blogs/245623
5. 《华为云 PB 级数据库 GaussDB(for Redis)揭秘第五期:高斯 Redis 在 IM 场景中的应用》 https://bbs.huaweicloud.com/blogs/249247
6. 《feed 流拉取,读扩散,究竟是啥?》
https://cloud.tencent.com/developer/article/1168948
7. 《朋友圈微博 feed 流,推拉实践》
https://cloud.tencent.com/developer/article/1168946
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/373fffca34c17f8f142dd02fc】。文章转载请联系作者。
评论