1. 程式人生 > >如何打造一個語音聊天室

如何打造一個語音聊天室

語音聊天室這個名詞可能有點陌生,實際上相關的產品還是很多的,例如遊戲裡的開黑語音、線上課堂等。語音聊天室可以認為視訊直播的前身,很多音視訊平臺的架構是從語音聊天室演進為視訊直播室的。本文主要介紹語音聊天室的架構設計,後面的文章會逐步介紹從語音到視訊的演進歷程。

語音聊天室怎麼實現呢?網際網路產品設計萬變不離其宗,一套QQ的架構設計可以走遍天下。QQ群聊是怎麼實現的,那麼把群聊中的文字訊息換成語音資料就是語音聊天室了。

 

如圖所示,ABC進入房間101,伺服器會維護一個房間資訊表記錄每個房間的使用者資訊。當某個使用者說話的時候,客戶端將採集到的語音資料發給伺服器,伺服器就把語音資料發給101的每一個使用者。客戶端收到語音資料就可以播放出來。

但是實際生產中肯定不會使用這麼簡單的架構,為什麼呢?首先一個伺服器實現所有功能是不可行的,因為一方面伺服器的效能不可能滿足,另一方面大型軟體的複雜度和維護成本是非常高的,因此軟體工程一直都強調高內聚低耦合,把功能拆解可以使系統更容易維護。

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

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

接著是平行擴充套件。為什麼需要平行擴充套件?一方面單機效能有限,即使增加機器配置,效能也是有上限的,因此分散式才是根本解決的方案;另一方面平行擴充套件可以實現服務高可用,即使部分機器宕機,服務仍然可用。

簡單地說,平行擴充套件就是增加備機。而備機有冷熱之分:熱備是指多臺機器同時對外提供服務,當其中一臺機器故障,其他機器可以正常提供服務;冷備指同時只有一臺機器(主機)對外提供服務,其他機器(備機)不提供服務,當主機發生故障時,備機需要切換成主機提供服務。

還有一個概念,有狀態服務和無狀態服務。網上有很多解釋,大多都比較專業,不再贅述。我只說一下自己的理解,有狀態服務是指本地儲存需要持久化資料的服務,例如資料庫服務;無狀態服務是指本地不儲存持久化資料的服務,例如WEB伺服器。

有狀態和無狀態一般是跟冷備和熱備對應起來的:有狀態服務使用冷備,無狀態服務使用熱備。這是由它們的特點決定的,有狀態服務因為儲存資料,一般不支援多點寫入,因為資料在伺服器之間同步是非常複雜的(CAP理論和Paxos演算法瞭解一下),所以冷備是最簡單的容災策略;無狀態服務不儲存資料,使用者的請求發到哪一臺機器都返回一樣的結果,因此所有機器可以同時提供服務。

經過垂直拆分和平行擴充套件,語音聊天室的架構可以分解成下面的形式:

 

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

目錄伺服器是使用者訪問系統的地圖,使用者通過它可以找到要連線的伺服器的IP和埠。語音伺服器是處理語音資料上傳和轉發的服務。房間伺服器維護房間-語音伺服器-使用者的對映關係。對映關係類似下圖,一個房間的使用者可能分佈在多個語音伺服器,另外還有沒有畫出來的關係:一個語音伺服器上可以有多個房間的使用者。

 

業務流程如圖所示:使用者A點選進入101聊天室,首先請求目錄伺服器獲得101房間所在語音伺服器的IP列表;然後,A連線某臺語音伺服器請求進入101房間。如果進房成功,房間伺服器會把資訊寫入DB,使用者A可以在房間開始語音聊天。

 

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

總結一下,本篇主要介紹了一個簡單的語音聊天室的設計方案和一些基礎概念。方案設計可以沿著先簡單再完備的思路進行推演。例如最開始的一臺伺服器扛不住,就要平行擴充套件,一個房間的使用者分佈到多臺伺服器,然後就要有一個更高層次的伺服器(房間伺服器)提供全域性視野,如此類推。

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