短视频内容平台(如TikTok、Instagram Reel、YouTube Shorts)的系统设计

news2024/11/15 16:02:23

现在,短视频内容已成为新趋势,每个人都在从TikTok、Instagram、YouTube等平台上消费这些内容。让我们看看如何为TikTok创建一个系统。

这样的应用程序看起来很小,但在后台有很多事情正在进行。以下是相关的挑战:

•由于该应用程序在全球范围内使用,将会有大量的请求发送到服务器。这最终会增加服务器的负载。•将视频上传到后台将是一个巨大的任务,这将增加服务器的负载并阻塞。•流畅地播放视频,无缓冲。•一个基于用户兴趣推荐视频的推荐系统。

让我们逐一了解每个部分。我将其分为三个部分:

•与用户相关的服务•与视频发布相关的服务•与点赞和评论相关的服务•推荐服务

与用户相关的服务

这是一个包含与用户相关服务的服务,如下所示:

注册: 用户将在应用程序中注册。•登录: 它将对凭证进行身份验证,并向应用程序发送响应。•登出: 用户将从应用程序中注销。•关注: 如果用户想要关注或取消关注其他用户,则可以通过此服务完成。

为了存储与用户相关的数据,我们将使用基于SQL的数据库,如MYSQLPostgreSQL,因为与用户相关的数据(例如追踪关注者)将会是关联数据,所以这是一个适当的选择。

为了优化数据库性能,我们将使用主从架构。主数据库用于执行写操作,从数据库用于执行读操作。要了解有关此内容的更多信息,可以阅读文章如何优化数据库性能并扩展它?[3]

ef7951911626c0fdd109d3cf91b2f427.png
 

现在让我们讨论用户服务的流程。应用程序将发出API调用,API Gateway将管理这些API。它将为用户服务路由请求。

请求将通过负载均衡器进行,负载均衡器下将有多个用户服务实例。根据负载,它将决定哪个实例将处理请求。一旦请求被处理,负载均衡器将将响应发送回API网关,然后再发送回应用程序。

与视频发布相关的服务

这是一个包含与视频发布相关服务的服务,如下所示:

上传视频: 将视频上传到后台服务器。•发布: 如果用户想要创建、编辑或删除帖子,则可以通过此服务完成。

为了存储与帖子相关的数据,我们将使用基于NoSQL的数据库,如MongoDB。对于每个用户,可能会有成千上万的帖子,这将导致大量数据。

为了实现最佳性能,扩展数据库可能会很困难。NoSQL数据库支持水平分片,这有助于我们在不影响性能的情况下扩展数据库。要了解有关数据库分片的更多信息,可以阅读文章关于数据库分片的一切 | 扩展数据库[4]

b06dd467c647bd888b31c8518795f467.png
 

现在让我们讨论视频服务的流程。应用程序将发出API调用,API Gateway将管理这些API。它将为视频服务路由请求。

请求将通过负载均衡器进行,负载均衡器下将有多个视频服务实例。根据负载,它将决定哪个实例将处理请求。一旦请求被处理,负载均衡器将将响应发送回API网关,然后再发送回应用程序。

如何使文件在全球范围内可访问而不增加下载时间?

视频文件将上传到单独的云存储服务,如Amazon S3 Bucket。现在,如果我们想在世界范围内任何地方访问文件而没有任何延迟,那么该文件将发送到内容分发网络(CDN),它将将媒体文件更新到世界各地的不同数据云存储中。

我们能进一步优化以减少下载时间吗?

还有一个挑战需要解决,即原始视频的大小可能较大,因此如果将大文件发送回客户端,则下载时间会更长,这会影响用户体验。

文件一旦上传到云存储,您可以在数据库中存储文件路径。然后将帖子/视频详细信息发送到消息队列系统,如KafkaRabbitMQ

为了使用户体验流畅,我们需要压缩视频并为不同设备创建不同分辨率的视频。视频处理工作者将从消息队列系统接收视频详细信息,然后从

云存储中提取文件并进行处理。处理完成后,这些新的视频文件将发送到CDN

如何访问压缩的视频文件?

