华为云企业级redis揭秘第六期:feed流场景中的应用-星辰平台

发表于 2021/03/24 10:24:07 2021/03/24
【摘要】 云数据库gaussdb(for redis)作为华为云旗下企业级redis,致力于为客户提供稳定可靠、超高并发,且能够极速弹性扩容的kv存储服务。

【最新活动】企业级redis专场热销中!首月免费,包年仅需4折!

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。因此我们需要一个持久化、海量存储、高吞吐、易扩展、低延迟、低存储成本的分布式存储系统。

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基础之上,较好平衡了性能和成本,能够广泛应用在智慧医疗、流量削峰、计数器等领域。


本文作者:华为云数据库gaussdb(for redis)团队
杭州/西安/深圳简历投递[email protected]
gaussdb(for redis)产品星辰平台主页

更多技术文章,关注gaussdb(for redis)官方博客

【星辰平台的版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。