轉碼服務serverless探索

来源:https://www.cnblogs.com/liuxiaomian/archive/2023/03/01/17170014.html
-Advertisement-
Play Games

背景 公司目前主要聚焦於視頻這個領域,利用視頻為媒體、文旅、會議等行業進行賦能。 既然聚焦於視頻領域,那麼視頻轉碼則是繞不開的話題。 為了降低成本,以及保證產品的核心能力,公司自建了一套轉碼系統。 轉碼服務除了儘可能多的相容業界的視頻格式外,轉碼的速度是另一個非常重要的指標。 因為視頻轉碼對用戶來說 ...


背景

公司目前主要聚焦於視頻這個領域,利用視頻為媒體、文旅、會議等行業進行賦能。
既然聚焦於視頻領域,那麼視頻轉碼則是繞不開的話題。
為了降低成本,以及保證產品的核心能力,公司自建了一套轉碼系統。

轉碼服務除了儘可能多的相容業界的視頻格式外,轉碼的速度是另一個非常重要的指標。
因為視頻轉碼對用戶來說,感知最強的就是視頻轉碼速度。
假如用戶上傳了一個1分鐘的視頻,轉碼花了10分鐘甚至更久的話,用戶肯定就不願意使用我們的產品了。
對於用戶來說等待的時間越短越好,對於轉碼服務來說轉碼速度越快越好。

我們先從轉碼流程說起,在聊一聊目前系統存在的問題,以及為serverless改造所做的努力。

轉碼流程

眾所周知,轉碼是CPU密集型任務,一個長視頻在單機上可能要轉很久。但如果能用儘可能利用多的CPU去進行轉碼,那麼轉碼速度將會大大加快。而現在豐富的雲產品能夠在短時間內提供大量的計算能力,以阿裡雲為例,阿裡雲提供了函數計算、Serverless應用引擎等serverless產品能夠支撐起我們所需要的計算能力。
於是為了提高轉碼倍速,我們將

  1. 視頻進行切片,每一個切片都是一個轉碼任務。一個長視頻經過切片以後就會被切分成大量轉碼子任務。
  2. 將轉碼子任務調度到不同的機器上執行,充分利用不同機器上的CPU資源,提高轉碼速度
  3. 當所有的轉碼子任務都執行完畢以後,再進行彙總合併輸出轉碼後的視頻

流程如下:


         切片                  轉碼                  合併
輸入視頻 ------> (n個)轉碼任務 ------> (n個)轉碼結果 -----> 輸出視頻


改造前的系統架構

再來看看我們的系統架構。

之前轉碼服務是一個應用,同時肩負著調度和轉碼的職責,其中:

  1. 調度主要是跟MySQL、Redis打交道:用Redis維護任務隊列;MySQL則用來保存任務的執行狀態
  2. 轉碼則是執行任務:讀取文件系統中的源視頻,轉碼後再將視頻寫入到文件系統中

改造前的系統架構

大規模集群面臨的問題

上面有提到為了提高轉碼速度,我們會有多個轉碼服務實例進行轉碼,但是上面的系統架構會限制轉碼集群的實例數。

上面的系統架構中,轉碼服務既承擔了轉碼職責,也承擔了調度的職責(獲取任務、以及更新任務狀態)。不符合存儲(Redis、MySQL等數據層)與計算分離,無法大規模快速獲取計算能力。

因為承擔了調度的職責就不可避免的要與Redis、MySQL打交道,啟動服務時就要與Redis、MySQL建立連接,且不說建立大量的連接Redis、MySQL能不能承受的住,光是建立連接所需要花費的時間就是一筆很大的浪費。

serverless改造

為了提供大規模的轉碼計算能力,我們決定對轉碼服務進行改造。

方案

改造的方案主要思路是將存儲與計算分離,說大白話就是講調度職責與轉碼職責進行分離,這樣就可以只對轉碼計算能力進行擴容。
這裡主要聊轉碼(計算)節點的改造點,主要有2個:

  1. 移除數據層的訪問操作(剝離調度服務能力),避免建立連接
  2. 優化啟動速度,儘可能縮短應用啟動時間

移除數據層的訪問操作

將轉碼(計算)節點的數據層訪問操作全部都移除後,如何與調度服務進行通信呢?比如獲取任務、提交轉碼結果需要通過調度服務訪問Redis和MySQL。
一般有2種選擇:dubbo或者http。我最終選擇使用http進行通信。

