38消息拉取(需要接受消息的群体增加)

235 阅读2分钟

1.如何使用拉模式设计信息流系统

推模式无法应对大范围的好友关系(消息推送延迟、存储成本高、方案可扩展性差等问题)

什么是拉取:用户主动拉取他关注的所有人的微博,按照微博发布时间,进行排序和聚合之后,生成信息流数据的方法

//新增代码 
insert into outbox(userId, feedId, create_time) values("B", $feedId, $current_time); 
//写入B的发件箱 
//聚合数据
select feedId from outbox where userId in (select userId from follower where fanId = "A") order by create_time desc 
 List<Long> uids = getFromGroup(groupId); //获取分组下的所有用户 Long<List<Long>> ids = new ArrayList<List<Long>>(); 
for(Long id : uids) {   
ids.add(getOutboxByUid(id)); //获取发件箱的内容id列表 
} 
return merge(ids); //合并排序所有的id
  • 优点:

    • 拉模式彻底解决了推送延迟的问题,大 V 发微博的时候不再需要推送到粉丝的收件箱,自然就不存在延迟的问题了\

    • 存储成本降低

    • 功能扩展性更好了\

  • 缺点

    • 对数据聚合成本较高

      • 缓存高热点数据
    • 缓存带宽较高

      • 部署多个缓存副本

\

2.推拉结合的方案是怎样的

  • 方案的核心在于大 V 用户在发布微博的时候,不再推送到全量用户,而是只推送给活跃的用户\

    • 关于大v 粉丝数超过 50 万就算作大 V

    • 活跃粉丝 刷新过信息流、发布过微博、转发评论点赞过微博,关注过其他用户等等

    • 活跃粉丝列表是定长的,如果活跃粉丝数量超过了长度,就把最先加入的粉丝从列表里剔除,这样可以保证推送的效率\

    • 非活跃用户异步写入消息

\

3.课程小结

  • 使用场景

    • 小规模 推

    • 中规模 推拉

      • 只推送活跃用户
    • 大规模 拉

      • 只保存用户发送数,通过查询聚合
      • 聚合成本较高

学完本门课程啦,撒花!!!