Next.js + Droplet:高并发视频内容平台部署与优化扩展实战

在构建在线服务时,无论你是开发者还是企业技术负责人,扩展性和稳定性始终是绕不开的核心挑战。尤其在涉及高并发访问、大量数据传输和持续内容分发的场景中,系统架构的设计直接决定了用户体验与业务成效。

本文将以视频点播(Video-on-Demand, VoD)平台为案例,深入解析一套可复用的技术方案,帮助你了解如何基于 DigitalOcean Droplets 构建、部署并扩展支持大规模访问的在线服务架构。虽然示例聚焦在 OTT(Over-the-Top) 视频平台,但这套方法同样适用于其他典型业务场景,例如:

  • 在线教育平台需支持高清视频课程播放;
  • 企业内部培训系统需要稳定传输与权限管理;
  • 创作者社区需承载高频上传与分发;
  • 电商或品牌网站希望引入视频营销内容。

通过这篇文章,你将了解如何:

  • 构建支持高质量视频流的服务体系;
  • 应对用户激增时的负载挑战,避免服务宕机;
  • 灵活管理带宽与存储,确保资源高效利用;
  • 保持系统弹性与成本可控,支持业务持续增长。

无论你正在优化现有架构,还是计划构建下一代内容平台,本文都将提供一套值得借鉴的思路和实践经验。话不多说,我们正式开始。

前提条件

  • 一个 DigitalOcean 账户,用于创建 Droplets。
  • 对 Next.js 有基本了解(如果您还需要构建一个基于 Next.js 的应用;否则,您可以直接 fork 和克隆本文提到的 GitHub 仓库进行测试)。

在我们开始构建之前,让我们首先了解像 Netflix 这样的流媒体平台是如何工作的。为了将内容交付给数百万用户,他们依赖于强大的服务器。我们也将通过 DigitalOcean Droplets 创建自己的服务器。

什么是 DigitalOcean Droplets?

DigitalOcean Droplet 是一个基于 Linux 的虚拟机(VM),运行在 DigitalOcean 的云基础设施上。可以将它看作是您在云端的虚拟服务器,可以独立使用,也可以作为更大的云基础设施的一部分使用。

每个 Droplet 都是一个完全功能的服务器,拥有自己的 CPU、RAM 和 SSD 存储。您可以根据需求选择各种配置(大小),从基础型(basic)的 1GB RAM / 1 vCPU 设置到性能更好的 32GB RAM / 16 vCPU 机器。您可以通过 DigitalOcean 的控制面板或 API 轻松调整大小、备份和管理 Droplets(我们将在本文后面部分中看到这些操作)。另外,我们也曾在博客中介绍过不同类型DigitalOcean Droplet 的配置与适用场景,可浏览往期内容进一步了解。

了解我们的视频点播应用的工作原理

设置很简单:我们有一个基于 Next.js 的前端、来自 DigitalOcean 的服务器以及访问它的客户端(用户)。

具体流程如下:

  1. 用户通过浏览器或移动设备访问应用;
  2. 所有请求由一个 DigitalOcean Droplet 处理;
  3. 这个 Droplet 运行以下内容:
    1. 提供前端和 API 的 Next.js 应用;
    2. 用于存储上传内容的视频库。

以下是流程架构图:

这个设置比 Netflix 的基础设施简单得多,后者需要多个区域的多台服务器来服务数百万用户。在后面的章节中,我们将讨论如何升级 Droplet,以处理更多的并发用户并加快视频处理速度。


在 DigitalOcean Droplet 上部署 Next.js 应用

本文示例中的视频点播平台是用 Next.js 构建的,我们将展示如何克隆它并将其托管在 Droplet 上。

1、从 GitHub fork 和克隆仓库,然后进入“设置”,在“部署密钥”下添加使用 ssh-keygen 命令生成的 SSH 密钥。

2、创建一个 $12/月的基础型(Basic)的 Droplet 来托管我们的应用。

3、Droplet 创建完成后,使用命令 ssh root@ipaddress 连接它,然后运行以下命令进行准备工作:

