业务中很多需求都会用到类似feed流的架构。
例如

  • 微信朋友圈
  • 微博
  • 动态
  • 1对N消息。

一般feed流的架构实现有下面几种。
假如现在的业务场景是微博,然后当前的数据情况是:

用户A关注了用户B和C,用户D关注了用户B
用户B发了微博A,B,用户C发了微博C,D

1. 拉

数据表

  • 微博表(字段有:微博ID,微博内容,发布人)

代码逻辑:

  1. 用户 B发布微博接口,插入记录到微博表,只有一行记录
  2. 用户A获取我关注的用户的微博接口:
    1. 获取当前登录用户关注的用户,例如A关注的用户B和C
    2. 获取B和C发布的所有微博,
    3. 按时间倒序排列,分页,返回

优缺点:

  • 实现简单
  • 空间占用较少,一条微博只用一条数据库记录
  • 数据量大的情况下, 第2个接口查询较慢(需要用临时表,而且查询数据较多)

2.推

数据表

  • 微博表(字段有:微博ID,微博内容,发布人)
  • feed流表(字段有:微博ID,发布时间,接收人)

代码逻辑:

  1. 发布微博接口

    1. 插入记录到微博表
    2. 获取当前用户粉丝用户列表,假如当前用户是B,那就是获取A和D
    3. 插入2行记录到feed流表
      1. 接收人=A,微博ID=刚才的微博表ID
      2. 接收人=B,微博ID=刚才的微博表ID
  2. 用户A获取我关注的用户的微博接口:
    1. 查询feed流表,找到接收人=A的记录,按发布时间倒序排,分页,返回

优缺点:

  • 实现较复杂
  • 空间占用较多,一条微博需要插入1+N条记录(N是粉丝用户数)。如果N是几十w或者几百w,对数据库压力非常大,包括空间占用,插入或删除耗时,索引建立等。
  • 第2个接口可以用索引,所以查询很快,。

3.推+拉

上面两种方案都有优缺点,当对读的要求很高,同时用户粉丝数很大,就要想办法优化,推+拉是其中一种方案。
具体方法是区分用户:

  • 对于经常读取的用户,采用推方案,保证读取的性能
  • 对于不常读取的用户,采用拉方案,降低存储压力

从产品的角度看,有很多种方法可以区分用户是否属于经常读,这里提供其中一个可行的方案:

4. 区分活跃用户的推+拉

数据表

  • 微博表(字段有:微博ID,微博内容,发布人)
  • feed流表(字段有:微博ID,发布时间,接收人)
  • 活跃用户表(字段有:用户ID,是否活跃,最新登录时间)

代码逻辑:

  1. 发布微博接口

    1. 插入记录到微博表
    2. 获取当前用户活跃粉丝用户列表,假如当前用户是B,那就是获取A和D,其中A是活跃用户,D是非活跃,那就只获取A。SQL可以用exists,例如:select * from fans where exists (select * from 活跃表 where 是否活跃=1)
    3. 插入1行记录到feed流表(D不是活跃用户,就不插入了)
      1. 接收人=A,微博ID=刚才的微博表ID
  2. 用户A获取我关注的用户的微博接口:
    1. 查询feed流表,找到接收人=A的记录,按发布时间倒序排,分页,返回
  3. APP启动接口(每次APP启动,发送一个请求到后端)
    1. 如果用户是活跃用户,更新用户最新登录时间
    2. 如果不是,通过拉方式为用户补发feed流:
      1. 获取用户所有关注的用户
      2. 获取这些用户发的微博
      3. 把这些微博ID插入到用户的feed流表(要避免重复插入)
  4. 定时任务
    1. 每天把最新登录时间小于1天前的用户,设置为非活跃

优缺点:

  • 第2个接口可以用索引,所以查询很快。
  • 数据库压力降低。因为一般粉丝中活跃用户只有小部分,同时补发的时候,可以只补发最新的N条微博,进一步节省空间,当然这些要和产品经理制定好规则。
  • 逻辑较复杂
  • 因为补发feed流需要一定时间,所以这期间用户只能拉到旧的微博

未经允许,请不要转载