這裡先說一下為什麼沒有選擇dubbo:還是上面所提到的、需要建立連接的問題,如果使用dubbo,那麼就需要與zk等註冊中心建立連接。而且如果發生大規模上下線(如發佈)操作,那麼勢必給註冊中心帶來巨大的推送壓力。

選擇http進行通信,擺在眼前的第一個問題是:轉碼(計算)節點怎麼知道調度節點的訪問地址?
因為我們的服務部署在k8s集群中,藉助k8s內部功能變數名稱天然的解決了獲取調度節點訪問地址的問題。我們只需要訪問調度節點在k8s中內部功能變數名稱地址就可以訪問到調度節點介面,而無需關係發佈所帶來的ip變化等情況。

使用http進行通信,調度節點除了需要做好優雅下線,避免http請求被意外終止;還需要做好數據冪等的措施。

提高應用啟動速度

作為雲原生應用,不會常備很多計算資源,但是需要的時候希望馬上就有,這就要求應用啟動越快越好。
影響應用啟動速度的主要有下麵2點:

  1. 拉鏡像
  2. 應用啟動

拉鏡像的速度

我們選擇了阿裡雲 sae job作為serverless載體,sae job剛好有一個鏡像加速的能力:拉鏡像到啟動鏡像可以做到15s,還可以接受,這塊就不展開了。

應用啟動

這塊主要是儘可能的將非必須的代碼移除,減少springboot掃描的bean,目前啟動時間在6s左右。
另外也在嘗試使用graalvm編譯成本地可執行文件,測試的啟動時間約1s左右。因為涉及到SpringBoot大版本變更以及JDK版本變更,這個方案還在測試,沒有發佈到生產環境。

改造後的系統架構

改造後的系統架構

效果

serverless改造後的轉碼服務,帶來的效果有2個:

  1. 帶來更高的轉碼速度:在面對大量轉碼也不用擔心轉碼慢的問題,一個字-擴!
  2. 成本的顯著降低:得益於按量付費的模式,只需要為實際使用的計算資源付費,無需預留計算資源。
歡迎轉載! 除非經過作者本人同意,轉載請註明出處並附上原文鏈接!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、https://element-plus.gitee.io/zh-CN/ 官網 二、後臺佈局Layui 代碼示例如下 <template> <div class="app_container"> <div class="common-layout"> <el-container> <el-asi ...
  • 在vue中父子組件傳值是必不可少的,大家必須要學會! 首先父組件向子組件傳值: 父組件:比如我們傳teacher為index,如果我們傳值變數可以使用 : 綁定我們在data中定義的變數。 子組件:為了規範一般使用對象的形式,type表示值的類型,default表示如果不傳值就預設是null. 在子 ...
  • 環境 vue2 導入 安裝npm包 echarts echarts-gl import * as echarts from "echarts" import "echarts-gl" html <div id="map-container"></div> js import GeoZJ from ' ...
  • RxEditor是一款開源企業級可視化低代碼前端,目標是可以編輯所有 HTML 基礎的組件。比如支持 React、VUE、小程式等,目前僅實現了 React 版。 RxEditor運行快照: 項目地址:https://github.com/rxdrag/rxeditor 演示地址( Vercel 部 ...
  • 如何畫好一張架構圖,要做好這件事情首先要回答的就是什麼是架構圖。我們日常工作中經常能看到各種各樣的架構圖,而且經常會發現大家對架構圖的理解各有側重。深入追究到這個問題,可能一下子還很難有一個具象的定義,如果我們把這個問題進行拆分,理解起來就會容易一點。 ...
  • 1. JPA 1.1. 性能直接受底層JDBC驅動性能的影響 1.2. 性能提升是通過改變實體類的位元組碼來實現的 1.2.1. 在類載入到JAR文件或者由JVM運行之前增強位元組碼的方法 1.2.1.1. 在編譯過程中完成的 1.2.1.2. 在實體類編譯完成後,它們會被傳遞給一個特定實現的後置處理器 ...
  • 一、前戲 在之前我們已經學會使用 pytest-html 插件生成 html 格式的測試報告: 1 # 第一步,安裝插件 2 pip install pytest-html 3 ​ 4 # 第二步,執行用例時使用 --html 參數 5 ## main 函數中執行 6 if __name__ == ...
  • MyBatis的關聯映射02 3.一對多 3.1基本介紹 mybatis – MyBatis 3 | XML 映射器 多對一關係也是一個基本的映射關係,多對一,也可以理解為一對多。例如: User--Pet:一個用戶可以有多只寵物 Dep--Emp:一個部門有多個員工 雙向的多對一關係:通過User ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...