点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:www.cnblogs.com/Finley/

p/15391173.html

  • 什么是 Feed 流

  • Feed 流的存储

  • 持久化存储

  • Feed 流系统优化

    • 在线推 离线拉

    • 分页器

    • 深度分页


什么是 Feed 流

Feed 流是社交和资讯类应用中常见的一种形态, 比如微博知乎的关注页、微信的订阅号和朋友圈等。Feed 流源于 RSS 订阅, 用户将自己感兴趣的网站的 RSS 地址登记到 RSS 阅读器中, 在阅读器里聚合成的列表就是 Feed 流。

Feed 流的本质是 M 个用户订阅了 N 个信息源形成的多对多关系,Feed 流系统需要聚合用户订阅的 N 个信息源产生的信息单元(Feed),并按照一定顺序排列后推送给用户。

接下来我们以关注页场景为例来介绍 Feed 流的实现。

Feed 流有两种基本实现模式:

  • 推模式:当新的 Feed 发布后,将这条内容插入到发布者所有粉丝的 Feed 流中。

  • 拉模式:收到用户拉取Feed流请求后遍历他的关注关系,并拉取关注的人发布的内容实时聚合成 Feed 流。

两种实现方式各有优缺:

  • 推模式的优点在于可以迅速响应用户拉取 Feed 流的请求。但是在粉丝数较多的大V发布内容时需要在他每个粉丝的Feed流中一一进行插入,会产生较大的峰值负载。由于 Feed 发布后的插入操作较多, 通常需要使用 MQ 来异步地进行。

  • 拉模式的优点在于大V发布内容时不会产生峰值负载,但是实时构建 Feed 流操作需要用户等待较多时间。

在实际应用中我们通常采取推拉结合的实现方式。在具体介绍推拉结合之前,我们先来讨论一下 Feed 流系统的存储。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

Feed 流的存储

Feed 流系统中需要存储的数据有 3 部分:

  1. 作者发布的 Feed 列表:这些数据需要可靠的持久化存储,通常采用 MySQL 等关系型数据库即可。因为很可能需要按照发布时间排序, 若要使用 NoSQL 最好使用支持有序存储的数据库。

  2. 用户和作者之间的关注关系:同样需要可靠的持久化存储,采用 MySQL 等关系型数据库或者 KV 结构的 NoSQL 数据库均可。

  3. 用户的 Feed 流:Feed 流可以根据 Feed 数据库和关注关系构建,因此可以不做持久化存储。

最轻量的解决方案是使用 Redis 存储 Feed 流。在数据量较大 Redis 内存不够用时,也可以采用一些持久化的存储方案。

Redis 的 SortedSet 是非常适合存储 Feed 流的数据结构。一般以 Feed 的 ID 作为 SortedSet 的 member,时间戳或者热度值、推荐值作为 score 进行排序。SortedSet 保证了 Feed 不会重复,且插入过程线程安全,无论是推拉模式实现起来都非常方便。

为了避免 Redis 中缓存的 Feed 流占用过多内存,通常需要给 Feed 流设置 TTL.

Feed 的具体内容存储可以在 MySQL 中,同时在 Redis 中做一层缓存。关注关系可以存储在 MySQL 中,因为有些大V的粉丝数较多所以不推荐用 Redis 缓存。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

持久化存储

一个用户的 Feed 流大小是他所有关注者发布的 Feed 数总和。在用户量较大的系统中 Feed 流数据量巨大且增长迅速,将所有 Feed 流存储在 Redis 中需要消耗巨量的内存。

在必要的时候可以利用持久化存储作多级缓存,比如:将当日活跃用户的 Feed 流数据存储在 Redis 中, 当月活跃用户的 Feed 流持久化到数据库中,长期未活跃的用户则在他重新登录后使用 MySQL 中存储的关注关系重新构建 Feed 流。

因为持久化存储 Feed 流的数据库需要有较大的数据容量、较高吞吐量并且需要支持排序,所以不建议使用数据容量较小的 MySQL 或者不支持排序的 KV 数据库来存储 Feed 流数据。

作者推荐使用 Cassandra 来持久化存储 Feed 流:使用用户的 UID 作为 Partition Key, Feed 时间戳在前 Feed ID 在后, 共同作为 Clustering Key 用于排序和去重。Cassandra 支持 TTL 可以用来自动清除冷数据。

另外,由于Feed 流数据属于只追加不修改与 Cassandra 使用的 LSM 结构非常契合,可以有效减少 Cassandra 进行 Compaction 的负担。

Feed 流系统优化

在线推 离线拉

一个拥有 10 万粉丝的大V在发布微博时,他的粉丝中可能只有 1 千人在线。因此我们常用的优化策略是:对于在线的粉丝采用推模式,将新的 Feed 直接插入到粉丝的信息流中;对于离线的粉丝采用拉模式,在粉丝登录时遍历他的关注关系重新构建 Feed 流。

