《亿级流量系统架构设计与实战》第十一章 Timeline Feed服务

news2024/11/16 18:35:06

Timeline Feed服务

    • 一、概述
      • 1、分类
      • 2、功能
    • 二、设计原理
      • 1、拉模式与用户发件箱
      • 2、推模式与用户收件箱
      • 3、推拉模式结合
    • 三、关键技术
      • 1、内容与用户收件箱的交互(推模式)
      • 2、推送拆分子任务
      • 3、收件箱模型设计

内容总结自《亿级流量系统架构设计与实战》

一、概述

1、分类

Feed 流的功能在当今的互联网应用和网络社交平台中非常重要,它是一种以时间线为基础的信息流展示形式,把用户感兴趣的内容呈现在用户的Feed页面上。如果你使用过一些互联网应用就会发现,很多互联网应用的主页都是Feed页面,它们把Feed流当作自己的“门面”。Feed 流在内容聚合维度上包括但不限于如下几种形式。

  • 推荐 Feed 流:按照你的浏览兴趣菜合内容,你可能不认识 Feed 流内容的发布者,但是他发布的内容你可能很感兴趣。
  • 关注 Feed 流:你关注的用户发布的内容被聚合为 Feed 流,并且按照内容的发布时间从近到远展示你所关注的那些人最近发布的内容。按照内容的发布时间排序,也就是遊循时间线,所以这种 Feed 流是一种 Timeline Feed 流。徽信朋友閣和微博首页都是典型的对关注 Feed 流的应用。
  • 附近 Feed 流:顾名思义,就是你附近的用户最近发布的内容,这对于社交类应用来说较为常见。推荐 Feed 流的重点是推荐算法,附近 Feed 流的重点是地理位置判断,其相关技术差异巨大,不具备通用性

2、功能

Timeline Feed 流提供的数据应该是我们所关注的人在指定的时问段内发布的内容列表,并且内容按照时间由近及远排序。

用户在客户端浏览Timeline Feed页面时一般有如下两种操作方式。

  • 下拉操作:刷新Feed流,拉取当前时间最新的 N条 Feed 流。
  • 上滑操作:拉取更早时间的 N条Feed 流。

总之,Timeline Feed 服务主要负资两种读取数据的方式:下拉与上滑。

其中,下拉负责拉取用户从未看过的最新内容列表,上滑负资拉取更早的内容列表,并限制所能拉取到内容最大数量。无论是何种读取方式,内容列表均找照内容的发布时间从近到远排序。




二、设计原理

1、拉模式与用户发件箱

较为符合我们直觉的实现Timeline Feed服务的方式是拉模式。每个内容发布者都有自己的“发件箱”,每当用户发布一个内容时,就把内容存放到发件箱中,由其他用户来拉取内容

在拉模式下,用户每刷新一次Feed流,系统就需要读取N个用户的发件箱(这里的N指用户关注的人数),这意味着一次用户请求会放大产生N倍的读请求,故而这种模式也被称为“读扩散”。如果用户量级较大,那么获取Feed流会是一个高并发场景,而且用户关注的人数也会较多。所以这种扩散读会增加用户请求延迟,并可能击垮存储用户内容列表的服务器


2、推模式与用户收件箱

与拉模式相反,在推模式下,每个用户都有一个“收件箱”,当某个用户成功发布了内容时,系统会将该内容推送到其每个粉丝用户的收件箱中。粉丝用户在获取Feed流时,直接从收件箱中读取内容即可。在推模式下,用户获取Feed流的性能比在拉模式下好。

缺点:

  1. 存储压力大:每个用户都有收件箱,势必增加收件箱存储开销,用户越多,收收件箱占用的存储资源也越多
  2. 写扩散:某用户存在100w粉丝,当发布完内容后,需要推送到100w粉丝的收件箱,即会产生100w个写请求。巨量写请求,会击垮收件箱所依赖的数据库

3、推拉模式结合

推模式和拉模式优缺点互补,可以相互结合。大V的内容就拉模式(推模式要推的人太多),普通内容推模式(拉模式牵涉的人数太多)

用户-区分活跃用户

大V在发布内容后,我们依然可以采用推模式,但是现在仅将内容推送给粉丝列表中的部分活跃用户,因为这些用户使用 Timeline Feed 流功能的频常相对较高,所以将内容主动推送到他们的收件箱中更有可能提高获取Timeline Feed流的性能。至于那些很长时间都没有打开应用的用户,则完全没有必要把内容存储到他们的收件箱中。如果有一天这些用户登录应用并使用Timeline Feed流功能,那么保持采用推拉结合模式结合来获取数据就好。

