feed

  1. feed流根据时间拉取最新的数据,每个用户有一个关注者收信箱,用于关注的feed流
  2. 每个用户根据年龄和性别划分有一个公共的收信箱,每次拉取的都是最新的和最近的
  3. roketmq参考消息队列

具体流程

api微服务

  1. 上传feed流的用户首先通过api微服务http上行请求(格式具体不是json而是protobuf),发号(通过全局发号)
  2. 通过rpc调用feed微服务,将上传的feed落库,图片和location和内容一共三张表,通过主表标识是否有图片和地理位置
  3. 通过异步协程,将消息加入消息队列中,如果加入失败,塞到chan重试
  4. 落库成功后直接返回成功
  5. 拉取时候先计算个人是属于哪一个zset的推荐流的,算不出就用全局推荐流

task微服务

  1. 有两个消费者组,推荐流和关注流,每条消息都需要经历两次消费
  2. 关注流查找所有关注了的人(通过rpc调用),然后异步将feed的id加入个人关注zset队列(每个人都有一个zset)中(写扩散),key为id
  3. 推荐流先加入全局的feed(通过rpc调用),通过发布者的信息(年龄和性别)分别写入不同的zset(每个属性都有一个zset),key为id,读扩散

feed微服务

  1. 当拉取个人关注流的时候,直接拉取zset最新的id(也可以offset和limit),(这部分可能有问题,当拉取的时候又有更新,offset和limit是不准确的,而且无法实时同时)
  2. 拉取推荐流也是类似,先计算个人的属性,拉取最新的feed流