专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  自从系统引入 Disruptor 后,性能起飞! ·  8 小时前  
芋道源码  ·  SpringBoot + Tika ... ·  昨天  
芋道源码  ·  确保数据安全!使用Spring Boot ... ·  2 天前  
51好读  ›  专栏  ›  芋道源码

如何设计一个支持三千万用户同时在线的短视频系统?

芋道源码  · 公众号  · Java  · 2025-02-14 09:45

正文

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 芋道快速开发平台 知识星球。 下面是星球提供的部分资料:

👉 这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、 商城 、支付、工作流、大屏报表、微信公众号、 ERP CRM AI 大模型 等等功能:

  • Boot 多模块架构:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服务架构:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本

来源:疯狂打码中


一、前言

这个业务不熟悉。但是抖音的崛起,短视频场景也会是面试的考点。希望能够属性一下相关的大致数据。

短视频应用QuickTok的需求与技术架构详解

视频,尤其是短视频,以其时长在15分钟以内的精炼形式,成为了移动智能终端上拍摄、美化编辑、加特效并实时分享的新型视频形式。短视频凭借时间短、信息承载量高等特点,完美契合了当下网民的手机使用习惯,其用户流量更是孕育了巨大的商业机遇。

在此背景下,我们着手开发一个面向全球20亿用户的短视频应用——QuickTok。

相较于其他媒体文件,视频文件体积较大,这意味着存储短视频需要更为庞大的存储空间,播放时也需要更高的网络带宽。因此,QuickTok面临的主要技术挑战在于:如何应对高并发用户访问时的网络带宽压力,以及如何高效存储海量的短视频文件。接下来,让我们深入探讨QuickTok的需求与技术架构。

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

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

1、需求分析

QuickTok的核心功能需求简洁明了:用户能够轻松上传、搜索并观看视频。在此基础上,我们将深入剖析其非功能需求的重要性。

QuickTok预计将迎来20亿用户的庞大群体,其中日活跃用户将达到约10亿。若每位用户日均浏览10个短视频,那么短视频的日播放量将惊人地达到100亿次:

10亿 × 10 = 100亿

进一步推算,平均每秒的播放查询量(QPS)约为11万次:

100亿 ÷ (24小时 × 60分钟 × 60秒) ≈ 11万次/秒

这意味着每秒有11万用户点击视频。假设用户平均观看时长为5分钟,那么同时在线观看的视频数量将高达3000万个:

11万次/秒 × 5分钟 × 60秒 = 3000万

再考虑每个短视频平均被播放200次,为了支撑如此庞大的播放量,每秒需上传的视频数量达到550个:

11万次/秒 ÷ 200 = 550个/秒

鉴于每个短视频的平均大小为100MB,每秒上传至服务器的数据量即为55GB:

100MB × 550 = 55GB

虽然视频并非在瞬间全部上传至服务器,但此估算方法依然有效。

对于每年新增的视频内容,所需的存储空间高达1700PB:

55GB × 24小时 × 60分钟 × 60秒 × 365天 = 1700PB

然而,为了确保视频数据的高度可用性和防止数据丢失,QuickTok采用双副本备份存储策略,即每个视频文件存储三份。因此,总存储空间需求跃升至5200PB:

1700PB × 3 = 5200PB

此外,播放视频所需的总带宽也极为可观,达到88Tb:

11万次 × 100MB × 8bit = 88Tb

综上所述,我们需要构建的短视频应用需具备每秒上传550个视频文件、处理11万次播放请求、新增165GB(55GB×3)存储空间以及支持88Tb总带宽的高并发处理能力。这一系统不仅要求高性能,能够迅速响应用户的上传和播放需求,还必须确保高可用性,为全球用户提供7×24小时的稳定服务。

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

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

2、概要设计

QuickTok的核心部署模型如图所示:

用户上传视频时,请求会经过负载均衡服务器和网关服务器,最终到达视频上传微服务。该服务需完成两项任务:一是将上传文件数据流写入视频文件暂存服务器;二是将用户名、上传时间、视频时长、视频标题等元数据写入分布式MySQL数据库。

视频上传完成后,上传微服务会生成一个完成消息,并将其写入消息队列服务器。随后,视频内容处理器会消费此消息,并从暂存服务器获取视频数据进行处理。

视频内容处理器是一个由责任链模式构建的管道,视频将在此管道中依次进行内容合规性审查、内容重复性及质量审查、内容标签生成、视频缩略图生成以及统一视频转码处理等操作。

合规且非重复的视频经过统一转码后,将被写入分布式文件存储和CDN。至此,视频上传处理流程完成,具体时序图如下所示:

以上是对视频上传环节的设计概述。接下来,我们将探讨视频搜索及播放部分的设计,即核心部署模型图中标红的部分:

视频搜索引擎会根据用户提交的视频标题、上传用户等元数据,以及视频内容处理器生成的内容标签构建倒排索引。用户搜索时,系统会根据倒排索引检索符合条件的视频,并返回结果列表。结果列表在App端呈现时,会展示视频缩略图,以便用户初步了解视频内容。