在线推的部分需要计算粉丝和在线用户的交集,然后进行插入操作。因为在线用户数和粉丝数都比较大,所以计算交集的过程需要分批进行。比如说每次查询 100 个粉丝,然后去查询这 100 个用户中有多少在线(取交集),直到遍历完粉丝列表。这个过程类似于将两个表做 join, 同样适用小表驱动大表的原则以减少取交集操作的次数, 大多数情况下使用数量较少的粉丝表作为驱动表。(不要问我什么情况下用在线用户表做驱动表

Feed 流系统杂谈相关推荐

  1. 让人欲罢不能的Feed流系统是如何设计的?

    作者:少强 原文:https://yq.aliyun.com/articles/706808?utm_content=g_1000064616 简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联 ...

  2. 亿级规模的 Feed 流系统,如何轻松设计?

    阿里妹导读:互联网进入移动互联网时代,最具代表性的产品就是各种信息流,像是朋友圈.微博.头条等.这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长.这些产品都是Feed流类型产品,由于Fe ...

  3. 动动手指头, Feed 流系统亿级规模不用愁

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 少强 责编 | 阿秃 导读:互联网进入移动互联网时代,最具代表性的产品就是各种信息流,像是朋友圈.微博.头条等.这些移动化联网时代的 ...

  4. 朋友圈不知你看到的那么简单,千万Feed流系统的存储技术解密

    摘要:阿里巴巴高级技术专家木洛在2018云栖大会·深圳峰会中就Feed流的概念介绍.概念架构以及TableStore场景的Timeline模型等方面的内容做了深入的分析.本文带领大家一起了解并学习如何 ...

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

    摘要: Feed流是一个目前非常常见的功能,在众多产品中都有展现,通过Feed流可以把动态实时的传播给订阅者,是用户获取信息流的一种有效方式.在大数据时代,如何打造一个千万级规模的Feed流系统仍然是 ...

  6. 别瞎搞了!微博、知乎就是这么设计Feed流系统的~

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:14 个 github 项目!个人原创100W +访问量博客:点击前往,查看更多 # 简介 差不多十年前,随着功能 ...

  7. 如何设计一个超级牛牛牛逼的 Feed 流系统

    作者:少强 简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博.微信,以及后来的今日头条.快手等.这些移动化联网时代的新产品在过去几年间借着智能 ...

  8. 如何设计一个牛逼的 Feed 流系统

    点击上方"肉眼品世界",选择"设为星标" 深度价值体系传递 作者:少强 简介 差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代 ...

  9. feed流系统重构-架构篇

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

最新文章

  1. 谷歌旗下DeepMind开发出编程机器人,已达人类程序员平均水平!
  2. 《面向对象分析与设计》一2.1 分析面临的主要问题
  3. 因需设岗,竞争上岗的多Agent协作的协作模式
  4. 跳槽时,这些Java面试题99%会被问到
  5. 保证业务高效运营 专有云虚拟网络是关键
  6. spring 三级缓存_通过画图+视频把循环依赖、监听器等等spring源码讲明白了
  7. boost::sort模块实现相关字符串插入测试
  8. selenium通过加载火狐Firefox配置文件FirefoxProfile,实现免登陆访问网站
  9. BZOJ 2733: [HNOI2012]永无乡
  10. [Python] L1-001. Hello World-PAT团体程序设计天梯赛GPLT
  11. InfoPath中repeationg section动态填充数据
  12. LintCode_13 字符串查找
  13. Windows系统的版本分类
  14. js替换a标签href
  15. UI设计中的原型图用什么工具?怎么做?给谁看?
  16. 一个文字类RPG游戏框架(走过路过别错过)C++
  17. 叶俊:没有人会把钱存在有漏洞的账户
  18. photoshop图层解锁及不能解锁的原因
  19. Me_STM32学习笔记
  20. Echarts柱状图在实体里面展示数据/柱状图顶部展示数据简记

热门文章

  1. scrapy 的入门使用超级详细
  2. JAVA中如何检查打印机状态
  3. pycharm快捷键缩放文字大小
  4. vmware虚拟机克隆后的详细配置
  5. 记录学习(转载) STM32---程序如何在内部运行寄存器编程的理解
  6. 根据通知“春节:1月21日至27日放假调休,共7天。1月28日(星期六)、1月29日(星期日)上班。” 设计的 json...
  7. 12306 出票的一种算法设计
  8. (3)lambda与函数式——响应式Spring的道法术器
  9. maven环境变量配置不成功,并且显示‘mvn‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
  10. java8新特性之FunctionalInterface