文章写作网站/app广告联盟
现在,短视频内容已成为新趋势,每个人都在从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 什么是射频 从射频发射器产生一个变化的电流(交流电),通过…...

前端实习周记第三周周记
第二周总结 第二周主要是做了一些PC端细节内容。大的地方改的不多,但是小的细节蛮多。 值得一提的是,第二周做的微信小程序,改了很多逻辑。改逻辑需要与后端进行联调,收获很大,思路也愈发清楚。 记录做了什么是好习…...

Android 13 Launcher界面——移除Launcher的删除和卸载功能
目录 一.背景 二.将卸载功能进行屏蔽 三.将移除功能屏蔽 四.将Remove按钮与Uninstall按钮屏蔽...

深度学习:使用卷积神经网络CNN实现MNIST手写数字识别
引言 本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度…...

docker search 镜像报错: connect: no route to host (桥接模式配置静态IP)
如下 原因 可能有多种: ① 没有开放防火墙端口 ② ip地址配置有误 解决 我是因为虚拟机采用了桥接模式,配置静态ip地址有问题。 先确认虚拟机采用的是 桥接模式,然后启动虚拟机。 1、打开命令行,输入下面指令,打开…...

【VUE】[Violation] Added non-passive event listener to a scroll-blocking...
环境 chrome: 115.0.5790.170vue: ^3.3.4element-plus: ^2.3.4vite: ^4.4.7 问题 [Violation] Added non-passive event listener to a scroll-blocking <某些> 事件. Consider marking event handler as passive to make the page more responsive. See <URL> …...

runit-docker中管理多个服务
runit-docker中管理多个服务 介绍Runit, systemctl和supervisor是三种不同的服务管理工具区别runit优点程序构成快速开始runit实现服务退出执行指定操作runit监管服务打印日志到syslogrunit监管服务后台运行runit监管服务一些错误总结 介绍 runit 是一个轻量级的、稳定的、跨平…...

Intune 应用程序管理
由于云服务提供了增强的安全性、稳定性和灵活性,越来越多的组织正在采用基于云的解决方案来满足他们的需求。这正是提出Microsoft Endpoint Manager等解决方案的原因,它结合了SCCM和Microsoft Intune,以满足本地和基于云的端点管理。 与 Int…...

Oracle DB 安全性 : TDE HSM TCPS Wallet Imperva
• 配置口令文件以使用区分大小写的口令 • 对表空间进行加密 • 配置对网络服务的细粒度访问 TCPS 安全口令支持 Oracle Database 11g中的口令: • 区分大小写 • 包含更多的字符 • 使用更安全的散列算法 • 在散列算法中使用salt 用户名仍是Oracle 标识…...

leetcode27—移除元素
思路: 参考26题目双指针的思想,只不过这道题不是快慢指针。 看到示例里面数组是无序的,也就是说后面的元素也是可能跟给定 val值相等的,那么怎么处理呢。就想到了从前往后遍历,如果left对应的元素 val时,…...

flask---》更多查询方式/连表查询/原生sql(django-orm如何执行原生sql)/flask-sqlalchemy
更多查询方式 #1 查询: filer:写条件 filter_by:等于的值 # 查询所有 是list对象 res session.query(User).all() # 是个普通列表 print(type(res)) print(len(res))# 2 只查询某几个字段 # select name as xx,email from user; res session.…...