前言
這里,我們將從香港游戲服務(wù)器發(fā)展的簡(jiǎn)單歷程出發(fā),鳥(niǎo)瞰一下目前大多數(shù)的香港游戲服務(wù)器架構(gòu)。
這里盡可能的避免陷入細(xì)節(jié)的技術(shù)問(wèn)題,而是從技術(shù)進(jìn)化的結(jié)果狀態(tài),反推原始問(wèn)題是什么。希望能通過(guò)這個(gè)過(guò)程,解釋清楚香港游戲服務(wù)器是在解決什么問(wèn)題,痛點(diǎn)到底在哪里。
一、早期網(wǎng)游服務(wù)器。
蠻荒時(shí)期的游戲服務(wù)器框架我們一筆帶過(guò),那時(shí)的游戲服務(wù)器和一個(gè)小Web服務(wù)沒(méi)有區(qū)別。
蠻荒時(shí)代的服務(wù)器只負(fù)責(zé)存儲(chǔ)玩家賬號(hào)、數(shù)據(jù)、轉(zhuǎn)發(fā)場(chǎng)景內(nèi)其他玩家的行為。很多移動(dòng)、使用技能等關(guān)鍵邏輯在服務(wù)器上根本沒(méi)有。隨意就能用變速齒輪改變游戲速度。
從《傳奇》的時(shí)代開(kāi)始,游戲服務(wù)器就不再是簡(jiǎn)單的上傳存檔、下載存檔、訪問(wèn)頁(yè)面而已。游戲服務(wù)器內(nèi)部出現(xiàn)了游戲邏輯,既能用于同步每個(gè)玩家看到的世界,又能讓邏輯與客戶端分離,避免早期的網(wǎng)絡(luò)游戲那種毫無(wú)防范的邏輯體系(對(duì)外掛防御能力為0)。
如圖,客戶端通過(guò)某種形式驗(yàn)證登陸以后,就和服務(wù)器通過(guò)TCP直接相連了。這種服務(wù)器的承載能力不高,但那時(shí)在游戲邏輯上也務(wù)求簡(jiǎn)化,把負(fù)載減少到極致。
· 例如:1、玩家看不到怪物的血量,或者只能看到正在打的怪物的血量。2、地圖有格子的概念,每個(gè)格子只能有一個(gè)單位,極大限制了同屏人數(shù)。
由于邏輯盡量簡(jiǎn)化,雖然這時(shí)的服務(wù)器邏輯服務(wù)都是單進(jìn)程單線程的,但是也足夠表現(xiàn)交互的感受。
這種架構(gòu)奇怪的地方是處理網(wǎng)絡(luò)連接數(shù)據(jù)傳輸?shù)膲毫瓦壿嬏幚淼膲毫υ谕粋€(gè)服務(wù)器上(存儲(chǔ)模塊可能也在同一個(gè)進(jìn)程),就算邏輯處理壓力為0,承載人數(shù)也高不到哪去。
雖然這時(shí)的游戲服務(wù)器設(shè)計(jì)很簡(jiǎn)陋,但是網(wǎng)游第一次給了玩家真實(shí)世界的感受。單服人數(shù)不足的問(wèn)題可以靠開(kāi)多組服務(wù)器實(shí)現(xiàn),所以曾經(jīng)出現(xiàn)了幾百上千組服務(wù)器的輝煌時(shí)代。
二、早期游戲服務(wù)器的改進(jìn)版本
當(dāng)開(kāi)發(fā)者們有了初步經(jīng)驗(yàn)以后,新作品的開(kāi)發(fā),自然而然的過(guò)渡到了如下的形式:
游戲邏輯服務(wù)依然是在一臺(tái)服務(wù)器上,單進(jìn)程(邏輯處理本身肯定是在一個(gè)線程中,可以有子線程負(fù)責(zé)內(nèi)網(wǎng)通信)。但是我們自然的想到,存儲(chǔ)負(fù)載和網(wǎng)絡(luò)連接負(fù)載可以從邏輯服上拆出來(lái)。
連接服務(wù)器負(fù)責(zé)把客戶端和服務(wù)器之間的消息轉(zhuǎn)化為服務(wù)器之間的消息,可以順便做一些加解密的工作。
這一點(diǎn)小改動(dòng)極大提高了單服連接人數(shù)的上限。但是玩家要求提高了,空出來(lái)的性能很快被豐富的游戲系統(tǒng)吃掉了。
由于連接服務(wù)器本身沒(méi)有時(shí)序性,很容易做分布式的(其實(shí)大部分游戲還是只用一個(gè)連接服),存儲(chǔ)服務(wù)不要求高實(shí)時(shí)性,高峰期存盤(pán)間隔可以稍長(zhǎng)一些,不會(huì)對(duì)游戲服造成影響。
三、成熟形態(tài)的服務(wù)器框架
邏輯服務(wù)器的負(fù)載均攤方法一:按照功能劃分多個(gè)服務(wù)器進(jìn)程
邏輯服務(wù)器的負(fù)載均攤方法二:按照?qǐng)鼍皠澐侄鄠€(gè)服務(wù)器進(jìn)程
對(duì)游戲服務(wù)器歷史有了基本了解后,成熟形態(tài)的游戲服務(wù)器很容易理解。簡(jiǎn)單來(lái)說(shuō),就是把邏輯服務(wù)器單個(gè)進(jìn)程的壓力分?jǐn)偟蕉鄠€(gè)服務(wù)器。
難點(diǎn)在邏輯的設(shè)計(jì)上,要像做手術(shù)一樣把本來(lái)是一體的功能切開(kāi),并抽象出若干個(gè)API來(lái)保持聯(lián)系(服務(wù)器之間是TCP連接)。
在分解時(shí),要找聯(lián)系相對(duì)最薄弱的環(huán)節(jié)入手,比如場(chǎng)景和場(chǎng)景之間分開(kāi)、單獨(dú)抽出聊天服務(wù)、組隊(duì)服務(wù)、好友服務(wù)。
無(wú)論如何分解,最終結(jié)果只能是有限個(gè)服務(wù)。而且分解的越細(xì),開(kāi)發(fā)難度就越大。因?yàn)榭绶?wù)器邏輯是把簡(jiǎn)單的同步邏輯變成了異步Callback邏輯,而且容易出現(xiàn)時(shí)序問(wèn)題等不易測(cè)試的問(wèn)題。
單個(gè)場(chǎng)景服務(wù)幾乎是無(wú)法分解的。分解單個(gè)場(chǎng)景難度巨大以至于出現(xiàn)了BigWorld引擎來(lái)專門(mén)的解決場(chǎng)景分割問(wèn)題,后面會(huì)談到。
這種成熟形態(tài)的游戲服務(wù)器已經(jīng)能滿足現(xiàn)實(shí)中99%的頻繁交互類網(wǎng)游需求,是大型MMO端游、頁(yè)游的主流形式。
當(dāng)然有實(shí)力的公司在這個(gè)基礎(chǔ)上會(huì)做很多改動(dòng),實(shí)現(xiàn)動(dòng)態(tài)開(kāi)辟副本、相位技術(shù)等等,但是萬(wàn)變不離其宗,其本質(zhì)和上圖沒(méi)有什么區(qū)別。