短视频内容平台(如TikTok、Instagram Reel、YouTube Shorts)的系统设计
现在,短视频内容已成为新趋势,每个人都在从TikTok、Instagram、YouTube等平台上消费这些内容。让我们看看如何为TikTok创建一个系统。
这样的应用程序看起来很小,但在后台有很多事情正在进行。以下是相关的挑战:
•由于该应用程序在全球范围内使用,将会有大量的请求发送到服务器。这最终会增加服务器的负载。•将视频上传到后台将是一个巨大的任务,这将增加服务器的负载并阻塞。•流畅地播放视频,无缓冲。•一个基于用户兴趣推荐视频的推荐系统。
让我们逐一了解每个部分。我将其分为三个部分:
•与用户相关的服务•与视频发布相关的服务•与点赞和评论相关的服务•推荐服务
与用户相关的服务
这是一个包含与用户相关服务的服务,如下所示:
•注册: 用户将在应用程序中注册。•登录: 它将对凭证进行身份验证,并向应用程序发送响应。•登出: 用户将从应用程序中注销。•关注: 如果用户想要关注或取消关注其他用户,则可以通过此服务完成。
为了存储与用户相关的数据,我们将使用基于SQL的数据库,如MYSQL或PostgreSQL,因为与用户相关的数据(例如追踪关注者)将会是关联数据,所以这是一个适当的选择。
为了优化数据库性能,我们将使用主从架构。主数据库用于执行写操作,从数据库用于执行读操作。要了解有关此内容的更多信息,可以阅读文章如何优化数据库性能并扩展它?[3]

现在让我们讨论用户服务的流程。应用程序将发出API调用,API Gateway将管理这些API。它将为用户服务路由请求。
请求将通过负载均衡器进行,负载均衡器下将有多个用户服务实例。根据负载,它将决定哪个实例将处理请求。一旦请求被处理,负载均衡器将将响应发送回API网关,然后再发送回应用程序。
与视频发布相关的服务
这是一个包含与视频发布相关服务的服务,如下所示:
•上传视频: 将视频上传到后台服务器。•发布: 如果用户想要创建、编辑或删除帖子,则可以通过此服务完成。
为了存储与帖子相关的数据,我们将使用基于NoSQL的数据库,如MongoDB。对于每个用户,可能会有成千上万的帖子,这将导致大量数据。
为了实现最佳性能,扩展数据库可能会很困难。NoSQL数据库支持水平分片,这有助于我们在不影响性能的情况下扩展数据库。要了解有关数据库分片的更多信息,可以阅读文章关于数据库分片的一切 | 扩展数据库[4]。

现在让我们讨论视频服务的流程。应用程序将发出API调用,API Gateway将管理这些API。它将为视频服务路由请求。
请求将通过负载均衡器进行,负载均衡器下将有多个视频服务实例。根据负载,它将决定哪个实例将处理请求。一旦请求被处理,负载均衡器将将响应发送回API网关,然后再发送回应用程序。
如何使文件在全球范围内可访问而不增加下载时间?
视频文件将上传到单独的云存储服务,如Amazon S3 Bucket。现在,如果我们想在世界范围内任何地方访问文件而没有任何延迟,那么该文件将发送到内容分发网络(CDN),它将将媒体文件更新到世界各地的不同数据云存储中。
我们能进一步优化以减少下载时间吗?
还有一个挑战需要解决,即原始视频的大小可能较大,因此如果将大文件发送回客户端,则下载时间会更长,这会影响用户体验。
文件一旦上传到云存储,您可以在数据库中存储文件路径。然后将帖子/视频详细信息发送到消息队列系统,如Kafka或RabbitMQ。
为了使用户体验流畅,我们需要压缩视频并为不同设备创建不同分辨率的视频。视频处理工作者将从消息队列系统接收视频详细信息,然后从
云存储中提取文件并进行处理。处理完成后,这些新的视频文件将发送到CDN。
如何访问压缩的视频文件?
现在您可能会想,应用程序如何知道上述讨论中压缩的视频的文件路径?由于压缩文件将存储在分类文件夹中,因此可以根据分辨率和文件名轻松查找文件。
视频发布API只会返回文件名,而要访问文件,应用程序将在URL本身中添加分辨率细节,例如/media//。
当访问此URL时,它将经过API网关,并从URL中提取分辨率和文件名详细信息。然后它将在缓存系统(Redis)中检查,如果文件不可用,则将访问CDN并通过它获取文件。然后将其添加到缓存中,以便如果再次请求相同文件,则不必从CDN获取。
点赞和评论相关的服务
这是一个包含与视频点赞和评论相关服务的服务。正如名称所示,通过此服务,我们可以为特定帖子更新点赞和评论。与上面讨论的其他流程相同。

