美文网首页
feed流 读扩散和写扩散 2022-06-28

feed流 读扩散和写扩散 2022-06-28

作者: 9_SooHyun | 来源:发表于2022-06-28 20:33 被阅读0次

feed流

微信朋友圈、微博、小红书,都是典型的feed流应用

通俗的说就是用户拥有发布者粉丝两种角色,依据用户的关注关系展示的信息流就是feed流

一条独立的消息就是一个feed基本单元

feed业务特点

用户与用户之间存在明显的好友关系
用户可以看到的信息流依据好友follow关系得到

核心业务动作是什么?
(1)关注,取关;
(2)发布feed;
(3)拉取自己的主页feed流

设计feed流应用的架构

要说在前面的是,任何情况下,要么以时间换空间,要么以空间换时间,一般难以二者兼顾
比如一些常规业务中,数据库冗余一些字段可以方便地提高查询效率,但是额外牺牲了存储空间

最基本框架

显然,对于每一个用户,最起码需要记录【用户-粉丝】和【用户-已关注人】、【用户-本人消息】这3种关联关系

对于好友关系
如果只记录【用户-粉丝】而 不记录【用户-已关注人】,也可以
但是这种情况下,如果需要获取用户U的关注人列表,那就得遍历所有用户,筛选出粉丝中有用户U的若干用户。用户量一大,这个时间成本是不能接受的,因此需要记录【用户-已关注人】关系
实际上,【用户-粉丝】和【用户-已关注人】是互相冗余的,知一推一。但是为了效率,需要冗余一份

读扩散和写扩散

看下不同架构下,完成3个核心动作的具体实现差异

  • 只记录【用户-本人消息】
    • 关注、取关。update【用户-粉丝】和【用户-已关注人】表
    • 发布、删除feed。insert into / delete from【用户-本人消息】
    • 拉取自己的主页feed流。当用户U拉取主页feed信息流时,需要从每个已关注人的消息列表中拉取、排序、整合后展示

关注,取关,发布、删除feed的业务流程非常简单,存储消耗小
读取feed流需要实时拉取、排序和整合
用户发布一个Feed单元,后台会扩散为N次读操作(N为粉丝人数)以及一次聚合操作,因此称为读扩散。每次读Feed流相当于去关注者的收件箱主动拉取帖子,因此也得名——拉模式。这就是读扩散模式,也叫拉feed模式

读扩散的优点:
写操作(发消息)很轻量,只需要往相应的消息存储写一次就好了
读扩散的缺点:
唯独读操作(读消息)很重
如果用户关注的人很多,那么一次拉取的时延将很高,用户体验受到影响

那么,为了换取良好的用户体验,一个自然的想法就是当别人发消息的时候,往所有粉丝的“收件箱”都投递一份消息副本,这样每个粉丝可以直接从自己的“收件箱”拉取消息,而无需去每个关注人的发件箱翻查并整合消息。于是:

  • 如果在【用户-本人消息】基础上, 额外记录【用户-可见消息】(也是一种冗余)
    • 关注、取关。update【用户-粉丝】和【用户-已关注人】表,and insert into 新关注人的【用户-可见消息】 / delete from 被取关人的【用户-可见消息】
    • 发布、删除feed。insert into / delete from【用户-本人消息】,and 异步 insert into / delete from 所有粉丝的【用户-可见消息】
    • 拉取自己的主页feed流。当用户U拉取主页feed信息流时,直接从【用户-可见消息】拉取

关注,取关,发布、删除feed的业务流程复杂度变高,存储消耗大(一份消息要推送给所有的粉丝,产生大量副本)
但是读取feed流非常简单
但是,如果一个用户上亿粉丝,写扩散模式下异步投递feed消息到【粉丝-可见消息】是非常重且高时延的操作,可能要几分钟后才能给所有的粉丝发完
这就是写扩散模式,也叫推feed模式

写扩散优点:
读操作很轻量
写扩散缺点:
写操作很重,尤其是对于群聊来说

通常写扩散适用于好友量不大的情况,比如微信朋友圈正是写扩散模式。每一名微信用户的好友上限为5000人,也就是说你发一条朋友圈最多也就扩散到5000次写操作

读写扩散的消息通知时机

写扩散模式用户可以自动收到最新消息通知而无需额外操作,类似于回调。像朋友圈点赞、评论的通知,就是写扩散
而读扩散模式则需要用户登录或刷新动作才能知道是否有新内容,类似主动轮询

参考:https://www.51cto.com/article/697949.html

相关文章

  • feed流 读扩散和写扩散 2022-06-28

    feed流 微信朋友圈、微博、小红书,都是典型的feed流应用 通俗的说就是用户拥有发布者和粉丝两种角色,依据用户...

  • 事件捕获和事件冒泡

    事件捕获 事件流由document 向下扩散到目标对象的过程。 事件冒泡 事件流由目标对象向上扩散到documen...

  • IM群聊消息究竟是存1份(即扩散读)还是存多份(即扩散写)?

    1、前言 IM的群聊消息,究竟存1份(即扩散读方式)还是存多份(即扩散写方式)? 上一篇文章《IM群聊消息的已读回...

  • 扩散和温度

    冷水洗澡不掉灰, 热水洗澡灰满盆; 闷热公交味熏人, 开了空调气清新; 夏天垃圾臭十米, 冬天臭气难寻觅; 凉水加...

  • 扩散

    天天窝在家里实在烦。前段时间天天下雨,昨天明知没啥事也上县去转了一趟。 大概是9点到县城西门口,老远就望到右手边那...

  • 扩散

    3.7,周六 8时起床,完成学习强国43分,订阅加1分,排名仍为11,无变动。 国外确诊病例已达17000,全球近...

  • 扩散

    大家都知道我要说什么,但是呢,我没法说那个的,也没法说那个词,因为这是不允许说的事情,但是我告诉大家的是大家也都知...

  • 扩散

    才明白,原来,向别人倾诉,并不能缓解烦恼。 反而,会让你更加烦恼。

  • 扩散

    一瞬间从2019跨到2022 可能是疫情吧 也有可能是 从20到30的跨度有点大 忽然又有种 那天坐在广州街头的失...

  • 数据存储结构设计,是读扩散,还是写扩散?

    今天在某个即时通讯的群中无意看到这么一句话: 不由问自己,什么是读扩散?什么是写扩散?感觉这两个词昨天才看的,怎么...

网友评论

      本文标题:feed流 读扩散和写扩散 2022-06-28

      本文链接:https://www.haomeiwen.com/subject/tzlzvrtx.html