Feed流系统设计

1 篇文章 0 订阅
1 篇文章 0 订阅

Feed流系统简介

Feed 是一种数据格式,用于给订阅的用户提供持续更新的内容,内容大多是基于时间线的方式呈现,“从上往下流动”,通常称为Feed流。

移动互联网时代,国内最具代表性的Feed流类产品包括微信、微博、抖音,它们各具特点。

产品特点
微信双向关系,需要相互添加好友才能看到对方的动态
微博单向关系,添加关注,就可以订阅对方的动态
抖音个性化推荐,不需要建立关系就可以看到别人发布的内容

Feed流系统要素

Feed流系统是比较典型的发布-订阅模式,其本质是发布者发布的数据如何精准的送达给订阅者,核心要素包括以下三点

  • 发布者发布的数据:发布者产生数据,然后数据需要按照发布者组织,需要根据发布者查到所有数据,比如微博的个人页面、微信朋友圈的个人相册等。
  • 订阅者收到的数据:从不同发布者那里获取到的数据,然后通过某种顺序(一般为时间线)组织在一起,比如微博的首页、微信朋友圈首页等。
  • 个体之间的关系:包括单向关系(关注)、双向关系(好友)、推荐(推荐属于特殊关系,可以是单向的、也可以是双向的、也可以是无关系,甚至可以是多种关系组合)。

Feed流系统设计

设计Feed流系统时最核心的是确定清楚产品层面的定义,需要重点考虑产品用户规模和用户关系两个关键因素,后面以微信朋友圈为例,展开介绍。

  • 产品用户规模
    用户规模在十万、千万、十亿级时,设计难度和侧重点会不同。

  • 用户关系
    如果是双向,那么就不会有大V,否则会有大V存在,单向关系时,那么可能就会存在大V,大V的粉丝数量理论极限就是整个系统的用户数

微信朋友圈的特点
  • 朋友圈动态基于时间线倒序展示;
  • 好友之间动态可以相互评论和点赞;
  • 朋友圈动态属于典型的读多写少场景,动态的浏览量远大于发布量;
  • 用户发布或删除的动态,对其好友可见的实时性要求不高;
  • 用户发布的动态需要过spam和人工审核,可以先发后审,也可以先审后发。
技术选型-推还是拉
模式优点缺点适用场景
拉模式写简单读复杂,读取耗时不可控系统用户规模不大、系统存在大V用户
推模式读简单写复杂,数据一致性挑战用户关系数量,或上限较小
  • 拉模式
    拉模式又称读扩散,在数据读取的时候进行扩散,一次读请求可能会涉及好几个地方数据的读取,并且需要分别记录每次数据读取的位置,读取耗时不可控。用户浏览朋友圈时,需要拉取自己和好友的动态列表重新排序后返回。拉模式是产品之初最容易想到的方案,因为这种模式在用户量和数据量小的情况下实现简单,也符合人们正常的思维模式,但数据量稍微大一点,其缺点也特别突出。
    在这里插入图片描述

  • 推模式
    推模式又称写扩散,一般是数据(动态ID)存储多份,虽然有所冗余,但是读取的效率可以提高不少。用户添加删除好友、发布或删除动态后需要对好友的朋友圈列表进行同步,对数据一致性提出了一定的挑战。

  • 推拉结合
    基于朋友圈读多写少的特点,并且当下硬件资源并不紧缺,写扩散是更为合适的处理方式。因为有类似官方号、广告主等大V用户,其粉丝数量众多,使用推模式成本较高,因此不能完全抛弃拉模式。
    在这里插入图片描述

数据一致性的挑战

推模式对数据一致性提出了新的挑战,用户添加删除好友、发布或删除动态后需要对好友的朋友圈列表进行同步。

由于用户发布或删除的动态,对其好友可见的实时性要求不高,因此可以通过异步处理、出错重试、定时任务纠错兜底的方式保证数据的最终一致性。(定时任务只需要处理当天好友或动态发生改变的用户即可,从而减少计算量)
在这里插入图片描述

性能优化
  • 一致性哈希和本地缓存
    用户资料、设置、关系等查询频率非常高,本地缓存可以大幅提升响应速度。可以通过一致性哈希算法根据用户ID进行哈希,相同用户的资料、设置、关系等缓存在同一个实例本地,这样既可以避免重复缓存浪费内存,又可以水平扩展。然后通过redis pubsub(或者 zk)通知机制和缓存过期保证缓存一致性。
    这里推荐使用 CaffeineCache 作为本地缓存,CaffeineCache 是基于java8实现的新一代缓存工具,缓存性能更加优秀。
    在这里插入图片描述

  • 多线程并行拉取
    当朋友圈一页请求的数据较多时,可以动态切分任务,使用多线程并行拉取。
    在这里插入图片描述

  • 用户ID去重
    朋友圈同一页动态列表中,多条动态可能都是同一个人发表的,动态的发布者也可能对本页其他动态进行了评论或表态。同一页动态中会存在很多重复的用户,因此查询用户信息之前先对用户ID进行去重,从而可以减少了缓存和数据库的调用次数。

  • 减少缓存回源次数
    查询用户信息可以通过使用类似 redis mget 的方式批量获取,减少缓存击穿后对数据库的调用次数。

  • 冷热数据分离
    动态基于时间线的展示特点,意味着越新的数据曝光率越高,因此 redis 同步库只保留最近一段时间的热度数据即可,冷数据存入HBASE。

  • 动态、评论、表态异步加载
    动态、表态、评论数据可以异步返回,可以加载动态的同时、异步加载评论和表态数据。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值