Feed Flow基础设计
发布于 Aug 18, 2020 by ThinkCat.
Table of Contents
功能
做一个feed流项目,类似微博、朋友圈的功能,用户量预估比较小。主要有:
- 用户注册、登录
- 用户关系绑定:关注(加好友)、取关(删除好友),好友关系并非是严格的完整双向关系。
- feed流数据维护:关注下可见,取关不可见
- feed流数据可见性维护:仅限自己和好友
- 点赞、评论功能,评论均可见
- 好友聊天
设计
- 用户账号体系统一以mobile为唯一区分
- feed推模式:feed产生后,推送到不同的用户队列下
- 推荐feed,feed_id推送到用户的redis队列中,队列保持固定大小,新的feed放到前面
- 一条feed推送时候,可以按一定的规则,推送到不同的用户下
- 读取过的feed从队列中移除,一个feed仅被浏览一次。队列变小时候,发起推送补充。
- 推荐feed,翻页查询的时候,无需偏移量,仅需要limit
- 关注feed,按focus关注关系表,关联到feed表中的account_id,查询feed(多线程并发查询,并发量与分表数相同,考虑使用countDownLatch模式)。
- 分表策略:feed表按account_id分表
- 采用redis队列维护推荐feed,队列需要保证进去过的feed,极少会再次进来(拉取后从队列中移除,触发推送补充,补充尽量随机从不同分表中获取feed,采用布隆过滤器)
预估量:1000w用户
- 对应1000w的用户推荐feed队列,每个队列上限1000,内存不超过4G
- 每个用户平均产生1000条feed,共100亿数据,分表256张,平均单表5000w数据量,优化索引,可以支持
- 服务器CPU,内存性能,TODO
方案
基础架构
工具
- 持久化: mysql
- 缓存队列: 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