听说你会架构设计,来,弄一个短视频系统

大家好,我是小 ❤。

引言

不知道各位后台开发者有没有过这样的经历:在地铁上刷着抖音停不下来,回家后又在快手上看各类生活分享。

可当产品经理拍着你的肩膀说 "咱们也搞个短视频系统" 时,瞬间从 "用户" 切换到 "开发者" 视角,满脑子都是 海量视频存储怎么搞高并发推流怎么扛实时推荐怎么做到精准 的灵魂拷问。

在当下的互联网生态中,短视频早已成为用户时长占比最高的应用形态之一。

某音、某手等头部平台单日活跃用户数以亿计,每秒都有上万条视频被 上传、转码、分发,同时还有亿级用户在实时 刷新、观看、互动

要支撑这样庞大的业务规模,背后的系统架构设计绝非简单的 "CRUD + 文件存储" 就能搞定。

本文将以某音、某手为参考原型,从后台技术视角拆解短视频系统的架构设计,涵盖整体架构分层、核心功能技术实现、关键技术难点突破等内容,为各位开发者提供一套可落地的短视频系统架构思路,让你面对 "搞个短视频系统" 的需求时,能从容给出技术方案。

一、整体架构

短视频系统是典型的 "高并发、海量数据、低延迟" 综合系统,需兼顾 视频生产(上传、转码)、内容分发(推荐、CDN)、用户互动(点赞、评论、分享) 三大核心链路,整体采用 "分层解耦 + 微服务化" 架构设计,从下到上可分为基础组件层、核心服务层、算法引擎层、接入层四层,同时配套监控运维体系保障系统稳定性。

1.1 架构图

1.2 关键组件说明

(1)接入层

  • API 网关 :采用 Kong/APISIX,负责请求路由、鉴权(JWT/OAuth2.0)、限流(令牌桶算法)、灰度发布(基于 用户 ID / 地域 的流量切分),同时统一处理跨域、请求参数校验,屏蔽后端服务复杂性。
  • 负载均衡 :使用 Nginx/LVS,结合 DNS 轮询实现 地域级流量分发,将用户请求引导至就近的机房节点,降低网络延迟(如北京用户接入北京机房,广州用户接入广州机房)。
  • 灰度发布 :在关键功能上线时,特别是一些商业化能力,需要通过用户反馈、数据看板来查看当前功能的实践性,所以在发布时,我们会在网关层配置 用户灰度 比例(如采用 Hash 桶散列分布的方式),让一部分用户首先体验到新功能。

(2)核心服务层

  • 视频生产服务 :负责视频 上传、转码、审核 流程,拆分为上传服务(接收客户端视频分片)、转码服务(调用转码集群处理多码率)、审核服务(对接内容审核接口)三个微服务。
  • 视频分发服务 :核心是 "推流 - 拉流" 链路,包含 推流 服务(接收转码后的视频流,写入 CDN 源站)、拉流 服务(为客户端提供视频播放地址,支持断点续传)、缓存 服务(Redis 缓存热门视频元数据,减少 DB 访问)。
  • 互动服务:处理点赞、评论、分享、关注等互动行为,拆分为互动服务(处理点赞 / 评论的增删改查)、关系服务(管理用户关注 / 粉丝关系)、消息服务(推送评论通知 / 关注通知),本文主要关注核心模块的互动服务。
  • 用户服务 :管理用户基础信息(账号、昵称、头像)、登录态(Session/Token 管理)、权益(会员特权、创作激励),数据存储采用 MySQL 分库分表(按用户 ID 哈希分片)。

(3)算法引擎层

  • 推荐模块 :核心是 "实时推荐 + 离线推荐" 双引擎,离线推荐基于 Spark/Flink 计算用户长期兴趣(T+1 更新),实时推荐基于 Flink 流处理计算用户短期兴趣(秒级更新),最终通过推荐 API 返回个性化视频列表。
  • 用户画像模块:基于用户基础信息、互动行为(点赞 / 评论 / 完播率)、观看时长等数据,通过 ES(Elasticsearch)存储用户标签(如 "喜欢美食""关注汽车"),为推荐、内容审核提供数据支撑。
  • 内容审核模块:结合 AI 审核(识别违规画面 / 文字)和人工审核,对上传的视频进行实时过滤,违规视频直接拦截,疑似违规视频进入人工审核队列,保障内容合规性。

