美文网首页
系统设计 —— Feed 流

系统设计 —— Feed 流

作者: GOGOYAO | 来源:发表于2019-08-12 09:56 被阅读0次

参考资料

如何打造千万级Feed流系统
TableStore Timeline:轻松构建千万级IM和Feed流系统
Design the Twitter timeline and search
Feed系统架构资料收集

1. 表结构

1.1. Feed 内容库

内容库用于存储用户发送的消息。

列名 是否主键 说明
user_id yes 消息发送者的 id
message_id yes 消息 id,可以用时间戳
content no 消息内容
other no 其他信息

1.2. 同步表

同步方式,常见的方式有三种:

  • 推模式(也叫写扩散):和名字一样,就是一种推的方式,发送者发送了一个消息后,立即将这个消息推送给接收者,但是接收者此时不一定在线,那么就需要有一个地方存储这个数据,这个存储的地方我们称为:同步库。推模式也叫写扩散的原因是,一个消息需要发送个多个粉丝,那么这条消息就会复制多份,写放大,所以也叫写扩散。这种模式下,对同步库的要求就是写入能力极强和稳定。读取的时候因为消息已经发到接收者的收件箱了,只需要读一次自己的收件箱即可,读请求的量极小,所以对读的QPS需求不大。归纳下,推模式中对同步库的要求只有一个:写入能力强。
  • 拉模式(也叫读扩散):这种是一种拉的方式,发送者发送了一条消息后,这条消息不会立即推送给粉丝,而是写入自己的发件箱,当粉丝上线后再去自己关注者的发件箱里面去读取,一条消息的写入只有一次,但是读取最多会和粉丝数一样,读会放大,所以也叫读扩散。拉模式的读写比例刚好和写扩散相反,那么对系统的要求是:读取能力强。另外这里还有一个误区,很多人在最开始设计feed流系统时,首先想到的是拉模式,因为这种和用户的使用体感是一样的,但是在系统设计上这种方式有不少痛点,最大的是每个粉丝需要记录自己上次读到了关注者的哪条消息,如果有1000个关注者,那么这个人需要记录1000个位置信息,这个量和关注量成正比的,远比用户数要大的多,这里要特别注意,虽然在产品前期数据量少的时候这种方式可以应付,但是量大了后就会事倍功半,得不偿失,切记切记。
  • 推拉结合模式:推模式在单向关系中,因为存在大V,那么一条消息可能会扩散几百万次,但是这些用户中可能有一半多是僵尸,永远不会上线,那么就存在资源浪费。而拉模式下,在系统架构上会很复杂,同时需要记录的位置信息是天量,不好解决,尤其是用户量多了后会成为第一个故障点。基于此,所以有了推拉结合模式,大部分用户的消息都是写扩散,只有大V是读扩散,这样既控制了资源浪费,又减少了系统设计复杂度。但是整体设计复杂度还是要比推模式复杂。

用图表对比:

对比项 推模式 拉模式 推拉结合模式
写放大
读放大
用户读取延时 毫秒
读写比例 1:99 99:1 ~50:50
系统要求 写能力强 读能力强 读写都适中
常见系统 Tablestore、Bigtable等LSM架构的分布式NoSQL Redis、memcache等缓存系统或搜索系统(推荐排序场景) 两者结合
架构复杂度 简单 复杂 更复杂

介绍完同步模式中所有场景和模式后,我们归纳下:

  • 如果产品中是双向关系,那么就采用推模式。
  • 如果产品中是单向关系,且用户数少于1000万,那么也采用推模式,足够了。
  • 如果产品是单向关系,单用户数大于1000万,那么采用推拉结合模式,这时候可以从推模式演进过来,不需要额外重新推翻重做。
  • 永远不要只用拉模式。
  • 如果是一个初创企业,先用推模式,快速把系统设计出来,然后让产品去验证、迭代,等客户数大幅上涨到1000万后,再考虑升级为推拉集合模式。
  • 如果是按推荐排序,那么是另外的考虑了,架构会完全不一样,这个后面专门文章介绍。

同步表的结构如下

列名 是否主键 说明
user_id yes 消息接收者用户ID
sequence_id yes 消息顺序ID,可以使用timestamp + send_user_id,也可以直接使用Tablestore的自增列。
sender_id no 消息发送者的用户ID
message_id no store_table中的message_id列的值,也就是消息ID。通过sender_id和message_id可以到store_table中查询到消息内容
other no 其他信息

相关文章

  • 常见系统架构设计

    feed流设计 如何打造千万级Feed流系统Feed 流系统设计总纲 秒杀类的高并发设计 高并发系统的设计及秒杀实...

  • 系统设计 —— Feed 流

    参考资料 如何打造千万级Feed流系统TableStore Timeline:轻松构建千万级IM和Feed流系统D...

  • Feed流系统设计

    背景 Feed流:可以理解为信息流,解决的是信息生产者与信息消费者之间的信息传递问题。 我们常见的Feed流场景有...

  • feed流

    Feed流系统设计-总纲https://zhuanlan.zhihu.com/p/72882547 =======...

  • Feed流系统设计-总纲

    简介 Feed流系统特点 Feed流系统是一个数据流系统,所以我们核心要看数据。从数据层面看,数据分为三类,分别是...

  • Feed流系统设计-总纲

    简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,...

  • Feed流系统设计-总纲

    简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,...

  • 03-feed流细节详细解析

    图片流和feed流的区别: 图片流——以图片为主体 feed流——以内容为主体 feed英文有喂养的意思,feed...

  • 对于Feed流,你了解多少呢

    当我们在分析产品、设计产品时,相信对于Feed流这个词并不陌生。但是,除了知道Feed流是APP最常见的一...

  • feed流设计介绍

    简介 Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,...

网友评论

      本文标题:系统设计 —— Feed 流

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