常用Feed流架构实现的更多相关文章

  1. 数据人看Feed流-架构实践

    背景 Feed流:可以理解为信息流,解决的是信息生产者与信息消费者之间的信息传递问题.我们常见的Feed流场景有:1 手淘,微淘提供给消费者的首页商品信息,用户关注店铺的新消息等2 微信朋友圈,及时获 ...

  2. Feed流系统重构-架构篇

    重构,于我而言,很大的快乐在于能够解决问题. 第一次重构是重构一个c#版本的彩票算奖系统.当时的算奖系统在开奖后,算奖经常超时,导致用户经常投诉.接到重构的任务,既兴奋又紧张,花了两天时间,除了吃饭睡 ...

  3. 从小白到架构师(4): Feed 流系统实战

    「从小白到架构师」系列努力以浅显易懂.图文并茂的方式向各位读者朋友介绍 WEB 服务端从单体架构到今天的大型分布式系统.微服务架构的演进历程.读了三篇万字长文之后各位想必已经累了(主要是我写累了), ...

  4. 如何打造千万级Feed流系统

    from:https://www.cnblogs.com/taozi32/p/9711413.html 在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈 ...

  5. Feed流系统设计-总纲

    https://mp.weixin.qq.com/s/ccxM2thPbzg5vDWgGVJ5vQ 作者:少强 简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代 ...

  6. feed流拉取,读扩散,究竟是啥?

    from:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961214&idx=1&sn=5e80ad6f2 ...

  7. 流动的推荐系统——兴趣Feed技术架构与实现

    流动的推荐系统 我们经常谈论的推荐系统(Recommender System),从形式上看是比较“静态”的推荐,通常位于网页主要信息的周边,比如电商网站的“看了又看”.“买了又买”.这种推荐系统在大多 ...

  8. 微博Feed流

    一.微博核心业务图 二.微博的架构设计图 三.简述 先来看看Feed流中的一些概念: Feed:Feed流中的每一条状态或者消息都是Feed,比如微博中的一条微博就是一个Feed. Feed流:持续更 ...

  9. Feed 流系统杂谈

    什么是 Feed 流 Feed 流是社交和资讯类应用中常见的一种形态, 比如微博知乎的关注页.微信的订阅号和朋友圈等.Feed 流源于 RSS 订阅, 用户将自己感兴趣的网站的 RSS 地址登记到 R ...

随机推荐

  1. 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之九

    第11波-快速批量插入图片并保护纵横比不变 原文链接:https://www.jianshu.com/p/9a3d9aa7ba7e 修复了插入图片有纵向的图片时,插入后还是显示横向的情况. 第83波- ...

  2. c语言进阶6-指针

    指针是c语言的一个重要组成部分 是c语言的核心.精髓所在,用好指针可以在c语言编程中起到事半功倍的效果.一方面,可以提高程序的编译效率和执行速度以及实现动态的存储分配:另一方面,使用指针可使程序更灵活 ...

  3. C#3.0新增功能09 LINQ 基础01 语言集成查询

    连载目录    [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 数据查询历来都表示为简单的字符串,没有编译时类型检查或 Inte ...

  4. [leetcode] #239 Sliding Window Maximum (Hard)

    原题链接 题意: 给定一个数组数字,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边.你只能在窗口看到k个数字.每次滑动窗口向右移动一个位置. 记录每一次窗口内的最大值,返回记录的值. 思路: ...

  5. [leetcode] 7. Reverse Integer (easy)

    原题 水题 唯一注意的点就是数字溢出 class Solution { public: int reverse(int x) { long long MAX = ((long long)1 <& ...

  6. linux初学者-firewall篇

     linux初学者-firewall篇 firewalld是防火墙的另一种程序,与iptables相同,但是使用起来要比iptables简单的点,不需要了解3张表和5条链也可以使用. 1.firewa ...

  7. .net持续集成sonarqube篇之 sonarqube集成单元测试

    系列目录 通过前面章节我们可以看到,不论怎么构建,单元测试覆盖率一栏总是0% 这是因为单元测试覆盖率报告需要额外集成.这一节我们就讲解如何在sonarqube里集成单元测试覆盖率报告. 这里需要借助O ...

  8. PHP验证身份证格式

    互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的.几乎都是在网上买一些大的互联网公司的一些认证服务.即使是便宜一些的认证价格也达到了10万次/万元.也就是一角钱 ...

  9. 关于定时器Scheduled(cron)的问题

    定时器配置步骤参考:http://blog.csdn.NET/sd4000784/article/details/7745947 下面给出cron参数中各个参数的含义: CRON表达式    含义 & ...

  10. Bean Validation完结篇:你必须关注的边边角角(约束级联、自定义约束、自定义校验器、国际化失败消息...)

    每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349.JSR380)H ...