(4)基础组件层

  • 存储组件 :视频文件存储采用 对象存储(S3/OSS),支持海量文件存储和高并发访问;结构化数据 (用户信息、互动记录)存储采用 MySQL(主从架构),非结构化数据 (用户画像、日志)存储采用 ES/HDFS;缓存 采用 Redis(集群模式,分片 + 哨兵),缓存热门视频元数据和用户登录态。
  • 计算组件离线计算 采用 Spark(处理用户画像、推荐模型训练),实时计算 采用 Flink(处理实时推荐、用户行为日志),为算法引擎提供算力支撑。
  • 消息队列 :采用 Kafka(集群模式),解耦 服务间依赖,如视频上传完成后发送 "转码任务" 消息,转码完成后发送 "审核任务" 消息,避免服务直接调用导致的耦合。
  • CDN:对接阿里云 / 腾讯云 CDN,将转码后的视频缓存到全国节点,用户拉取视频时从就近 CDN 节点获取,降低源站压力,提升播放速度。

二、核心功能技术实现

2.1 视频上传与转码

  • 上传流程:客户端采用 "分片上传"(将视频分成 1MB / 片),通过 HTTP/2 协议上传至上传服务,上传服务校验分片完整性后,调用对象存储合并分片,生成视频源文件;同时发送 "转码任务" 到 Kafka,转码服务消费消息后,调用 FFmpeg 转码集群,将源视频转成 480P/720P/1080P 多码率格式,转码完成后更新视频元数据状态。
  • 关键技术:分片上传(断点续传,避免网络中断重传整个视频)、异步转码(采用 Celery 任务队列,支持任务优先级,热门用户视频优先转码)、QUIC 协议(弱网环境下提升上传速度,降低丢包率)。

想要详细了解视频上传和转码的可以看我之前的文章:短视频上传与转码全流程解析

2.2 视频推荐与分发

  • 推荐流程:用户打开 APP 后,客户端调用推荐 API,推荐服务先从 Redis 获取 "用户短期兴趣标签"(如最近 1 小时点赞的视频类型),再从 Spark 离线计算结果中获取 "用户长期兴趣标签",结合用户地域、设备型号等信息,从 ES 中筛选符合条件的视频列表,通过负载均衡返回给客户端;同时,用户观看视频的行为(完播 / 点赞 / 评论)实时上报至 Flink 集群,更新用户实时兴趣标签,用于下一次推荐。
  • 关键技术:协同过滤算法(基于用户行为相似性推荐)、深度学习模型(如 DeepFM,融合用户特征和视频特征)、缓存预热(将热门推荐列表提前缓存到 Redis,降低推荐服务响应时间)。

想要详细了解推荐与分发的可以看我之前的文章:5张图带你深入短视频推荐分发背后的技术逻辑

2.3 用户互动(点赞 / 评论)

  • 点赞流程:客户端发送点赞请求到互动服务,互动服务先校验用户登录态,再判断用户是否已点赞(Redis 查询,避免重复点赞),未点赞则更新 MySQL(点赞表,按用户 ID 分表)和 Redis(用户点赞集合),同时发送 "点赞通知" 消息到 Kafka,消息服务消费后推送通知给视频作者。
  • 关键技术:Redis 分布式锁(避免并发点赞导致的数据不一致)、MySQL 分表(按用户 ID 哈希分表,支撑亿级用户互动数据存储)、读写分离(点赞查询走 Redis,写入走 MySQL 主库,读走从库)、CDN 预热提升互动拉取的速度。

三、技术难点与解决方案

3.1 海量视频存储成本控制

问题拆解

短视频单文件 10-50MB,亿级存量视频需至少 100PB 存储空间(按 1 亿条、平均 10MB 计算),若全用标准存储,年成本超千万元。

且视频访问存在 "冷热分化"------ 近 30 天视频播放量占总播放量的 80%,老旧视频访问频次极低,全量高成本存储造成资源浪费。

