(搬運(yùn)工)Mangos源碼分析(1):服務(wù)器結(jié)構(gòu)探討之最簡(jiǎn)單的結(jié)構(gòu)
Posted on 2011-01-19 14:31 點(diǎn)點(diǎn)滴滴 閱讀(1561) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 10 服務(wù)器 好的結(jié)構(gòu)不是一蹴而就的,而且每個(gè)設(shè)計(jì)者心中的那把尺都不相同,所以這個(gè)優(yōu)秀結(jié)構(gòu)的定義也就沒(méi)有定論。在這里,我們不打算對(duì)現(xiàn)有游戲結(jié)構(gòu)做評(píng)價(jià),而是試著從頭開(kāi)始搭建一個(gè)我們需要的MMOG結(jié)構(gòu)。
對(duì)于一個(gè)最簡(jiǎn)單的游戲服務(wù)器來(lái)說(shuō),它只需要能夠接受來(lái)自客戶端的連接請(qǐng)求,然后處理客戶端在游戲世界中的移動(dòng)及交互,也即游戲邏輯處理即可。如果我們把這兩項(xiàng)功能集成到一個(gè)服務(wù)進(jìn)程中,則最終的結(jié)構(gòu)很簡(jiǎn)單:
client ----- server
嗯,太簡(jiǎn)單了點(diǎn),這樣也敢叫服務(wù)器結(jié)構(gòu)?好吧,現(xiàn)在我們來(lái)往里面稍稍加點(diǎn)東西,讓它看起來(lái)更像是服務(wù)器結(jié)構(gòu)一些。
一般來(lái)說(shuō),我們?cè)诮尤胗螒蚍?wù)器的時(shí)候都會(huì)要提供一個(gè)帳號(hào)和密碼,驗(yàn)證通過(guò)后才能進(jìn)入。關(guān)于為什么要提供用戶名和密碼才能進(jìn)入的問(wèn)題我們這里不打算做過(guò)多討論,云風(fēng)曾對(duì)此也提出過(guò)類似的疑問(wèn),并給出了只用一個(gè)標(biāo)識(shí)串就能進(jìn)入的設(shè)想,有興趣的可以去看看他們的討論。但不管是采用何種方式進(jìn)入,照目前看來(lái)我們的服務(wù)器起碼得提供一個(gè)帳號(hào)驗(yàn)證的功能。
我們把觀察點(diǎn)先集中在一個(gè)大區(qū)內(nèi)。在大多數(shù)情況下,一個(gè)大區(qū)內(nèi)都會(huì)有多組游戲服,也就是多個(gè)游戲世界可供選擇。簡(jiǎn)單點(diǎn)來(lái)實(shí)現(xiàn),我們完全可以拋棄這個(gè)大區(qū)的概念,認(rèn)為一個(gè)大區(qū)也就是放在同一個(gè)機(jī)房的多臺(tái)服務(wù)器組,各服務(wù)器組間沒(méi)有什么關(guān)系。這樣,我們可為每組服務(wù)器單獨(dú)配備一臺(tái)登錄服。最后的結(jié)構(gòu)圖應(yīng)該像這樣:
loginServer gameServer
| /
| /
client
該結(jié)構(gòu)下的玩家操作流程為,先選擇大區(qū),再選擇大區(qū)下的某臺(tái)服務(wù)器,即某個(gè)游戲世界,點(diǎn)擊進(jìn)入后開(kāi)始帳號(hào)驗(yàn)證過(guò)程,驗(yàn)證成功則進(jìn)入了該游戲世界。但是,如果玩家想要切換游戲世界,他只能先退出當(dāng)前游戲世界,然后進(jìn)入新的游戲世界重新進(jìn)行帳號(hào)驗(yàn)證。
早期的游戲大都采用的是這種結(jié)構(gòu),有些游戲在實(shí)現(xiàn)時(shí)采用了一些技術(shù)手段使得在切換游戲服時(shí)不需要再次驗(yàn)證帳號(hào),但整體結(jié)構(gòu)還是未做改變。
該結(jié)構(gòu)存在一個(gè)服務(wù)器資源配置的問(wèn)題。因?yàn)榈卿浄幚淼倪壿嬒鄬?duì)來(lái)說(shuō)比較簡(jiǎn)單,就是將玩家提交的帳號(hào)和密碼送到數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證,和生成會(huì)話密鑰發(fā)送給游戲服和客戶端,操作完成后連接就會(huì)立即斷開(kāi),而且玩家在以后的游戲過(guò)程中不會(huì)再與登錄服打任何交道。這樣處理短連接的過(guò)程使得系統(tǒng)在大多數(shù)情況下都是比較空閑的,但是在某些時(shí)候,由于請(qǐng)求比較密集,比如開(kāi)新服的時(shí)候,登錄服的負(fù)載又會(huì)比較大,甚至?xí)幚聿贿^(guò)來(lái)。
另外在實(shí)際的游戲運(yùn)營(yíng)中,有些游戲世界很火爆,而有些游戲世界卻非常冷清,甚至沒(méi)有多少人玩的情況也是很常見(jiàn)的。所以,我們能否更合理地配置登錄服資源,使得整個(gè)大區(qū)內(nèi)的登錄服可以共享就成了下一步改進(jìn)的目標(biāo)。
對(duì)于一個(gè)最簡(jiǎn)單的游戲服務(wù)器來(lái)說(shuō),它只需要能夠接受來(lái)自客戶端的連接請(qǐng)求,然后處理客戶端在游戲世界中的移動(dòng)及交互,也即游戲邏輯處理即可。如果我們把這兩項(xiàng)功能集成到一個(gè)服務(wù)進(jìn)程中,則最終的結(jié)構(gòu)很簡(jiǎn)單:
client ----- server
嗯,太簡(jiǎn)單了點(diǎn),這樣也敢叫服務(wù)器結(jié)構(gòu)?好吧,現(xiàn)在我們來(lái)往里面稍稍加點(diǎn)東西,讓它看起來(lái)更像是服務(wù)器結(jié)構(gòu)一些。
一般來(lái)說(shuō),我們?cè)诮尤胗螒蚍?wù)器的時(shí)候都會(huì)要提供一個(gè)帳號(hào)和密碼,驗(yàn)證通過(guò)后才能進(jìn)入。關(guān)于為什么要提供用戶名和密碼才能進(jìn)入的問(wèn)題我們這里不打算做過(guò)多討論,云風(fēng)曾對(duì)此也提出過(guò)類似的疑問(wèn),并給出了只用一個(gè)標(biāo)識(shí)串就能進(jìn)入的設(shè)想,有興趣的可以去看看他們的討論。但不管是采用何種方式進(jìn)入,照目前看來(lái)我們的服務(wù)器起碼得提供一個(gè)帳號(hào)驗(yàn)證的功能。
我們把觀察點(diǎn)先集中在一個(gè)大區(qū)內(nèi)。在大多數(shù)情況下,一個(gè)大區(qū)內(nèi)都會(huì)有多組游戲服,也就是多個(gè)游戲世界可供選擇。簡(jiǎn)單點(diǎn)來(lái)實(shí)現(xiàn),我們完全可以拋棄這個(gè)大區(qū)的概念,認(rèn)為一個(gè)大區(qū)也就是放在同一個(gè)機(jī)房的多臺(tái)服務(wù)器組,各服務(wù)器組間沒(méi)有什么關(guān)系。這樣,我們可為每組服務(wù)器單獨(dú)配備一臺(tái)登錄服。最后的結(jié)構(gòu)圖應(yīng)該像這樣:
loginServer gameServer
| /
| /
client
該結(jié)構(gòu)下的玩家操作流程為,先選擇大區(qū),再選擇大區(qū)下的某臺(tái)服務(wù)器,即某個(gè)游戲世界,點(diǎn)擊進(jìn)入后開(kāi)始帳號(hào)驗(yàn)證過(guò)程,驗(yàn)證成功則進(jìn)入了該游戲世界。但是,如果玩家想要切換游戲世界,他只能先退出當(dāng)前游戲世界,然后進(jìn)入新的游戲世界重新進(jìn)行帳號(hào)驗(yàn)證。
早期的游戲大都采用的是這種結(jié)構(gòu),有些游戲在實(shí)現(xiàn)時(shí)采用了一些技術(shù)手段使得在切換游戲服時(shí)不需要再次驗(yàn)證帳號(hào),但整體結(jié)構(gòu)還是未做改變。
該結(jié)構(gòu)存在一個(gè)服務(wù)器資源配置的問(wèn)題。因?yàn)榈卿浄幚淼倪壿嬒鄬?duì)來(lái)說(shuō)比較簡(jiǎn)單,就是將玩家提交的帳號(hào)和密碼送到數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證,和生成會(huì)話密鑰發(fā)送給游戲服和客戶端,操作完成后連接就會(huì)立即斷開(kāi),而且玩家在以后的游戲過(guò)程中不會(huì)再與登錄服打任何交道。這樣處理短連接的過(guò)程使得系統(tǒng)在大多數(shù)情況下都是比較空閑的,但是在某些時(shí)候,由于請(qǐng)求比較密集,比如開(kāi)新服的時(shí)候,登錄服的負(fù)載又會(huì)比較大,甚至?xí)幚聿贿^(guò)來(lái)。
另外在實(shí)際的游戲運(yùn)營(yíng)中,有些游戲世界很火爆,而有些游戲世界卻非常冷清,甚至沒(méi)有多少人玩的情況也是很常見(jiàn)的。所以,我們能否更合理地配置登錄服資源,使得整個(gè)大區(qū)內(nèi)的登錄服可以共享就成了下一步改進(jìn)的目標(biāo)。