流媒體平臺建設

    流媒體系統主要向外提供的是離線轉碼,切片和縮略圖服務,這些服務的特色是極度耗費資源的,因此平臺的考量並非在併發性,而是在資源的分配上,和流媒體自己的特性。redis

該文章後續仍在不斷的更新修改中, 請移步到原文地址http://dmwan.ccdocker

    系統架構:數據庫

 

如下是須要考慮的問題:緩存

主控部分架構

    1,入口負載均衡,支持多主,高可用,保證某節點掛了的狀況下,不會出問題。併發

    2, 失敗任務定時回掃,須要分佈式選主。負載均衡

    這裏常見的方案,redis /zk/etcd?幾種方案,基本都差很少,這裏選的是redis,直接用redis最主要的緣由,是便宜,機器能夠複用,並且redis 很穩定,基本沒遇到過奔潰的狀況。分佈式

    3,是否須要分庫分表?優化

    這裏數據量,天天有幾萬個請求,須要頻繁對任務表insert and update 操做,是否須要分庫分表?其實不須要,只須要按期縮表就ok,這種數據特色是通常會回掃近幾個月的數據,隨機性不強,這種數據,單表上億都不會有問題。code

    4,控制狀態一致性,最終一致性

    這種消息投遞系統,這裏如何保證狀態一致性,咱們採起的是保證消息最終一致性的方式: 解決方式:發送端保證(update + 必定通知到!) ,消費端保證 (必定消費,不重複消費!)
    4.1, 發送端,兩張表,或者添加個字段,消息字段,標識消息狀態碼!保證狀態!
    4.2, 發送端保證重發,不斷scan,
    能保證任務 update db + notify 必定成功
    消費端:去重 ,保證只執行一次便可 ,已經執行過,就只notify!(這裏)
最糟糕的狀況,不斷 scan,始終這條消息不執行成功。而後,人工干預

    5,數據庫與多級緩存的一致性

    什麼狀況會出現數據庫和多級緩存不一致的問題?就是當失敗任務回掃的時候,任務被推到redis 中兩份,前一份是由於還沒來的及執行。在單機,咱們加了list+set 作redis去重,在客戶端,咱們作了冪等保證。

    6,客戶鑑權,access/secret key 管理

    不一樣客戶不一樣的access/secret key 鑑權操做,這是很常規作法。

    7,模板管理

    流媒體任務參數比較複雜,咱們採用和模板的方式控制,每次傳任務,只需事先創建模板,傳遞模板id 便可。

    8,優先級隊列

    不一樣級別客戶是須要作優先級均衡的,這個在從buffer 取到任務隊列中,這步中操做,咱們會爲每一個客戶id設置動態優先級。

    9,限頻

    咱們有些客戶會從源站拉取視頻文件,這裏須要對整個任務分佈式限頻,這裏在buffer 向任務隊列中吐數據的時候能夠控制。

    10,監控/報警

    失敗數據計數報警,至關因而業務層面的。

 

agent 部分:

   1, 交互是推拉?

    這裏系統瓶頸是再agent ,並非在master,拉任務比較合適

    2,如何控制資源

    流媒體任務,比較核心的資源是cpu,這裏須要作的是控制cpu 佔比,當cpu 佔比高的時候,再也不取任務。比較合適的方式是令牌桶的方式搶cpu,將cpu數量當成臨界資源,用完即還。控制好一場處理便可。

    3,如何查看實時任務狀態

    ffmpeg 輸出流的實時解析回傳

    4,提升轉碼能力,gpu / 邊緣節點?

    這裏能夠支持gpu 或者邊緣節點閒時轉碼。前者成本高,後者實現還算簡單,控制cpu 核心的競爭便可。

    5,部署問題

    docker 安裝ffmpeg,一鍵部署

    6,控制倍數

    有些客戶要求一批資源要儘量快的轉碼,這裏能夠在令牌桶作文章,按階梯取任務便可。

 

    其餘優化,其實仍是有不少能夠作的,主要集中在資源的利用上,怎麼儘量快的實現單資源的優先轉碼,可否一次decodec 後,屢次encodec 等等。

相關文章
相關標籤/搜索