分层存储策略

首先,我们定义 "热 / 温 / 冷" 三级数据:

  • 热门视频(近 7 天播放量 Top10%、或单日播放量 > 1000 次)存对象存储 SSD 节点(如阿里云 OSS 高性能版),保障毫秒级拉流响应;
  • 普通视频(近 30 天有播放、非热门)存 HDD 标准节点(成本为 SSD 的 1/2);
  • 归档视频(超过 3 个月无播放、或用户主动归档)迁移至冷存储(如 OSS 归档版,成本仅为标准存储的 1/5)。
具体实现

通过定时任务 (如 Crontab 离线作业,每日凌晨执行)统计视频播放量,触发存储级别自动迁移

同时提供 "手动归档" API,允许创作者将历史视频转入冷存储,迁移过程中通过 "软链接" 保持播放地址不变,避免用户感知。

视频压缩优化

转码阶段默认采用 H.265 编码(对比 H.264,相同清晰度下码率降低 30%,即 10MB 视频可压缩至 7MB),同时针对不同场景做适配:短视频 (15-60 秒)码率控制在 500-1500kbps(480P→500kbps、720P→1000kbps、1080P→1500kbps),避免码率冗余;长视频(超过 1 分钟)采用 "动态码率"(VBR),画面复杂段提高码率、静态段降低码率,进一步节省 20% 存储。

兼容性处理

针对不支持 H.265 的老旧设备(如部分 Android 7.0 以下机型),转码时额外生成 H.264 低码率版本,客户端通过设备检测接口选择对应格式,兼顾兼容性与成本。

3.2 高并发推流与低延迟播放

问题拆解

峰值时段(如晚间 8-10 点)每秒新增 1000 + 条推流请求,若直接推至源站,会导致源站带宽瓶颈

同时百万级用户同时拉流时,单节点带宽压力超 10Gbps,易出现丢包、延迟(>3 秒),播放卡顿率超 5% 会显著降低用户留存。

推流侧:边缘节点

架构设计

客户端通过 DNS 解析获取就近边缘节点(如用户在杭州,解析到阿里云杭州边缘节点),视频分片先上传至边缘节点,边缘节点完成 "分片校验 + 临时存储" 后,再异步同步至中心源站(采用增量同步,仅传输新分片),避免源站直接承接高并发推流。

技术实现

边缘节点部署 "推流代理服务"(基于 Nginx-RTMP 模块二次开发),支持 HTTP/2 和 QUIC 协议;客户端分片上传时,边缘节点返回 "分片唯一标识",若网络中断,客户端可通过标识续传未完成分片,重传成功率提升至 99%。

拉流侧:CDN 多级缓存 + 播放优化

CDN 缓存策略

采用 "边缘节点→区域节点→源站 " 三级缓存,热门视频(播放量 > 10 万次)直接缓存至边缘节点(覆盖全国 300 + 城市),用户拉流时延迟 < 100ms;普通视频 缓存至区域节点(如华东、华南区域中心),边缘节点无缓存时从区域节点拉取,避免直接访问源站。

客户端优化

实现 "预加载 + 自适应码率 " 双机制 ------ 用户播放当前视频时,后台预加载下一个推荐视频(预加载 50% 内容),切换视频时实现 "无缝播放";同时客户端实时检测网速(每 2 秒计算一次下载速率),若网速 < 1Mbps 自动切换至 480P,1-3Mbps 切换至 720P,>3Mbps 切换至 1080P,卡顿率可控制在 1% 以内。

3.3 实时推荐系统高可用

问题拆解

实时推荐依赖三大环节 ------Flink 实时计算(秒级更新用户短期兴趣)、ES 检索(毫秒级筛选视频)、推荐服务 API(聚合结果) ,任一环节故障(如 Flink 集群重启、ES 分片异常)都会导致推荐列表空白或返回错误内容,影响核心用户体验(推荐列表是短视频 APP 的主要流量入口,不可用会导致 DAU 下降 40%+)。

多级降级预案

一级降级(实时引擎故障)

