上篇我們介紹了如何從零開(kāi)始搭建一套語(yǔ)音聊天室后臺(tái),設(shè)計(jì)方案比較基礎(chǔ),本篇我們將介紹語(yǔ)音聊天室的升級(jí)版本——在海量用戶同時(shí)在線的情況下,語(yǔ)音服務(wù)器的架構(gòu)將如何升級(jí)改造。
互聯(lián)網(wǎng)產(chǎn)品后臺(tái)開(kāi)發(fā)信奉一句話:先扛住再優(yōu)化。工程師當(dāng)然是希望把系統(tǒng)設(shè)計(jì)得盡善盡美,但是業(yè)務(wù)發(fā)展往往是不允許的,因此后臺(tái)工程師的工作就是在技術(shù)和業(yè)務(wù)之間尋找平衡點(diǎn)。大部分的系統(tǒng)都是逐步迭代演進(jìn)而來(lái)的,沒(méi)有一蹴而就的完美系統(tǒng)。
前文中,我們介紹了語(yǔ)音服務(wù)器分SET部署的概念。其實(shí)一直在回避一個(gè)問(wèn)題,分SET的缺點(diǎn)是什么?
分SET限制了房間的容量。因?yàn)椴环諷ET還好,分SET了以后一個(gè)房間撐死只能達(dá)到20萬(wàn)的用戶,這樣看起來(lái)分SET是一個(gè)不合理的設(shè)計(jì)。真是這樣嗎?
當(dāng)然不是。所謂萬(wàn)丈高樓平地起,基礎(chǔ)架構(gòu)是非常重要的。雖然分SET為我們帶來(lái)了一個(gè)限制,但是它的好處是更明顯的。首先,我們的業(yè)務(wù)場(chǎng)景就決定了百萬(wàn)級(jí)別的房間是不常見(jiàn),我們負(fù)責(zé)的超過(guò)20萬(wàn)用戶在線的直播也就只有大型的游戲賽事直播,而且這種直播一年也就那么幾回。其次,前面已經(jīng)說(shuō)過(guò),如果不分SET,應(yīng)對(duì)百萬(wàn)用戶房間,需要50臺(tái)機(jī)器,每次發(fā)布出錯(cuò)的影響面遠(yuǎn)大于分SET部署。
因此,我們要討論的不是分不分SET的問(wèn)題,而是怎么在分SET的情況下,實(shí)現(xiàn)百萬(wàn)房間的問(wèn)題。
最容易想到的方案是把100萬(wàn)用戶分到5個(gè)SET里。那多個(gè)SET之間怎樣通信呢?方法說(shuō)白了就是為不同SET中的服務(wù)器提供一個(gè)全局視圖,用于轉(zhuǎn)發(fā)路由。方法有很多種,這里介紹2種思路。
第一種是在房間服務(wù)器的上面再增加一個(gè)組服務(wù)器(group server),為系統(tǒng)提供全局視野。組服務(wù)器在每個(gè)SET的語(yǔ)音服務(wù)器中選取一臺(tái)做為
橋頭堡機(jī)器(broker)
,跨SET轉(zhuǎn)發(fā)和接收都通過(guò)broker完成。Broker收到SET內(nèi)轉(zhuǎn)發(fā)時(shí),會(huì)將數(shù)據(jù)轉(zhuǎn)發(fā)給其他SET的broker;而當(dāng)收到跨SET轉(zhuǎn)發(fā)時(shí),會(huì)將數(shù)據(jù)轉(zhuǎn)發(fā)給SET內(nèi)的其他機(jī)器。
?
?
這種方案的缺點(diǎn)是broker會(huì)成為瓶頸,當(dāng)broker宕機(jī)時(shí),最嚴(yán)重的情況是造成其他SET無(wú)法提供服務(wù)。容災(zāi)策略一種是減少broker到組服務(wù)器的心跳間隔,使組服務(wù)器可以迅速發(fā)現(xiàn)異常并重新挑選broker;另一種方法是采用雙broker,不過(guò)會(huì)增加數(shù)據(jù)去重的復(fù)雜度。
第二種是在系統(tǒng)之外增加一個(gè)轉(zhuǎn)發(fā)服務(wù)器
,專門(mén)負(fù)責(zé)跨SET轉(zhuǎn)發(fā),當(dāng)然它本身?yè)碛腥忠曇?。這種方案其實(shí)是把上面說(shuō)的組服務(wù)和雙broker結(jié)合在一起,把轉(zhuǎn)發(fā)功能外化。對(duì)于跨SET房間,主播所在的語(yǔ)音服務(wù)器做SET內(nèi)轉(zhuǎn)發(fā)的同時(shí)將數(shù)據(jù)發(fā)給轉(zhuǎn)發(fā)服務(wù)器,轉(zhuǎn)發(fā)服務(wù)器根據(jù)房間信息將數(shù)據(jù)轉(zhuǎn)發(fā)給其他SET的任意1臺(tái)機(jī)器。
?
這樣優(yōu)點(diǎn)非常明顯,轉(zhuǎn)發(fā)服務(wù)器跟原有系統(tǒng)完全解耦,原系統(tǒng)改造也很小,可以實(shí)現(xiàn)高可用。唯一缺點(diǎn)是轉(zhuǎn)發(fā)服務(wù)器起碼有兩臺(tái)機(jī)器,也會(huì)增加接收方數(shù)據(jù)去重的復(fù)雜度。
現(xiàn)在我們梳理一下,要實(shí)現(xiàn)一個(gè)支持百萬(wàn)級(jí)的語(yǔ)音聊天房間,整體的架構(gòu)如下所示:
?
* 用戶創(chuàng)建房間。通過(guò)目錄服務(wù)器創(chuàng)建,實(shí)際上是在數(shù)據(jù)庫(kù)中增加一條set_id和room_id的映射記錄。
*
用戶請(qǐng)求進(jìn)入房間。通過(guò)目錄服務(wù)器查詢應(yīng)該連到哪臺(tái)語(yǔ)音服務(wù)器,具體的邏輯由負(fù)載均衡服務(wù)器實(shí)現(xiàn)。簡(jiǎn)單描述為:查詢到room_id所在的set的所有語(yǔ)音服務(wù)器,根據(jù)負(fù)載情況和就近接入原則,選擇幾臺(tái)語(yǔ)音服務(wù)器的ip和端口返回。
* 用戶進(jìn)入房間??蛻舳诉B接語(yǔ)音服務(wù)器,語(yǔ)音服務(wù)器將進(jìn)房請(qǐng)求透?jìng)鹘o房間服務(wù)器,房間服務(wù)器記錄房間架構(gòu)信息,并定期同步給set內(nèi)所有的語(yǔ)音服務(wù)器。
* 對(duì)于小房間,通過(guò)set內(nèi)轉(zhuǎn)發(fā)語(yǔ)音實(shí)現(xiàn)。
對(duì)于跨set的大房間,由多個(gè)房間服務(wù)器協(xié)同工作實(shí)現(xiàn)。房間服務(wù)器之間不需要互相通信,它們只要在set內(nèi)按規(guī)則挑選一臺(tái)語(yǔ)音服務(wù)器作為broker。Broker收到語(yǔ)音數(shù)據(jù)時(shí),除了常規(guī)的set內(nèi)轉(zhuǎn)發(fā)外,還將數(shù)據(jù)發(fā)給轉(zhuǎn)發(fā)服務(wù)器。轉(zhuǎn)發(fā)服務(wù)器知道房間所在的set列表和每個(gè)set的broker,從而實(shí)現(xiàn)跨set轉(zhuǎn)發(fā)。
??? 本篇主要介紹了基于分SET架構(gòu)如何實(shí)現(xiàn)百萬(wàn)級(jí)房間的設(shè)計(jì)方法,并梳理了語(yǔ)音聊天室的整體架構(gòu)。希望對(duì)大家有所幫助。
熱門(mén)工具 換一換