现在您可能会想,应用程序如何知道上述讨论中压缩的视频的文件路径?由于压缩文件将存储在分类文件夹中,因此可以根据分辨率和文件名轻松查找文件。

视频发布API只会返回文件名,而要访问文件,应用程序将在URL本身中添加分辨率细节,例如/media//

当访问此URL时,它将经过API网关,并从URL中提取分辨率和文件名详细信息。然后它将在缓存系统(Redis)中检查,如果文件不可用,则将访问CDN并通过它获取文件。然后将其添加到缓存中,以便如果再次请求相同文件,则不必从CDN获取。

点赞和评论相关的服务

这是一个包含与视频点赞和评论相关服务的服务。正如名称所示,通过此服务,我们可以为特定帖子更新点赞和评论。与上面讨论的其他流程相同。

ad27b2b263889b2e8b26e6931cfc28af.png
 

推荐服务

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

9d835cda255f81777dc51ab5fc087634.png
 

然后,创建一个帖子后,它将被发送到消息队列系统,然后消费者将提取数据并将数据更新到大数据(Hadoop)中。

将为机器学习服务(如PyTorchTensorflow)设置单独的服务器,在这里它将从大数据中提取数据并训练模型。推荐服务将使用此AI模型为给定用户推荐帖子。

结论

这是类似于TikTok的应用程序的基本级别的系统设计,根据需求可以添加许多其他内容,如跟踪用户行为(用户参与的帖子,用户关注的帖子)。基于此,可以改进AI模型,为用户推荐帖子。

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

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

相关文章

【Linux命令行与Shell脚本编程】第十八章 文本处理与编辑器基础

Linux命令行与Shell脚本编程 第十八章 文本处理与编辑器基础 文章目录 Linux命令行与Shell脚本编程第十八章 文本处理与编辑器基础 文本处理与编辑器基础8.1.文本处理8.1.1.sed编辑器8.1.1.1.在命令行中定义编辑器命令8.1.1.2.在命令行中使用多个编辑器命令8.1.1.3.从文件中读…

项目8.9总结

这两天写了评论和用户之间的关注,然后就是歌曲的上传,歌曲的上传很简陋,并且还有点问题 关注 歌曲上传

[Vue] Vue2和Vue3的生命周期函数

vue2有11个生命周期钩子, vue3有8个生命周期钩子 从vue创建、运行、到销毁总是伴随着各种事件, 创建、挂载、更新到销毁。 1.vue2系列生命周期 ⑴【beforecreate】实例创建前。 vue完全创建之前,会自动执行这个函数。 ⑵【Created】实例创建后。 这也是个生命…

OKHTTP缓存问题记录

使用okhttp的缓存功能 okhttp有一个功能就是适配http协议里面cache-control头 但是在实际使用的过程中,发现非文本内容,如果不对Response中的inputstream读取,就不会缓存下来 比如使用如下代码读取后才能缓存到cache目录 ResponseBody bod…

冷链冷藏仓储系统解决方案|海格里斯HEGERLS四向穿梭立体库助力冷链物流新模式

随着现代物流产业的迅速发展,四向穿梭车立体库因其在仓储体系中所具有的高效密集存储功能优势、运作成本优势与系统化智能化管理优势,已经成为自动化立体库的主流形式之一。而随着国内外仓储物流整体规模和低温产品消费需求的稳步增长,冷链市…

关于使用pycharm遇到只能使用unittest方式运行,无法直接选择Run

相信大家可能都遇到过这个问题,使用pycharm直接运行脚本的时候,只能选择unittest的方式,能愁死个人 经过几次各种尝试无果之后,博主就放弃死磕了,原谅博主是个菜鸟 后来遇到这样的问题,往往也就直接使用cm…

【ChatGPT 指令大全】销售怎么借力ChatGPT提高效率

目录 销售演说 电话销售 产出潜在客户清单 销售领域计划 销售培训计划 总结 随着人工智能技术的不断进步,我们现在有机会利用ChatGPT这样的智能助手来改进我们的销售工作。在接下来的时间里,我将为大家介绍如何运用ChatGPT提高销售效率并取得更好的…

SuperMap GIS基础产品WebGIS FAQ集锦(5)

