03 关注流调研

Wu Jun 2020-01-14 12:23:25
08 系统设计 > 2 业务设计

https://www.zhihu.com/question/19645686/answer/85075806

一、调研 - 懂车帝

1 展示

1)没有关注 or 没有登陆

2)关注后

2 动作

未分库分表,in 可以走索引

1)上拉

2)下拉

请求新数据

3 讨论

1)behot_time 与 display_time

2)展示内容 - 作者与类别

目前看到的请求,每次8个动态,未发现根据作者或动态类别平均展示的情况,都是按 behot_time 顺序,可能连续都是同一作者的动态,也可能连续都是同一类型的动态。

二、设计 - 拉

基于“按照发布时间顺序展示关注对象的动态(视频、文章、微头条)”,未分库时的设计:

假设每次请求返回数据 N 条:

请求时后台判断关注数:

1 上拉

1)首次请求

请求处理

查询次数:m(来源数)
涉及数据:m*N(展示数)

结果处理

2)再次请求

请求处理

查询次数: m(来源数)
涉及数据:m*N(展示数)

结果处理

2 下拉

切换到关注页时,若本地没有已加载数据,都会自动“拉取”一次,所以请求处理都有max_time。

请求处理

查询次数:m(来源数)
涉及数据:m*N(展示数)

结果处理

三、设计 - 推

效率太低

1 timeline 表

属性 含义
id 主键
user_id 用户id
media_id 媒体id
source 来源(1视频;2文章;3微头条)
source_id 来源id
post_time 发布时间

唯一索引(user_id+media_id)
普通索引(user_id+post_time)

2 操作

1)用户查询动态

  1. 在 timeline 表查询用户小于 max_time 的前 N 条新动态
    select * from timeline where user_id = $user_id and post_time < $max_time order by post_time limit N
    
  2. 根据 source 和 source_id 去各渠道获取动态详情,合并排序返回
    select * from source_table where source_id in (...)
    

查询次数:1 + m(来源数)
涉及数据:N+N(展示数)

2)用户关注新媒体

  1. 查找新关注的媒体的各个来源所有动态
  2. 各来源动态内存合并,批量插入到 timeline 表
    insert into timeline (...)
    values
    (...),
    ...
    (...);
    

查询次数:m(来源数) + 1
涉及数据:K+K(媒体所有动态数)

问题1

考虑媒体动态的增删操作与 timeline 表的事务问题

问题2

若媒体动态过多,一次批量插入长度超限或时间过长。考虑分批次批量插入。

3)用户取关媒体

删除 timeline 表中该用户和相应 meidia_id 的数据

delete from timeline where user_id = $user_id and media_id = $media_id;

查询次数:1
涉及数据:K(媒体所有动态数)

4)媒体发布新动态

  1. 查找关注媒体的所有用户
  2. 对每个用户生成数据,批量插入动态到 timeline 表,就 user_id 不同
    insert into timeline (user_id,...)
    values
    ($userId1,..),
    ...
    ($userIdn,...);
    

查询次数:1+1
涉及数据:L+L(关注媒体的用户数)

5)媒体删除动态

  1. 查找关注媒体的所有用户
  2. 根据source和source_id删除
    delete from timeline where source = $source and source_id = $source_id
    

查询次数:1+1
涉及数据:L+L(关注媒体的用户数)