在构建在线服务时,无论你是开发者还是企业技术负责人,扩展性和稳定性始终是绕不开的核心挑战。尤其在涉及高并发访问、大量数据传输和持续内容分发的场景中,系统架构的设计直接决定了用户体验与业务成效。
本文将以视频点播(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 的服务器以及访问它的客户端(用户)。
具体流程如下:
- 用户通过浏览器或移动设备访问应用;
- 所有请求由一个 DigitalOcean Droplet 处理;
- 这个 Droplet 运行以下内容:
- 提供前端和 API 的 Next.js 应用;
- 用于存储上传内容的视频库。
以下是流程架构图:
这个设置比 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 的大小以实现垂直扩展》。
为了进行基准测试,我们将使用以下指标:
- CPU 性能测试(sysbench)
- 磁盘性能测试(fio)
- 网络速度测试(speedtest-cli)
- 并发用户负载测试(Apache Benchmark)
- 首字节时间(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.50 | 958.68 | 2.32 倍 |
总事件数(30 秒) | 12,408 | 28,766 | 2.32 倍 |
平均延迟 | 9.64 毫秒 | 4.16 毫秒 | 响应时间快约 57% |
95 百分位延迟 | 14.21 毫秒 | 10.27 毫秒 | 稳定性提高 28% |
最大延迟 | 22.63 毫秒 | 33.53 毫秒 | 峰值更高,但平均值更好 |
线程公平性(标准差) | 1.87 | 115.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% |
平均 IOPS | 1414.82 | 2501.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/s | 4976.82 Mbit/s | 约快 3.4 倍 |
上传速度 | 976.40 Mbit/s | 1939.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 / 15185 | 6 / 14 / 36 | 处理时间减少 |
等待时间 | 290 / 11706 / 15100 | 5 / 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中国区独家战略合作伙伴卓普云。