如何搭建音視頻通信的伺服器架構

隨著移動互聯網的發展,視頻通信使用場景越來越多,如視頻聊天、視頻會議、在線直播等。但是隨之而來對前端設計的要求、對後端伺服器的要求也不斷增加。所以如何搭建一個完善的伺服器以適合視頻通信,是每個視頻通信研發人員都關注的問題。

一個完善的音視頻伺服器需要解決高並發、低延遲、NAT穿透和擴展性負載均衡等問題,我們關注這個方向已有一年多,下面是總結的部分經驗:

關於高並發

在這裡主要介紹了如何設計互聯網分布架構以提高系統並發能力。

有兩種常用的方法:垂直擴展(Scale Up)與水平擴展(Scale Out)。

一、採用垂直擴展來提升單機處理能力。

寫代碼時,我們能做的優化可分為三類:架構優化、演算法優化和語言優化。

1架構優化:如用非同步IO來增加單伺服器吞吐量,多線程的時候通過減少鎖的使用來提高伺服器性能等。

2演算法優化:其在伺服器中比較少見,因為伺服器邏輯代碼里通常沒有繁瑣的演算法,但是如果有能優化的空間,還是要進行優化。

3語言優化:比較常見的優化方式,比如const加引用傳參,比如複雜對象遍歷時前置加加與後置加加等,具體看參閱《effective c++》和《more effective c++》。當然,如果有資料庫,那麼SQL語句的優化也算。

現在代碼已經寫好了,也跑起來了,發現性能還是不滿意,怎麼辦呢?

看瓶頸! 就好比醫生治病,要先找病因。Linux下的gperftools、Windows下的vs、Mac下的xcode都能進行集成性能分析。

這些性能分析工具能幫助你大致定位到哪一行代碼佔用了CPU時間。找到病因後,就是對症下藥。

當然了,對於這種主要由於佔用CPU、內存不夠和網卡而導致的伺服器性能不高,提升硬體還是非常有效的。

但是單機性能總是有極限的,會受到時代技術的限制。所以互聯網分散式架構設計高並發的解決方案還是要依靠水平擴展。

二、採用水平擴展來增加伺服器數量,以擴充系統性能

這點與互聯網的分層架構有關,在互聯網的分層機構中,各層次水平擴展的實踐是不同的,比如:反向代理層通過「DNS輪詢」的方式;站點層通過nginx來進行,而伺服器則主要依靠服務連接池。在各層實施水平擴展後,通過增加伺服器數量的方式,可以做到理論上系統性能的無限提升。

簡單說就是,活太多時一個人干不完,多個人一起干。然後牽扯到多個人,必然會涉及到調度分配管理的問題。

相關的名詞有:CDN,負載均衡,Hadoop,雲計算等。

解決完高並發的問題,現在來說一下低延時。

關於低延時

低延時是所有視頻通信研發人員都會關注的一個點,更低的延時必將提升用戶使用體驗。可是如何做到低延時呢?

圖鴨的產品是採用了如下的方法:伺服器採用udp協議傳輸音視頻數據、tcp協議傳輸控制信令,以此來保證控制信令可靠且音視頻數據傳輸延時低。

眾所周知,UDP協議與TCP協議相比:採用UDP協議傳輸數據可能導致數據丟失,但客戶端接收信息延時低;而TCP協議有丟包重傳策略,但速度不快。我們的產品在使用時,將這二者結合,以確保UDP在接收到的包不完全時也能正常解包。

在解決了高並發和低延時的問題後,我們要來考慮一下流量成本的問題。降低流量成本是每個視頻通信使用者的需求,也是每個研究視頻通信的程序員們要解決的問題。在這裡我簡單介紹下NAT穿透。

關於NAT穿透

NAT穿透

視頻聊天的一大技術難點就是伺服器的網路帶寬佔比過高。使用NAT穿透方案,客戶端在通信時可以採用P2P的方式。P2P方案能夠使A客戶端的視頻數據不經過伺服器到達B客戶端,在降低伺服器帶寬消耗時保證傳輸低延時。

那麼如何實現NAT穿透呢?我們首先需要知道NAT的特性:NAT會拒絕陌生來源的數據包。簡單來說,如果NAT後不存在向某個NAT之外的主機發送過數據的主機,那麼外部主機就不能主動發送數據包到NAT之後的主機。

一種可行的方案:利用一個信令伺服器,先獲取客戶端暴露在NAT上的IP:PORT信息,再協調兩個客戶端,朝其NAT上暴露的IP:PORT發送信息。由於處於NAT(這裡設為NATA)後的機器向另一個NAT(這裡設為NATB)後的設備發送信息了,NATA就會允許NATB後的主機的數據。反之亦然。

但是還有個要點需要注意:先發送數據的客戶端的第一個數據包會被NAT丟棄,因為對方NAT並不知道該如何分配這個未知來源的數據包。NAT穿透完整的解決方案可以參考RFC5389協議,根據協議實現。

關於擴展性強,負載均衡

一種負載均衡方式

在處理完上述問題後,可以考慮怎樣讓整個伺服器負載均衡。

在這裡圖鴨君主要介紹主從節點集群設計:客戶端從負載均衡伺服器獲取轉發伺服器地址,負載均衡伺服器根據客戶端的身份以及從節點伺服器的帶寬流量、CPU情況等,智能分配給客戶端合適的伺服器地址,在保證資源有效利用的同時又避免伺服器過載。

這樣的設計在提高了可擴展性的同時能夠在從節點無縫加入主節點。

總結

事實上,前文所述的都是搭建高性能伺服器的基礎,好的架構是基礎,好的優化才能蓋高樓。對於如何更好地優化伺服器?一種合理的做法是:對伺服器的運行狀況進行分析,對執行頻繁、資源消耗過高的部分進行特別的優化。

也就是說對於具體的伺服器具體分析,只有如此才能讓伺服器做到最優。

推薦閱讀:

TAG:音視頻 | 視頻通話 |