推荐服务
通过此服务,基于用户偏好推荐一系列帖子。幕后有很多其他事情正在进行。让我们看看幕后运行的流程。

然后,创建一个帖子后,它将被发送到消息队列系统,然后消费者将提取数据并将数据更新到大数据(Hadoop)中。
将为机器学习服务(如PyTorch和Tensorflow)设置单独的服务器,在这里它将从大数据中提取数据并训练模型。推荐服务将使用此AI模型为给定用户推荐帖子。
结论
这是类似于TikTok的应用程序的基本级别的系统设计,根据需求可以添加许多其他内容,如跟踪用户行为(用户参与的帖子,用户关注的帖子)。基于此,可以改进AI模型,为用户推荐帖子。
相关文章:

短视频内容平台(如TikTok、Instagram Reel、YouTube Shorts)的系统设计
现在,短视频内容已成为新趋势,每个人都在从TikTok、Instagram、YouTube等平台上消费这些内容。让我们看看如何为TikTok创建一个系统。 这样的应用程序看起来很小,但在后台有很多事情正在进行。以下是相关的挑战: •由于该应用程序…...
【git】Git 回退到指定版本:
文章目录 方法一: 使用 git reset 命令方法二:使用 git revert 命令方法三:使用 git checkout 命令常见的错误及其解决办法如下: 方法一: 使用 git reset 命令 命令可以将当前分支的 HEAD 指针指向指定的提交,从而回退代码到指定版…...
kibana+nginx配置密码 ubuntu
JAVA进阶之路-nginx设置密码 Kibana——通过Nginx代理Kibana并实现登陆认证 需要配置一下nginx文件 nginx配置文件详解 密码生成安装软件 apt install apache2-utils...

Git仓关联多个远程仓路径
前言 Git仓如果需要将代码push到多个仓,常用的做法是添加多个远程仓路径,然后分别push。这样虽然可以实现目的,但是需要多次执行push指令,很麻烦。 本文介绍关联多个远程仓路径且执行一次push指令的方法:git remote …...

使用ffmpeg将m4a及wav等文件转换为MP3格式
要使用ffmpeg将m4a及wav等文件转换为MP3格式,您可以按照以下步骤进行操作: 安装 ffmpeg 确保您已经安装了ffmpeg软件。如果没有安装,请访问ffmpeg的官方网站https://ffmpeg.org/ 并按照说明进行安装。 Win10 / Win11 可以通过 winget 命令…...

【CI/CD】Git Flow 分支模型
Git Flow 分支模型 1.前言 Git Flow 模型(本文所阐述的分支模型)构思于 2010 年,也就是 Git 诞生后不久,距今已有 10 多年。在这 10 多年中,Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里,Git 本身…...

SpringBoot Thymeleaf模板引擎
Thymeleaf 模板引擎 前端交给我们的页面,是html页面。如果是我们以前开发,我们需要把他们转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。 jsp支持非常强大…...

