語音聊天室這個名詞可能有點陌生,實際上相關的産品還是很多的,例如遊戲裡的開黑語音、在線課堂等。語音聊天室可以認為視頻直播的前身,很多音視頻平台的架構是從語音聊天室演進為視頻直播室的。本文主要介紹語音聊天室的架構設計,後面的文章會逐步介紹從語音到視頻的演進曆程。
語音聊天室怎麼實現呢?互聯網産品設計萬變不離其宗,一套QQ的架構設計可以走遍天下。QQ群聊是怎麼實現的,那麼把群聊中的文字消息換成語音數據就是語音聊天室了。
如圖所示,ABC進入房間101,服務器會維護一個房間信息表記錄每個房間的用戶信息。當某個用戶說話的時候,客戶端将采集到的語音數據發給服務器,服務器就把語音數據發給101的每一個用戶。客戶端收到語音數據就可以播放出來。
但是實際生産中肯定不會使用這麼簡單的架構,為什麼呢?首先一個服務器實現所有功能是不可行的,因為一方面服務器的性能不可能滿足,另一方面大型軟件的複雜度和維護成本是非常高的,因此軟件工程一直都強調高内聚低耦合,把功能拆解可以使系統更容易維護。
拆解有兩個方向,一個是按功能拆分,即把不同功能放到不同服務器完成;另一種是平行擴展,即相同功能的服務分布到多台機器上。
首先按功能拆分。按功能拆分又稱為垂直拆分,與平行擴展是一個相對的概念。比較常見的拆分方法是分層,一般分接入層、邏輯層和數據層。接入層是整個系統對外的窗口,除了基本的數據加解密和透傳功能外,還起到保護内部服務器的作用;邏輯層包含實際的業務服務器;數據層主要是存儲數據的存儲介質和相關服務器。
接着是平行擴展。為什麼需要平行擴展?一方面單機性能有限,即使增加機器配置,性能也是有上限的,因此分布式才是根本解決的方案;另一方面平行擴展可以實現服務高可用,即使部分機器宕機,服務仍然可用。
簡單地說,平行擴展就是增加備機。而備機有冷熱之分:熱備是指多台機器同時對外提供服務,當其中一台機器故障,其他機器可以正常提供服務;冷備指同時隻有一台機器(主機)對外提供服務,其他機器(備機)不提供服務,當主機發生故障時,備機需要切換成主機提供服務。
還有一個概念,有狀态服務和無狀态服務。網上有很多解釋,大多都比較專業,不再贅述。我隻說一下自己的理解,有狀态服務是指本地存儲需要持久化數據的服務,例如數據庫服務;無狀态服務是指本地不存儲持久化數據的服務,例如WEB服務器。
有狀态和無狀态一般是跟冷備和熱備對應起來的:有狀态服務使用冷備,無狀态服務使用熱備。這是由它們的特點決定的,有狀态服務因為存儲數據,一般不支持多點寫入,因為數據在服務器之間同步是非常複雜的(CAP理論和Paxos算法了解一下),所以冷備是最簡單的容災策略;無狀态服務不存儲數據,用戶的請求發到哪一台機器都返回一樣的結果,因此所有機器可以同時提供服務。
經過垂直拆分和平行擴展,語音聊天室的架構可以分解成下面的形式:
圖中接入層包括目錄服務器和語音服務器,邏輯層包括房間服務器,存儲層包括數據庫。其中接入層和邏輯層服務都是無狀态服務,至少有兩台機器熱備,數據庫一般是主從冷備。
目錄服務器是用戶訪問系統的地圖,用戶通過它可以找到要連接的服務器的IP和端口。語音服務器是處理語音數據上傳和轉發的服務。房間服務器維護房間-語音服務器-用戶的映射關系。映射關系類似下圖,一個房間的用戶可能分布在多個語音服務器,另外還有沒有畫出來的關系:一個語音服務器上可以有多個房間的用戶。
業務流程如圖所示:用戶A點擊進入101聊天室,首先請求目錄服務器獲得101房間所在語音服務器的IP列表;然後,A連接某台語音服務器請求進入101房間。如果進房成功,房間服務器會把信息寫入DB,用戶A可以在房間開始語音聊天。
這已經是一個比較完備的系統了。
總結一下,本篇主要介紹了一個簡單的語音聊天室的設計方案和一些基礎概念。方案設計可以沿着先簡單再完備的思路進行推演。例如最開始的一台服務器扛不住,就要平行擴展,一個房間的用戶分布到多台服務器,然後就要有一個更高層次的服務器(房間服務器)提供全局視野,如此類推。
限于篇幅,上述系統還有很多細節沒有讨論。例如語音服務器是怎麼轉發語音數據的?目錄服務器是否有點多餘?等等。我們在接下來的文章中将一一解答,敬請期待。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!