用户点击缩略图后,App开始播放视频。无需下载整个视频文件,App以流的方式边下载边播放,确保用户获得流畅的观看体验。QuickTok采用MPEG-DASH流媒体传输协议进行视频流传输,该协议具有自适应能力且支持HTTP,完美满足QuickTok的视频播放需求。

3、详细设计

为解决QuickTok面临的两大挑战:如何存储海量视频文件以及如何解决高并发视频播放导致的带宽压力,我们的详细设计将聚焦于视频存储系统、性能优化与CDN的使用。

此外,“如何生成更吸引用户的缩略图”也是提升短视频应用用户体验的关键问题,因此详细设计还将涵盖缩略图的生成与推荐。

(1)视频存储系统设计

由需求分析可知,QuickTok每年需新增5200PB的存储。面对如此海量的存储需求,“如何存储视频文件”成为QuickTok设计的重要挑战之一。虽然我们可以尝试使用与前述网盘相似的存储技术方案,将视频文件拆分成若干block并使用对象存储服务进行存储,但QuickTok最终选择了另一种方案:使用Hadoop分布式文件系统HDFS进行存储。

HDFS非常适合大文件存储的一次写入多次读取场景,完美契合视频一次上传多次播放的需求。同时,HDFS还能自动进行数据备份(缺省配置下每个文件存储三份),满足我们对数据存储高可用性的要求。

由于HDFS适合存储大文件,大文件能减少磁盘碎片并有利于存储空间的利用,同时减轻HDFS NameNode的访问压力,因此我们需要将若干个视频文件合并成一个HDFS文件进行存储,并将存储细节记录到HBase中。

举例来说,当用户上传一个视频文件时,系统会自动生成一个视频ID(假设为123)。视频内容处理器对视频进行处理后,会调用视频文件存储服务进行存储。存储服务首先通过HDFS创建一个文件(如/data/videos/clust0/p0/000000001),然后将视频数据顺序写入HDFS。写入完成后,存储服务会获取HDFS文件的全路径名、视频在HDFS中的偏移量以及文件大小等信息,并将这些信息记录到HBase中。主键为视频ID(123),value为包含路径、偏移量和大小等信息的字符串。

若另一个用户上传的视频ID为456,文件大小为100,000,000B,且紧随上一个视频文件保存在同一个HDFS文件中,则HBase中会记录主键为456的条目,value为包含该视频在HDFS中的路径、偏移量和大小等信息的字符串。

当用户播放视频456时,播放微服务会根据视频ID在HBase中查找对应条目,获取HDFS文件路径及偏移量等信息,然后从HDFS文件中指定位置开始读取数据,即可获取完整的视频文件数据。

(2)性能优化与CDN设计

如前所述,QuickTok所需的总带宽高达88Tb,这是一个极为庞大的数字。若仅凭QuickTok自己的数据中心来承担这一带宽压力,将面临巨大的技术挑战和成本支出。因此,我们通过CDN将用户的网络通信请求就近返回,以缓解数据中心的带宽压力。

当用户请求获取视频数据流时,App会优先检查附近的CDN中是否有所需视频数据。若有,则直接从CDN加载数据;若无,才会从QuickTok数据中心获取视频数据流。

若用户的大部分请求都能通过CDN得到满足,则一方面能极大加快用户请求的响应速度,另一方面又能有效减轻数据中心的网络和硬盘负载压力,进一步提升应用的整体性能。

通常的CDN设计是在CDN中没有用户请求的数据时进行回源操作,即由CDN请求数据中心返回所需数据并缓存在CDN本地。但QuickTok考虑到了短视频的特点:大V、网红等发布的短视频会被更快速、更广泛地播放。因此,针对粉丝量超过10万的用户,QuickTok系统采用主动推送至CDN的方法以提高CDN命中率并优化用户体验。

从图中可以看出,视频内容处理器在完成视频处理后,一方面会将视频存储到视频存储系统中,另一方面会调用CDN推送服务。CDN推送服务会调用大数据平台获取视频上传者的活跃粉丝数、粉丝分布区域等数据。若用户粉丝量超过10万,则CDN推送服务会根据其粉丝活跃区域将视频推送到对应区域的CDN服务器上。

鉴于短视频的完播率通常不足30%,QuickTok无需将完整视频推送到CDN。相反,我们会根据视频发布者的历史播放记录计算其完播率和播放期望进度,然后将短视频切分成若干chunk,并将部分chunk推送到CDN即可。

业界普遍认为,视频应用CDN处理的带宽占总带宽的95%以上。这意味着通过合理使用CDN,QuickTok数据中心需要处理的带宽压力将降至不到4Tb。

(3)缩略图生成与推荐设计

用户可以在App主页、搜索结果页、视频推荐页等页面看到视频列表,每个视频都配备有缩略图。用户点击缩略图即可开始播放视频。

缩略图通常由视频的某一帧画面缩略而成。事实上,缩略图的选择会极大地影响用户点击和播放视频的意愿。一个10分钟的视频大约包含3万帧画面,那么选择哪一帧画面才能最大化用户点击视频的可能性呢?此外,针对不同用户分类是否选择不同的缩略图会产生更高的点击率呢?







请到「今天看啥」查看全文