隨著移動互聯(lián)網(wǎng)的發(fā)展,視頻類網(wǎng)站的需求越來越大,伴隨著香港數(shù)據(jù)中心的硬件設施和帶寬的不斷擴展、低延遲大帶寬的香港服務器也同樣能夠提供給消費者,除了硬件條件成熟,軟件方面也需要一個可靠的架構(gòu),本文就著重介紹如何搭建一個成熟的視頻架構(gòu)。
關于高并發(fā)
在這里主要介紹了如何設計互聯(lián)網(wǎng)分布架構(gòu)以提高系統(tǒng)并發(fā)能力。
有兩種常用的方法:垂直擴展(Scale Up)與水平擴展(Scale Out)。
一、采用垂直擴展來提升單機處理能力。
寫代碼時,我們能做的優(yōu)化可分為三類:架構(gòu)優(yōu)化、算法優(yōu)化和語言優(yōu)化。
1架構(gòu)優(yōu)化:如用異步IO來增加單服務器吞吐量,多線程的時候通過減少鎖的使用來提高服務器性能等。
2算法優(yōu)化:其在服務器中比較少見,因為服務器邏輯代碼里通常沒有繁瑣的算法,但是如果有能優(yōu)化的空間,還是要進行優(yōu)化。
3語言優(yōu)化:比較常見的優(yōu)化方式,比如const加引用傳參,比如復雜對象遍歷時前置加加與后置加加等,具體看參閱《effective c++》和《more effective c++》。當然,如果有數(shù)據(jù)庫,那么SQL語句的優(yōu)化也算。
現(xiàn)在代碼已經(jīng)寫好了,也跑起來了,發(fā)現(xiàn)性能還是不滿意,怎么辦呢?
看瓶頸! 就好比醫(yī)生治病,要先找病因。Linux下的gperftools、Windows下的vs、Mac下的xcode都能進行集成性能分析。
這些性能分析工具能幫助你大致定位到哪一行代碼占用了CPU時間。找到病因后,就是對癥下藥。
當然了,對于這種主要由于占用CPU、內(nèi)存不夠和網(wǎng)卡而導致的服務器性能不高,提升硬件還是非常有效的。
但是單機性能總是有極限的,會受到時代技術的限制。所以互聯(lián)網(wǎng)分布式架構(gòu)設計高并發(fā)的解決方案還是要依靠水平擴展。
二、采用水平擴展來增加服務器數(shù)量,以擴充系統(tǒng)性能
這點與互聯(lián)網(wǎng)的分層架構(gòu)有關,在互聯(lián)網(wǎng)的分層機構(gòu)中,各層次水平擴展的實踐是不同的,比如:反向代理層通過“DNS輪詢”的方式;站點層通過nginx來進行,而服務器則主要依靠服務連接池。在各層實施水平擴展后,通過增加服務器數(shù)量的方式,可以做到理論上系統(tǒng)性能的無限提升。
簡單說就是,活太多時一個人干不完,多個人一起干。然后牽扯到多個人,必然會涉及到調(diào)度分配管理的問題。
相關的名詞有:CDN,負載均衡,Hadoop,云計算等。
解決完高并發(fā)的問題,現(xiàn)在來說一下低延時。
關于低延時
低延時是所有視頻通信研發(fā)人員都會關注的一個點,更低的延時必將提升用戶使用體驗??墒侨绾巫龅降脱訒r呢?
圖鴨的產(chǎn)品是采用了如下的方法:服務器采用udp協(xié)議傳輸音視頻數(shù)據(jù)、tcp協(xié)議傳輸控制信令,以此來保證控制信令可靠且音視頻數(shù)據(jù)傳輸延時低。
眾所周知,UDP協(xié)議與TCP協(xié)議相比:采用UDP協(xié)議傳輸數(shù)據(jù)可能導致數(shù)據(jù)丟失,但客戶端接收信息延時低;而TCP協(xié)議有丟包重傳策略,但速度不快。我們的產(chǎn)品在使用時,將這二者結(jié)合,以確保UDP在接收到的包不完全時也能正常解包。
在解決了高并發(fā)和低延時的問題后,我們要來考慮一下流量成本的問題。降低流量成本是每個視頻通信使用者的需求,也是每個研究視頻通信的程序員們要解決的問題。在這里我簡單介紹下NAT穿透。
關于NAT穿透
視頻網(wǎng)站的一大技術難點就是服務器的網(wǎng)絡帶寬占比過高。使用NAT穿透方案,客戶端在通信時可以采用P2P的方式。P2P方案能夠使A客戶端的視頻數(shù)據(jù)不經(jīng)過服務器到達B客戶端,在降低服務器帶寬消耗時保證傳輸?shù)脱訒r。 那么如何實現(xiàn)NAT穿透呢?我們首先需要知道NAT的特性:NAT會拒絕陌生來源的數(shù)據(jù)包。簡單來說,如果NAT后不存在向某個NAT之外的主機發(fā)送過數(shù)據(jù)的主機,那么外部主機就不能主動發(fā)送數(shù)據(jù)包到NAT之后的主機。
一種可行的方案:利用一個信令服務器,先獲取客戶端暴露在NAT上的IP:PORT信息,再協(xié)調(diào)兩個客戶端,朝其NAT上暴露的IP:PORT發(fā)送信息。由于處于NAT(這里設為NATA)后的機器向另一個NAT(這里設為NATB)后的設備發(fā)送信息了,NATA就會允許NATB后的主機的數(shù)據(jù)。反之亦然。
但是還有個要點需要注意:先發(fā)送數(shù)據(jù)的客戶端的第一個數(shù)據(jù)包會被NAT丟棄,因為對方NAT并不知道該如何分配這個未知來源的數(shù)據(jù)包。NAT穿透完整的解決方案可以參考RFC5389協(xié)議,根據(jù)協(xié)議實現(xiàn)。
關于擴展性強,負載均衡
在處理完上述問題后,可以考慮怎樣讓整個服務器負載均衡。
在這里圖鴨君主要介紹主從節(jié)點集群設計:客戶端從負載均衡服務器獲取轉(zhuǎn)發(fā)服務器地址,負載均衡服務器根據(jù)客戶端的身份以及從節(jié)點服務器的帶寬流量、CPU情況等,智能分配給客戶端合適的服務器地址,在保證資源有效利用的同時又避免服務器過載。
這樣的設計在提高了可擴展性的同時能夠在從節(jié)點無縫加入主節(jié)點。
總結(jié)
事實上,前文所述的都是搭建高性能服務器的基礎,好的架構(gòu)是基礎,好的優(yōu)化才能蓋高樓。對于如何更好地優(yōu)化服務器?一種合理的做法是:對服務器的運行狀況進行分析,對執(zhí)行頻繁、資源消耗過高的部分進行特別的優(yōu)化。
也就是說對于具體的服務器具體分析,只有如此才能讓服務器做到最優(yōu)。
USA-IDC提供優(yōu)質(zhì)香港視頻服務器首月半價活動數(shù)量有限,售完即止
三大配置隨心選
為確保順利租用? <