如何打造一個語音聊天室

語音聊天室這個名詞可能有點陌生,實際上相關的產品仍是不少的,例如遊戲裏的開黑語音、在線課堂等。語音聊天室能夠認爲視頻直播的前身,不少音視頻平臺的架構是從語音聊天室演進爲視頻直播室的。本文主要介紹語音聊天室的架構設計,後面的文章會逐步介紹從語音到視頻的演進歷程。算法

語音聊天室怎麼實現呢?互聯網產品設計萬變不離其宗,一套QQ的架構設計能夠走遍天下。QQ羣聊是怎麼實現的,那麼把羣聊中的文字消息換成語音數據就是語音聊天室了。數據庫

 

如圖所示,ABC進入房間101,服務器會維護一個房間信息表記錄每一個房間的用戶信息。當某個用戶說話的時候,客戶端將採集到的語音數據發給服務器,服務器就把語音數據發給101的每個用戶。客戶端收到語音數據就能夠播放出來。服務器

可是實際生產中確定不會使用這麼簡單的架構,爲何呢?首先一個服務器實現全部功能是不可行的,由於一方面服務器的性能不可能知足,另外一方面大型軟件的複雜度和維護成本是很是高的,所以軟件工程一直都強調高內聚低耦合,把功能拆解可使系統更容易維護。架構

拆解有兩個方向,一個是按功能拆分,即把不一樣功能放到不一樣服務器完成;另外一種是平行擴展,即相同功能的服務分佈到多臺機器上。分佈式

首先按功能拆分。按功能拆分又稱爲垂直拆分,與平行擴展是一個相對的概念。比較常見的拆分方法是分層,通常分接入層、邏輯層和數據層。接入層是整個系統對外的窗口,除了基本的數據加解密和透傳功能外,還起到保護內部服務器的做用;邏輯層包含實際的業務服務器;數據層主要是存儲數據的存儲介質和相關服務器。性能

接着是平行擴展。爲何須要平行擴展?一方面單機性能有限,即便增長機器配置,性能也是有上限的,所以分佈式纔是根本解決的方案;另外一方面平行擴展能夠實現服務高可用,即便部分機器宕機,服務仍然可用。架構設計

簡單地說,平行擴展就是增長備機。而備機有冷熱之分:熱備是指多臺機器同時對外提供服務,當其中一臺機器故障,其餘機器能夠正常提供服務;冷備指同時只有一臺機器(主機)對外提供服務,其餘機器(備機)不提供服務,當主機發生故障時,備機須要切換成主機提供服務。設計

還有一個概念,有狀態服務和無狀態服務。網上有不少解釋,大多都比較專業,再也不贅述。我只說一下本身的理解,有狀態服務是指本地存儲須要持久化數據的服務,例如數據庫服務;無狀態服務是指本地不存儲持久化數據的服務,例如WEB服務器。視頻

有狀態和無狀態通常是跟冷備和熱備對應起來的:有狀態服務使用冷備,無狀態服務使用熱備。這是由它們的特色決定的,有狀態服務由於存儲數據,通常不支持多點寫入,由於數據在服務器之間同步是很是複雜的(CAP理論和Paxos算法瞭解一下),因此冷備是最簡單的容災策略;無狀態服務不存儲數據,用戶的請求發到哪一臺機器都返回同樣的結果,所以全部機器能夠同時提供服務。blog

通過垂直拆分和平行擴展,語音聊天室的架構能夠分解成下面的形式:

 

圖中接入層包括目錄服務器和語音服務器,邏輯層包括房間服務器,存儲層包括數據庫。其中接入層和邏輯層服務都是無狀態服務,至少有兩臺機器熱備,數據庫通常是主從冷備。

目錄服務器是用戶訪問系統的地圖,用戶經過它能夠找到要鏈接的服務器的IP和端口。語音服務器是處理語音數據上傳和轉發的服務。房間服務器維護房間-語音服務器-用戶的映射關係。映射關係相似下圖,一個房間的用戶可能分佈在多個語音服務器,另外還有沒有畫出來的關係:一個語音服務器上能夠有多個房間的用戶。

 

業務流程如圖所示:用戶A點擊進入101聊天室,首先請求目錄服務器得到101房間所在語音服務器的IP列表;而後,A鏈接某臺語音服務器請求進入101房間。若是進房成功,房間服務器會把信息寫入DB,用戶A能夠在房間開始語音聊天。

 

這已是一個比較完備的系統了。

總結一下,本篇主要介紹了一個簡單的語音聊天室的設計方案和一些基礎概念。方案設計能夠沿着先簡單再完備的思路進行推演。例如最開始的一臺服務器扛不住,就要平行擴展,一個房間的用戶分佈到多臺服務器,而後就要有一個更高層次的服務器(房間服務器)提供全局視野,如此類推。

限於篇幅,上述系統還有不少細節沒有討論。例如語音服務器是怎麼轉發語音數據的?目錄服務器是否有點多餘?等等。咱們在接下來的文章中將一一解答,敬請期待。

相關文章
相關標籤/搜索