当 Flink 实时计算集群延迟 > 5 秒(通过监控告警检测),推荐服务自动切换至 "离线推荐 + 短期缓存" 模式 ------ 使用 Spark T+1 离线计算的用户长期兴趣标签,结合 Redis 缓存的 "用户最近 1 小时互动视频类型"(如最近点赞过 "美食"),生成推荐列表,避免实时数据缺失导致的兴趣偏差。

二级降级(ES 故障)

当 ES 集群健康度 <90%(如分片不可用),推荐服务直接返回 Redis 中缓存的 "热门视频列表" (每 10 分钟更新一次,存储 Top1000 条热门视频),同时标记 "降级状态",前端显示 "热门推荐" 标识,降低用户感知。

三级降级(推荐服务过载)

通过 Sentinel 配置推荐 API 的 QPS 阈值(如单节点 1000QPS),当并发超阈值时,自动返回 "简化推荐列表" (仅返回 20 条视频,而非默认 50 条),同时拒绝非核心推荐请求(如 "相似视频推荐"),优先保障首页主推荐流可用。

数据一致性保障

离线推荐结果预加载

每日凌晨 Spark 离线计算完成后,将用户长期兴趣推荐列表提前写入 Redis (按用户 ID 分片存储),推荐服务优先从 Redis 读取,减少 ES 访问依赖;同时通过 "版本号机制" 确保 Redis 与 ES 数据同步 ------ 当 ES 数据更新时,同步更新 Redis 中的版本号,推荐服务发现版本不一致时触发增量更新

故障恢复自动切换

通过监控系统(如 Prometheus+Grafana)实时检测各环节状态,当故障环节恢复(如 Flink 延迟恢复正常、ES 分片重新分配完成),推荐服务自动切换回正常模式,切换过程无感知(通过双活服务部署,旧模式服务继续处理存量请求,新模式服务承接增量请求,待存量请求处理完后下线旧模式)。

四、小结:从 "满头问号" 到 "架构落地",我们还能走得更远

写这篇架构拆解时,我总会想起第一次接 "做短视频系统" 需求的场景 ------ 对着产品经理画的 "某音同款" 原型图,手里的笔悬了半小时,满脑子都是 "这亿级视频存哪里""百万并发怎么抗" 的焦虑。

但当把架构拆成 "接入层挡请求、核心服务做流转、算法引擎给智能、基础组件托底" 四层后,突然发现复杂问题也能 "化整为零"。

回头看全文,我们其实只做了三件事:把模糊需求拆成技术模块 (比如把 "视频上线" 拆成上传、转码、审核三步),给每个模块选对工具 (推流用边缘节点卸压、推荐用 Spark+Flink 双引擎),给关键痛点留好退路(存储分冷热控成本、推荐做三级降级保可用)。

这些方案没有什么 "黑科技",但胜在落地性 ------ 毕竟对开发者来说,能 扛住流量、控住成本、不出故障的架构,才是好架构。

如果你在做类似系统时踩过坑,或者对某块技术有疑问,欢迎在评论区留言 ------ 说不定下次我们就一起拆解 "视频转码集群的实战踩坑笔记",或者 "推荐系统从 0 到 1 的代码实现"。

毕竟技术这条路,一个人走得快,一群人才能走得远。

下次见时,希望我们都能对着 "做个短视频系统" 的需求,笑着说一句:"这事儿,我熟!"

我是小❤,我们下期再见!

点个推荐** 你最好看

相关推荐
颜酱2 小时前
# 02 | 搭骨架:用 LangGraph 编排 12 步工作流(思路)
前端·人工智能·后端
颜酱2 小时前
02 | 搭骨架:用 LangGraph 编排 12 步工作流
前端·人工智能·后端
嘉伟桑3 小时前
Python调用电价API返回JSON示例:分时电价、现货电价和字段解析
后端
武子康3 小时前
Shippy:确定性工具、会话级 Sandbox 与 Live-Data Eval(4 类收敛 + 7 步实现方案 + 6 类评测指标)
前端·人工智能·后端
我叫黑大帅3 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试
AskHarries4 小时前
文件上传系统
后端
止语Lab4 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活4 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困4 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn4 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端