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.pswp.cn/web/75401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75401.shtml
英文地址,請注明出處:http://en.pswp.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…