prometheus部署
一、前言 Prometheus 是一个开源的系统监控和警报工具,用于收集、存储和查询时间序列数据。它旨在提供高效的多维数据收集和查询功能,帮助用户监控其应用程序和基础设施的性能,并在出现问题时触发警报,总来得说prometheus是用来收…...
Flink-Window详细讲解-countWindow
一.countWindow和countWindowall区别 1.countWindow: 如果您使用 countWindow(5),这意味着您将数据流划分成多个大小为 5 的窗口。划分后的窗口如下: 窗口 1: [1, 2, 3, 4, 5]窗口 2: [6, 7, 8, 9, 10] 当每个窗口中的元素数量达到 5 时&…...
React 18 state 如同一张快照
参考文章 state 如同一张快照 也许 state 变量看起来和一般的可读写的 JavaScript 变量类似。但 state 在其表现出的特性上更像是一张快照。设置它不会更改已有的 state 变量,但会触发重新渲染。 设置 state 会触发渲染 可能会认为用户界面会直接对点击之类的用…...

EasyPoi导出 导入(带校验)简单示例 EasyExcel
官方文档 : http://doc.wupaas.com/docs/easypoi pom的引入: <!-- easyPoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version></dep…...

八大排序
目录 选择排序-直接插入排序 插入排序-希尔排序 选择排序-简单选择排序 选择排序-堆排序 交换排序-冒泡排序 交换排序-快速排序 归并排序 基数排序 选择排序-直接插入排序 基本思想: 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素…...

网络安全【黑客技术】自学
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 掌握技术的听说也需要心怀正义,不要利用技术行不轨之事&…...

【网络通信】socket编程——TCP套接字
TCP依旧使用代码来熟悉对应的套接字,很多接口都是在udp中使用过的 所以就不会单独把他们拿出来作为标题了,只会把第一次出现的接口作为标题 文章目录 服务端 tcp_servertcpserver.hpp(封装)初始化 initServer1. 创建socket2. 绑定 bindhtons —— 主机序…...
ROS2系统学习番外篇2---用VSCode开发ROS2程序
在ROS2系统学习3—第一个“Hello World”程序—即工作空间创建与包创建中已经介绍了如何创建ROS的工作空间以及包。在开发大型工程时,往往需要在IDE下面进行开发,因此本篇介绍使用VSCode来搭建ROS2开发环境的方法。 首先用VSCode打开ROS2的工作空间。 使用快捷键编译ROS2 …...

06 - Stream如何提高遍历集合效率?
前面我们讲过 List 集合类,那我想你一定也知道集合的顶端接口 Collection。 在 Java8 中,Collection 新增了两个流方法,分别是 Stream() 和 parallelStream()。 1、什么是 Stream? 现在很多大数据量系统中都存在分表分库的情况…...

【Spring】使用注解的方式获取Bean对象(对象装配)
目录 一、了解对象装配 1、属性注入 1.1、属性注入的优缺点分析 2、setter注入 2.1、setter注入的优缺点分析 3、构造方法注入 3.1、构造方法注入的优缺点 二、Resource注解 三、综合练习 上一个博客中,我们了解了使用注解快速的将对象存储到Spring中&#x…...

[webpack] 基本配置 (一)
文章目录 1.基本介绍2.功能介绍3.简单使用3.1 文件目录和内容3.2 下载依赖3.3 启动webpack 4.基本配置4.1 五大核心概念4.2 基本使用 1.基本介绍 Webpack 是一个静态资源打包工具。它会以一个或多个文件作为打包的入口, 将我们整个项目所有文件编译组合成一个或多个文件输出出去…...

模板学堂|SQL数据集动态参数使用场景及功能详解
DataEase开源数据可视化分析平台于2022年6月正式发布模板市场(https://dataease.io/templates/)。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板,方便用户根据自身的业务需求和使用场景选择对应的仪表板模板&a…...

Wlan——射频和天线基础知识
目录 射频的介绍 射频和Wifi 射频的相关基础概念 射频的传输 信号功率的单位 射频信号传输行为 天线的介绍 天线的分类 天线的基本原理 天线的参数 射频的介绍 射频和Wifi 什么是射频 从射频发射器产生一个变化的电流(交流电),通过…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...