综上所述,对推拉模式的结合方式总结如下:

  1. 如果内容的发布者是普通用户,则完全可以采用推模式,把内容推送到全部粉丝的收件箱中
  2. 如果内容的发布者是大V,则进一步区分活跃用户和非活跃用户。对于活跃用户,采用推模式;对于非活跃用户,则采用拉模式




三、关键技术

1、内容与用户收件箱的交互(推模式)

内容发布服务需要与Timeline Feed服务解耦,而且要尽可能提高推送的可用性,最好的办法就是在这两个服务之间建立消息队列通道。我们可以创建一个消费者服务负责接收内容发布服务的内容变更事件,如果发现有新内容发布,则执行遍历推送操作


2、推送拆分子任务

Timeline消费者遍历推送毕竟是串行操作,如果需要将一条内容推送给更多的粉丝,那么遍历推送可能会消耗更长的时间,进而造成内容发布服务与Timeline消费者之间的消息队列中的消息积压,导致内容到用户收件箱的投递延迟。我们可以将对大量粉丝的遍历推送拆分为多个并行执行的子任务,每个子任务负责对一批粉丝的推送。

比如需要将内容A推送给3000个粉丝,且粉丝的用户ID是1~3000,那么可以将这个任务拆分为3个子任务

  • 子任务1:负责将内容发送给粉丝1~1000
  • 子任务2:负责将内容发送给粉丝1001~2000
  • 子任务3:负责将内容发送给粉丝2001~3000

3、收件箱模型设计

用户查询时的业务动作含义是:以某个时间点为基准,向前或者向后获取当前用户关联的内容id

1)使用数据库

新增表:inbox

字段名类型含义
idbigint主键
user_idbigint用户id
content_idbigint内容id
publish_timedatetime内容发布时间

idx_feed(user_id,publish_time,content_id)

每个用户的收件箱内容都会按照publish_time从小到大排列,当publish_time相同时,再进一步按照content_id从小到大排列,所以从后向前扫描索引正好与Timeline Feed流内容的排序规则相吻合

2)使用ZSET

  • key为inbox_{用户ID},表示一个ZSET对象是哪个用户的收件箱
  • Member为内容id
  • Score为内容发布时间。ZSET可以按照内容发布时间从小到大排列内容ID