SuperMap GIS基础产品WebGIS FAQ集锦(5) 【iClient】iClient for Classic如何设置服务跨域时,请求json而不是jsonp? 【解决办法】可全局修改SuperMap.Util.isInTheSameDomain方法,使其返回为true;例如&…

UGUI组件EventTrigger用法

一.Unity编辑器中EventTrigger组件用法 1.添加事件类型 2.绑定gameObject指定组件的方法 3.方法执行逻辑 public class NewBehaviourScript : MonoBehaviour {public void PointerDown(){Debug.Log("Trigger PointerDown");} } 4.按下鼠标,绑定方法成功…

一文了解Java序列化和反序列化:对象的存储与传输

一文了解Java序列化和反序列化:对象的存储与传输 作者:Stevedash 发布时间:2023年8月9日 21点30分 前言 Java序列化是一项强大而重要的技术,它允许我们将对象转换为字节流,以便在存储、传输和重建时使用。在本文中&…

python爬虫相关

目录 初识爬虫 爬虫分类 网络爬虫原理 爬虫基本工作流程 搜索引擎获取新网站的url robots.txt HTHP协议 Resquests模块 前言: 安装 普通请求 会话请求 response的常用方法 简单案例 aiohttp模块 使用前安装模块 具体案例 数据解析 re解析 bs4…

Appium2 安装步骤

自 2022 年 1 月 1 日起,Appium 不再维护 Appium 1.x,官方支持的平台驱动程序的所有最新版本均不兼容 Appium 1.x,需要 Appium 2 才能运行。开启了全新的Appium 2.0之旅。可通过官方文档查看Appium2 移除的功能和新增的功能。 第一步、安装 …

io_uring笔记

目录 io_uring 异步io_uring 使用对比于epoll的效果io_uring效果好在哪? io_uring 异步 要求内核linux 5.10 异步四元组:1、init(create)2、commit 3、callback 4、destory fio : 测iops一秒钟读写磁盘的次数 方式磁盘iopsio_ur…

TCPDF生成PDF文件,含jpjraph生成雷达图

TCPDF生成PDF文件,含jpjraph生成雷达图 依赖自行安装 "tecnickcom/tcpdf": "^6.6","amenadiel/jpgraph": "4"雷达图生成 中文字体添加安装 没有封装,只作为测试案例展示 // 创建新的PDF文档$pdf new \TCPD…

throw和throws的区别

在Java中,throw和throws是两个关键字,用于异常处理。它们具有以下区别: 1. throw关键字: - throw关键字用于主动抛出异常。当程序执行到throw语句时,会创建一个异常对象并将其抛出。 - throw语句通常在方法内部…

fastadmin、vue、react图标库适用于多种框架

在二开fastadmin中,在写vue以及react时,侧边导航栏以及按钮中常常需要很多图标,那么这些图标应该去哪里得到呢,在这里给大家一个链接,这里有丰富的图标库,可以找到自己想要的进行使用。 点击下方链接&…

(树) 剑指 Offer 34. 二叉树中和为某一值的路径 ——【Leetcode每日一题】

❓ 剑指 Offer 34. 二叉树中和为某一值的路径 难度:中等 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入&#xff1a…

opencv 基础50-图像轮廓学习03-Hu矩函数介绍及示例-cv2.HuMoments()

什么是Hu 矩? Hu 矩(Hu Moments)是由计算机视觉领域的科学家Ming-Kuei Hu于1962年提出的一种图像特征描述方法。这些矩是用于描述图像形状和几何特征的不变特征,具有平移、旋转和尺度不变性,适用于图像识别、匹配和形状…

微信小程序 地图map(电子围栏圆形和多边形)

正常情况下是没有手机上画电子围栏的,公共平台上我也没找到,所以走了一个歪点子,就是给地图添加点击事件,记录点的位置,在画到电子围栏上就是添加电子围栏了,如果只是显示电子围栏就简单了 一、多边形电子…

kubernetes中的kubectl命令详解

kubectl命令详解 一:陈述式资源管理方法:(1)简单的基础命令1.查看版本信息2.查看资源对象简写3.查看集群信息4.配置kubectl自动补全5.node节点查看日志 (2)基本信息查看1.查看 master 节点状态2.查看命名空…