UP | HOME

Feed Flow基础设计
发布于 Aug 18, 2020 by ThinkCat.

Table of Contents

功能

做一个feed流项目,类似微博、朋友圈的功能,用户量预估比较小。主要有:

  1. 用户注册、登录
  2. 用户关系绑定:关注(加好友)、取关(删除好友),好友关系并非是严格的完整双向关系。
  3. feed流数据维护:关注下可见,取关不可见
  4. feed流数据可见性维护:仅限自己和好友
  5. 点赞、评论功能,评论均可见
  6. 好友聊天

设计

  1. 用户账号体系统一以mobile为唯一区分
  2. feed推模式:feed产生后,推送到不同的用户队列下
  3. 推荐feed,feed_id推送到用户的redis队列中,队列保持固定大小,新的feed放到前面
  4. 一条feed推送时候,可以按一定的规则,推送到不同的用户下
  5. 读取过的feed从队列中移除,一个feed仅被浏览一次。队列变小时候,发起推送补充。
  6. 推荐feed,翻页查询的时候,无需偏移量,仅需要limit
  7. 关注feed,按focus关注关系表,关联到feed表中的account_id,查询feed(多线程并发查询,并发量与分表数相同,考虑使用countDownLatch模式)。
  8. 分表策略:feed表按account_id分表
  9. 采用redis队列维护推荐feed,队列需要保证进去过的feed,极少会再次进来(拉取后从队列中移除,触发推送补充,补充尽量随机从不同分表中获取feed,采用布隆过滤器)

预估量:1000w用户

  1. 对应1000w的用户推荐feed队列,每个队列上限1000,内存不超过4G
  2. 每个用户平均产生1000条feed,共100亿数据,分表256张,平均单表5000w数据量,优化索引,可以支持
  3. 服务器CPU,内存性能,TODO

方案

基础架构

工具

  1. 持久化: mysql
  2. 缓存队列: redis

持久化数据

Account

字段 类型 说明
id bigint key
account varchar(50)  
password varchar(50)  
mobile char(11) unique
nick_name varchar(30) default:xxx
avatar text  
sex tinyint  
age tinyint  
area char(100)  
status_desc char(100)  
create_time datetime  
update_time datetime  

Follow

字段 类型 说明
id bigint  
account_id bigint  
follower_id bigint fans account id
create_time datetime  

Focus

字段 类型 说明
id bigint  
account_id bigint  
focus_id bigint focus account id
create_time datetime  

Feed

字段 类型 说明
id bigint key
account_id bigint  
body text  
files text  
area varchar(50)  
topic_ids varchar(100)  
visible_type tinyint  
likeCount int  
commentCount int  
delete tinyint  
create_time datetime  
soft_del_time datetime  

Feed_Comment

字段 类型 说明
id bigint key
feedId bigint  
comment text  
account_id bigint  
create_time datetime  
update_time datetime  

Feed_Like_Account

字段 类型 说明
id bigint key
feedId bigint  
likeAccountId bigint  
create_time datetime  
update_time datetime  

Comment_Like_Account

字段 类型 说明
id bigint key
commentId bigint  
likeAccountId bigint  
create_time datetime  
update_time datetime  

IM [TODO]

缓存数据

1.手机验证码

key: type + mobile, value(String): verify_code

2.点赞数据

key: type + feed_id, value(List): 点赞的账号id

3.用户推荐feed队列,上限1000

key:type + account_id, value(List): feed_id

4.用户在线状态

key: type + account_id, 有时效性,过期则认为不在线

接口设计

基本原则

除账户注册与登录接口,其他接口均需访问时候,在Header中增加token。

通用返回

字段 类型 说明
success Boolean  
code Integer  
errMsg String  
data <T> 业务数据

账号

  • 注册

    url:[Post] /api/account/regist

    入参:

    字段 类型 说明
    account String  
    password String  
    mobile String  
    verifyCode String  
    type Integer Regist Type

    出参: 通用返回


  • 登录

    url:[Post] /api/account/login

    入参:

    字段 类型 说明
    account String  
    password String  
    mobile String  
    verifyCode String  
    type Integer Regist Type

    出参: 通用返回+业务数据 T<String>: token


  • 更新基本信息

    url:[Post] /api/account/update

    入参:

    字段 类型 说明
    accountId Long  
    nickname String  
    age String  
    avatar String  

    出参: 通用返回


  • 换绑手机

    url:[Post] /api/account/bindMobile

    入参:

    字段 类型 说明
    accountId Long  
    mobile String  
    verifyCode String  

    出参: 通用返回


  • 查询账号信息

    url:[Get] /api/account/{accountId}

    出参:通用返回+业务数据 T (结构如下)

    字段 类型 说明
    accountId Long  
    nickname String  
    age String  
    avatar String  
    mobile String  
    area String  
    status_desc String  

Feed

  • 发表内容

    url: [Post] /api/feed/post

    入参:

    字段 类型 说明
    body String  
    files String  
    area String  
    topics String  
    visibleType Integer  

  • 拉取内容/列表

    url: [Get] /api/feed /[list]

    入参:

    字段 类型 说明
    type Integer  
    offset Integer  
    size Integer  

    出参:业务数据 [List]<T>

    字段 类型 说明
    body String  
    files String  
    area String  
    topics String  
    likeCount Integer  
    commentCount Integer  
    postTime Date  

Comment

  • 发布评论

    url:[Post] /api/comment

    入参:

    字段 类型 说明
    feedId Long  
    writerAccount Long  
    comment String  
    files String  
    likeCount Integer  

    出参:通用返回


  • 获取评论

    url: [Get] /api/comment/list

    入参:

    字段 类型 说明
    feedId Long  
    accountId Long  
    offset Integer  
    size Integer  

    出参: 业务数据 T

    字段 类型 说明
    feedId Long  
    writerAccount Long  
    comment String  
    files String  
    likeCount Integer  

Like

  • 点赞

    url:[Post] /api/like

    入参:

    字段 类型 说明
    likeId Long feedId or CommentId
    likeType Integer feed or comment