不断获取内容ID的方案:

  1. 根据last_content_id 直接定位下一条内容,但这种方案不适合推拉结合模式;
  2. 先获取发布时间小于或等于ts的全部内容,再过滤筛选;
  3. 对第二种方案的优化,把内容ID格式化为 20 位长度的字符串用作Member 字段,保证在ZSET中发布时间相同的内容按照内容ID的数值从小到大排列,这样一来,在ZSET中从后向前扫描就与Timeline Feed流内容的排序规则相吻合了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[linux#39][线程] 详解线程的概念

线程:是进程内的一个执行分支。线程的执行粒度比进程要细 什么是线程? • 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程 是“一个进程内部的控制序列” • 一切进程至少都有一个执行线程 • …

使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台

目录 一、概述 二、代码部分 1、Virtio 前端 (1) User Space (2) Kernel Space 2、Virtio 后端 三、运行 QEMU Version:qemu-7.2.0 Linux Version:linux-5.4.239 一、概述 本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的…

基于vue框架的爱喵星人服务平台设计与实现80sgi(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,猫食分类,猫粮信息,养护知识,流浪猫信息,申请领养,志愿者招募,申请加入,猫咪品种,团队活动 开题报告内容 基于Vue框架的爱喵星人服务平台设计与实现 开题报告 一、研究背景与意义 1.1 研究背景 随着社会的快速发展和人们生活水…

使用 onBeforeRouteUpdate 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteUpdate 组合式函数提升应用的用户体验 date: 2024/8/15 updated: 2024/8/15 author: cmdragon excerpt: 摘要:本文介绍如何在Nuxt 3开发中使用onBeforeRouteUpdate组合式函数来提升应用用户体验。通过在组件中注册路由更新守卫&#xf…

Markdown导出为 Excel文件 Vue3

直接复制到单文件内即可使用 需要用到的插件 xlsx 0.17.5marked 14.0.0file-saver 2.0.5vue 3.4.29 直接SFC单文件内使用 <script setup> import {reactive} from vue; import xlsx from xlsx; import {marked} from marked; import {saveAs} from file-saver;const…

鸿蒙(API 12 Beta3版)【元数据(C/C++)】媒体相机开发指导

元数据&#xff08;Metadata&#xff09;是对相机返回的图像信息数据的描述和上下文&#xff0c;针对图像信息&#xff0c;提供的更详细的数据&#xff0c;如照片或视频中&#xff0c;识别人像的取景框坐标等信息。 Metadata主要是通过一个TAG&#xff08;Key&#xff09;&…

Linux基础知识学习(三)

3. Vim 编辑器 1> 定义 im 通过一些插件可以实现和IDE一样的功能&#xff01; vi 是老式的字处理器。 Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 键盘图为&#xff1a; ps &#xff1…

JMeter——设置全局变量和非全局变量

在用JMeter写接口case&#xff0c;遇到一种情况&#xff0c;接口1查看列表接口&#xff0c;接口2查看详情接口&#xff0c;接口2需要传入接口1列表的第一条数据的id。 如果这个id后续改变较多&#xff0c;可以使用非全局变量的设置方法&#xff1b; 如果这个id在整个case都比较…

vs2019使用setup打包exe学习记录

仅记录一下自己的学习过程&#xff0c;如果有问题&#xff0c;请多指正&#xff01; 开头注意&#xff1a;在打包之前一定要确保自己的工程是正常运行的&#xff0c;以及相关环境变量的配置是正确的&#xff0c;我后面就因为QT的环境变量问题报错。 我使用vs2019的QT项目写了…

本庄村果园预售系统的设计与实现bootpf

TOC springboot441本庄村果园预售系统的设计与实现bootpf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思…

代码随想录算法训练营 | 动态规划 part06

322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是…

【人工智能】Python融合机器学习、深度学习和微服务的创新之路

1. &#x1f680; 引言1.1 &#x1f680; 人工智能的现状与发展趋势1.2 &#x1f4dc; 机器学习、深度学习和神经网络的基本概念1.3 &#x1f3c6; 微服务架构在人工智能中的作用 2. &#x1f50d; 机器学习的演变与创新2.1 &#x1f31f; 机器学习的历史回顾2.2 &#x1f9e0;…

3个常用zip压缩包文件打来密码删除方法

ZIP压缩包作为一种广泛使用的文件压缩格式&#xff0c;常常用于节省存储空间或便于文件传输。一般情况下为保护文件数据的安全我们会给zip压缩文件设置密码安全保护&#xff0c;但如果后续不需要密码保护了&#xff0c;如何删除密码呢&#xff1f;下面小编给大家介绍三种常用的…

ubuntu22.04安装QQ

QQ官方网址&#xff1a;QQ-轻松做自己 选择【Linux】 接下来根据架构的版本&#xff0c;选择相应的安装包。 可使用 uname -a 指令来查看架构的版本&#xff0c;如下指令所示&#xff0c; wjjwjj-MS-7D31:~/桌面$ uname -a Linux wjj-MS-7D31 6.5.0-45-generic #45~22.04.1-U…

项目申报管理系统pf

TOC springboot375项目申报管理系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff…

[C++游戏开发] 超大地图多人在线扫雷

[C游戏开发] 超大地图多人在线扫雷 前言游戏截图注册方法游戏功能介绍操作方法介绍游戏特性介绍1.颜色标识2.生存方法 使用的技术核心代码尾声***如果你不介意的话&#xff0c;你应该点个赞&#xff0c;然后收藏&#xff0c;然后关注对不对。*** 前言 唉&#xff0c;写文章要什…

【秋招笔试题】合并最小值 DP

题面 解法&#xff1a;与leetcode321不一样的是&#xff0c;那个是最大值&#xff0c;这个是最小值&#xff0c;且需要处理0首位问题。那道题是Hard题中的Hard&#xff0c;无论是思维量还是代码量都是顶级&#xff0c;这道题难度并不弱于那道。 观察到数据量为500级别&#x…

DVWA-IDS 特殊版本测试

起因 浏览DVWA历史更新记录发现有版本带有IDS插件&#xff0c;可以用于平时没有相关设备等场景演示用&#xff0c;所以开启本次测试。 下载 官方最新版本是移除了IDS插件&#xff0c;原因是“从不使用”&#xff0c;所以需要下载移除该插件之前的版本。 https://github.com/…

【vue教程】六. Vue 的状态管理

目录 往期列表本章涵盖知识点回顾Vuex 的基本概念什么是 Vuex&#xff1f;为什么需要 Vuex&#xff1f; Vuex 的核心概念stategettersmutationsactionsmodules Vuex 的安装和基本使用安装 Vuex创建 store在 Vue 应用中使用 store在组件中访问和修改状态 Vuex 的模块化模块化的好…

PWN练习---Stack_2

目录 srop源码分析exp putsorsys源码分析exp ret2csu_1源码分析exp traveler源码分析exp srop 题源&#xff1a;[NewStarCTF 2023 公开赛道]srop 考点&#xff1a;SROP 栈迁移 源码 首先从bss段利用 syscall 调用 write 读出数据信息&#xff0c;然后调用 syscall-read向栈中…