轉碼服務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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...