如何搭建視頻通訊服務器架構

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

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

 

關於高併發c++

 

在這裏主要介紹瞭如何設計互聯網分佈架構以提升系統併發能力。程序員

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

1、採用垂直擴展來提高單機處理能力。數據庫

 寫代碼時,咱們能作的優化可分爲三類:架構優化、算法優化和語言優化。後端

1架構優化:如用異步IO來增長單服務器吞吐量,多線程的時候經過減小鎖的使用來提升服務器性能等。xcode

2算法優化:其在服務器中比較少見,由於服務器邏輯代碼裏一般沒有繁瑣的算法,可是若是有能優化的空間,仍是要進行優化。服務器

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

 

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

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

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

固然了,對於這種主要因爲佔用CPU、內存不夠和網卡而致使的服務器性能不高,提高硬件仍是很是有效的。

 

可是單機性能老是有極限的,會受到時代技術的限制。因此互聯網分佈式架構設計高併發的解決方案仍是要依靠水平擴展。

 

2、採用水平擴展來增長服務器數量,以擴充系統性能

 

這點與互聯網的分層架構有關,在互聯網的分層機構中,各層次水平擴展的實踐是不一樣的,好比:反向代理層經過「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狀況等,智能分配給客戶端合適的服務器地址,在保證資源有效利用的同時又避免服務器過載。

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

 

總結

 

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

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

相關文章
相關標籤/搜索