# 更新并安装 Node.js
sudo apt update && sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs nginx# 安装 PM2 进行进程管理
sudo npm install -g pm2

4、配置 Nginx 以运行 Next.js 应用:

# 创建 Nginx 配置
sudo nano /etc/nginx/sites-available/video-on-demand

添加以下内容:

server {listen 80;server_name yourip;location / {proxy_pass http://localhost:3000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;}
}

启用站点并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/video-on-demand /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx

如果 Nginx 配置正确,当你运行 sudo nginx -t 命令时,你会看到以下输出:

接下来的步骤是克隆 GitHub 仓库。我们复制下图中显示的 SSH 链接,然后运行以下命令来启动并运行它:

https://github.com/Haimantika/video-on-demand

# 设置应用
git clone git@github.com:Haimantika/video-on-demand.git
cd frontend
npm install
npm run build

最后一步是通过 IP 地址访问应用,为此我们将使用 PM2。你可以通过命令 npm install -g pm2 安装它,然后使用以下命令通过 PM2 运行应用:

# 使用 PM2 启动
cd /var/www/video-on-demand/frontend
pm2 start npm --name "video-on-demand" -- start
pm2 save
pm2 startup

如果你想了解更多关于在 DigitalOcean Droplet 上部署 Next.js 应用的内容,可以参考教程 在 DigitalOcean Droplet 上部署 Next.js 应用。

现在我们的点播视频应用已经在基础 Droplet 上运行了。让我们了解它如何表现,以及何时可能需要升级。一个很好的例子是为什么服务器配置很重要,比如 Mike Tyson 和 Jake Paul 的比赛,Netflix 遭遇了缓冲、卡顿和崩溃等问题。虽然上传内容与直播的工作方式不同,但服务器配置至关重要,尤其是在处理大量观众激增以及防止崩溃和缓冲问题时。

添加负载均衡器

通常,扩展像这样的应用的第一步是添加负载均衡器。由于它能够分配传入流量并为应用提供单一入口点,因此更容易扩展。要为你的 Droplet 添加负载均衡器,请按照教程《如何创建区域负载均衡器》中提到的步骤操作。

当你成功为 Droplet 添加负载均衡器后,你会在控制面板中看到以下内容:

通过这种方式,你现在可以更好地管理流量,提高响应时间,实现 SSL 终止和健康监控。

处理更多上传的垂直扩展

虽然负载均衡器在分配流量方面表现出色,但你需要垂直扩展来处理更多的上传和视频处理任务。垂直扩展意味着将现有的 Droplet 升级为更大的配置,类似于升级计算机的硬件。这可以提供更高的 CPU 性能来处理上传任务,更多的 RAM 来处理并发请求,以及更快的磁盘 I/O 来存储视频。此外,垂直扩展在处理大文件上传方面表现更好,并且在访问库时具有更快的响应时间。

让我们通过示例和基准测试来理解这一点,并比较基础 Droplet 和高级 Droplet 的性能。

基准测试我们的视频点播应用

在本节中,我们将看到应用在不同 Droplet 配置上的性能表现。我们将比较两种 Droplet 的性能:普通 Intel(1 个 vCPU/2 GB 内存)价格为每月 12 美元,以及高级 Intel(2 个 vCPU/4 GB 内存)价格为每月 32 美元。

以下是我们在升级前和升级后的对比:

要了解如何调整 Droplet 的大小,请参考教程《如何调整 Droplet 的大小以实现垂直扩展》。

为了进行基准测试,我们将使用以下指标:

  1. CPU 性能测试(sysbench)
  2. 磁盘性能测试(fio)
  3. 网络速度测试(speedtest-cli)
  4. 并发用户负载测试(Apache Benchmark)
  5. 首字节时间(TTFB)

CPU 性能测试(sysbench)

这衡量服务器处理计算任务的处理能力和效率。

为了测试 Droplet 的 CPU 性能,我们将使用以下命令:

sudo apt update && sudo apt install -y sysbench
sysbench cpu run --threads=4 --time=30

比较结果如下:

指标基础 Intel(12 美元)高级 Intel(32 美元)提升幅度
每秒事件数413.50958.682.32 倍
总事件数(30 秒)12,40828,7662.32 倍
平均延迟9.64 毫秒4.16 毫秒响应时间快约 57%
95 百分位延迟14.21 毫秒10.27 毫秒稳定性提高 28%
最大延迟22.63 毫秒33.53 毫秒峰值更高,但平均值更好
线程公平性(标准差)1.87115.63高级 Droplet 分配工作更好

从表中可以看出,高级 Droplet 的 CPU 性能约快 2.3 倍,平均响应时间降低 57%,在高负载下具有更好的稳定性。由于视频点播应用通常处理高流量和 CPU 密集型任务(如视频处理),升级 Droplet 可显著提高性能。

磁盘性能测试(fio)

这评估存储的读写速度和 IOPS(每秒输入/输出操作数),用于视频上传和存储。

为了进行磁盘性能测试,我们将使用以下命令:

sudo apt install -y fio
fio --name=randrw --rw=randrw --bs=4k --size=1G --numjobs=4 --runtime=60s

基础 Intel 和高级 Intel Droplet 的对比结果如下:

指标基础 Droplet(1 个 vCPU)高级 Droplet(2 个 vCPU)提升幅度
读取速度21.9 MiB/s (22.9 MB/s)38.9 MiB/s (40.8 MB/s)约快 77%
写入速度21.9 MiB/s (22.9 MB/s)39.0 MiB/s (40.9 MB/s)约快 78%
平均 IOPS1414.822501.28约高 76.7%
平均延迟(微秒)9.64 毫秒4.16 毫秒约低 57%(更好)
磁盘利用率32.59%61.01%高级 Droplet 资源利用率更高

从表中可以看出,高级 Intel Droplet 在获取视频、视频上传和存储操作方面表现更好,并且每秒可以处理更多的 I/O 操作,这对于视频密集型应用来说是理想的。

网络速度测试(speedtest-cli)

这测试上传/下载速度和延迟,用于视频流传输。

为了进行网络速度测试,我们运行以下命令:

sudo apt install -y speedtest-cli
speedtest-cli

在基础 Intel Droplet 和高级 Intel Droplet 上运行时,我们得到以下结果:

指标基础 Intel高级 Intel提升幅度
延迟(Ping)3.398 毫秒2.019 毫秒约低 40.6%(更好)
下载速度1449.83 Mbit/s4976.82 Mbit/s约快 3.4 倍
上传速度976.40 Mbit/s1939.47 Mbit/s约快 2 倍

对于需要快速内容交付的视频点播应用,高级 Intel Droplet 带来了更好的结果,因为它具有 3.4 倍的下载速度、2 倍的上传速度和更低的延迟。

并发用户负载测试(Apache Benchmark)

并发负载测试模拟多个用户,以衡量服务器处理同时连接的能力。

我们使用以下命令对应用进行了 100 个用户的负载测试:

sudo apt install -y apache2-utils
ab -n 1000 -c 100 http://yourdomain.com/video.mp4

测试结果如下:

指标基础 Droplet(12 美元)高级 Droplet(32 美元)提升幅度
每秒请求数8.06 [#/秒]3716.82 [#/秒]吞吐量显著提高
每请求时间(平均)12402.048 毫秒26.905 毫秒响应时间大幅缩短
每请求时间(并发)124.020 毫秒0.269 毫秒高效处理并发请求
传输速率404.28 KB/秒1622.48 KB/秒数据传输速度更快
处理时间333 / 11845 / 151856 / 14 / 36处理时间减少
等待时间290 / 11706 / 151005 / 11 / 35请求等待时间最少

这表明,高级 Intel Droplet 更快,能够高效处理高负载,而基础 Intel Droplet 在并发流量下表现不佳,不适合扩展到更多用户。

首字节时间(TTFB)

这是为了衡量服务器开始向用户发送数据的速度。

为了测试首字节时间,我们使用以下命令:

curl -o /dev/null -s -w "%{time_starttransfer}\\n" http://yourdomain.com/video.mp4

基础 Droplet 的 TTFB 为 3.5299 秒,而高级 Droplet 的 TTFB 为 0.8217 秒。这意味着高级 Droplet 在响应初始请求方面快了 4 倍。

结论

我们的基准测试结果显示,从基础 Droplet 升级到高级 Droplet 后性能显著提升。高级 Droplet 表现出:

  • 视频处理的 CPU 性能快 2.3 倍
  • 视频存储的磁盘操作快 77%
  • 内容交付的下载速度快 3.4 倍
  • 更好地处理并发用户
  • 初始响应时间快 4 倍

这些改进转化为更好的用户体验,特别是在处理多个视频上传或同时为许多用户交付内容时。

以上就是本次教程内容。DigitalOcean云服务以简单易用和价格实惠而广受开发者青睐,欢迎免费试用。同时,如果你是亚洲地区的企业,如果在使用DigitalOcean时遇到技术问题,或者是希望迁移到DigitalOcean,或做多云部署需要建议​,欢迎直接联系DigitalOcean中国区独家战略合作伙伴卓普云。​

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

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

相关文章

Python爬虫第13节-解析库pyquery 的使用

目录 前言 一、pyquery 初始化 1.1 字符串初始化 1.2 URL 初始化 1.3 文件初始化 二、基本 CSS 选择器 三、pyquery 查找节点 3.1 子节点 3.2 父节点 3.3 兄弟节点 四、遍历 五、获取信息 5.1 获取属性 5.2 获取文本 六、节点操作 6.1 addClass 和 removeClass…

【Hadoop入门】Hadoop生态之Pig简介

1 什么是Pig? 在大数据分析领域,Apache Pig是一个不可忽视的重要工具。Pig是Apache Hadoop生态系统中的一个高级数据分析平台,它提供了一种称为Pig Latin的脚本语言,用于简化大规模数据集的并行处理。Pig的核心思想是将复杂的数据…

python 语言 设计模式

python 语言 设计模式 设计模式是指在软件开发过程中,针对反复出现的问题所总结归纳出的通用解决方案。以下是一些常见的Python语言设计模式: 目录 python 语言 设计模式创建型模式结构型模式行为型模式创建型模式 单例模式 定义:保证一个类只有一个实例,并提供一个全局访…

QT QML布局

一、‌锚点布局(Anchors) 通过定义元素与其他元素或父容器的锚点关系实现定位,支持动态调整和边距控制‌。 Rectangle {anchors.left: parent.left // 左对齐父容器anchors.top: parent.top // 顶部对齐父容器anchors.margins: 10 // 统一设置四周边距width: …

【力扣03】无重复字符的最长子串

题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释:…

一文介绍阿里32B推理模型

什么是QwQ-32B? QwQ-32B并非普通的聊天机器人模型,而是推理模型。推理模型专注于逻辑拆解问题、分步推导,并输出结构化答案。 通过下面的示例,我们可以直观看到QwQ-32B的思考过程: qwq-32b思考过程 如果你需要写作辅…

AutoGen深度解析:从核心架构到多智能体协作的完整指南

AutoGen是微软推出的一个革命性多智能体(Multi-Agent)框架,它通过模块化设计和灵活的对话机制,极大地简化了基于大型语言模型(LLM)的智能体系统开发。本文将深入剖析AutoGen的两个核心模块——core基础架构和agentchat多智能体对话系统,带您全…

HTML的svg元素

<svg>元素 <svg>是一种用于描述二维矢量图形的 XML 格式&#xff0c;可以直接嵌入 HTML 文档中。 <svg>基本用法 <svg>的几种基本用法,包括圆形&#xff0c;正方形&#xff0c;三角形&#xff0c;直线 &#xff0c;折线等 <body><svg widt…

Qt 子项目依赖管理:从原理到实践的最佳分析:depends还是 CONFIG += ordered

1. 问题背景 在Qt项目开发中&#xff0c;当一个工程包含多个子项目&#xff08;如库、插件、测试模块&#xff09;时&#xff0c;如何正确管理它们的构建顺序和依赖关系&#xff1f; 如&#xff1a; 在开发一个包含核心库&#xff08;core&#xff09;、GUI模块&#xff08;g…

业务幂等性技术架构体系-接口幂等

接口幂等 对于幂等的考虑&#xff0c;主要解决两点前后端交互与服务间交互。这两点有时都要考虑幂等性的实现。从前端的思路解决 的话&#xff0c;主要有三种&#xff1a;前端防重、PRG模式、Token机制。 前端防重 通过前端防重保证幂等是最简单的实现方式&#xff0c;前端相关…

AI工具导航大全 | 2025精选版(持续更新)

&#x1f680; AI工具导航大全 | 2025精选版&#xff08;持续更新&#xff09; 更新日期&#xff1a;2025-04-11 | 适用场景&#xff1a;学术研究 | 办公提效 | 创意设计 | 开发编程 数据来源&#xff1a;综合高校实验室、企业实践及开发者社区推荐 &#x1f50d; 导航目录 &…

驱动-内核空间和用户空间数据交换

内核空间与用户控件数据交换 前面了解的字符设备中对 file_operations 结构体的进行了填充&#xff0c; 该 结构体的每一个成员都对应着一个系统调用&#xff0c; 例如 read、 write 等&#xff0c; 在字符设备相关的文章中有实验过对 调用函数进行了标志打印&#xff0c; 并没…

5G_WiFi_CE_DFS

目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择&#xff08;DFS&#xff09;要求 5、产品角色确定测试项目 6、测试项目 测试项1&#xff1a;信道可用性检查&#xff08;Channel Availability Check&#xff09; …

Devops之GitOps:什么是Gitops,以及它有什么优势

GitOps 定义 GitOps 是一种基于版本控制系统&#xff08;如 Git&#xff09;的运维实践&#xff0c;将 Git 作为基础设施和应用程序的唯一事实来源。通过声明式配置&#xff0c;系统自动同步 Git 仓库中的期望状态到实际运行环境&#xff0c;实现持续交付和自动化运维。其核心…

【蓝桥杯】单片机设计与开发,第十二届

/*头文件声明区*/ #include <STC15F2K60S2.H>//单片机寄存器头文件 #include <init.h>//初始化底层驱动头文件 #include <led.h>//led,蜂鸣器,继电器底层驱动头文件 #include <key.h>//按键底层驱动头文件 #include <seg.h>//数码管底层驱动头…

Vue3连接MQTT作为客户端

先下载依赖 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api创建 mes.js // 导入axios import axios from axios;// 定义一个变量,记录公共的前缀, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…

主服务器和子服务器之间通过NFS实现文件夹共享

背景&#xff1a; 子服务器想做一个备份服务器 但是之前有很多文件是上传到本地的&#xff0c;于是服务要从本地读取文件 但是在不在同一台服务器中&#xff0c;读取就会有问题&#xff0c;想 实现在两者之间创建一个共享文件夹 一 NFS挂载步骤&#xff1a; 在主服务器&#…

LeetCode算法题(Go语言实现)_39

题目 给定一个二叉树的根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 一、代码实现 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func rightSideView(root *TreeNode) []int {i…

【AI提示词】长期主义助手提供规划支持

提示说明 长期主义是一种关注长期利益和持续学习的思维模式&#xff0c;帮助个人和组织在快速变化的环境中保持耐心和系统性思考。 提示词 # Role: Long-termist Assistant## Profile - language: 中文 - description: 长期主义是一种关注长期利益和持续学习的思维模式&…

数组 array

1、数组定义 是一种用于存储多个相同类型数据的存储模型。 2、数组格式 &#xff08;1&#xff09;数据类型[ ] 变量名&#xff08;比较常见这种格式&#xff09; 例如&#xff1a; int [ ] arr0&#xff0c;定义了一个int类型的数组&#xff0c;数组名是arr0&#xff1b; &am…