网游服务器架构变迁
一、早期網(wǎng)游服務(wù)器
網(wǎng)游剛出現(xiàn)的時(shí)候,游戲服務(wù)器和小Web服務(wù)器沒(méi)有區(qū)別。
從《傳奇》的時(shí)代開(kāi)始,游戲服務(wù)器內(nèi)部就出現(xiàn)了游戲邏輯,既能用于同步每個(gè)玩家看到的世界,又能讓邏輯與客戶(hù)端分離,避免早期的網(wǎng)絡(luò)游戲那種毫無(wú)防范的邏輯體系(對(duì)外掛防御能力為0)。
二、早期游戲服務(wù)器的改進(jìn)版本
游戲邏輯服務(wù)依舊是在一臺(tái)服務(wù)器上,單進(jìn)程(邏輯處理本身肯定是在一個(gè)線程中,可以有子線程負(fù)責(zé)內(nèi)網(wǎng)通信)。但是我們自然地想到,儲(chǔ)存負(fù)載和網(wǎng)絡(luò)負(fù)載可以從邏輯服務(wù)器上拆出來(lái)。連接服務(wù)器負(fù)責(zé)把客戶(hù)端和服務(wù)器之間的消息轉(zhuǎn)化為服務(wù)器的消息,可以順便做一下加密的工作。
由于連接服務(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)程
這種服務(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ù)器邏輯時(shí)把簡(jiǎn)單的同步邏輯編程異步Callback邏輯,而且容易出現(xiàn)時(shí)序問(wèn)題等不易測(cè)試的問(wèn)題。單個(gè)場(chǎng)景在服務(wù)幾乎是無(wú)法分解的。分解單個(gè)場(chǎng)景難度巨大以至于出現(xiàn)BigWorld引擎來(lái)專(zhuān)門(mén)解決場(chǎng)景分隔問(wèn)題。附:開(kāi)房間式的網(wǎng)絡(luò)游戲
開(kāi)房間式的網(wǎng)絡(luò)游戲是游戲的重要分支,moba和卡牌類(lèi)游戲都屬于這種形式。 這些游戲房間內(nèi)幾乎沒(méi)有交互,只有大廳內(nèi)有交互,可以理解為原始形態(tài)的游戲服務(wù)器的平行拓展。 房間式游戲擴(kuò)展難度較小,只是需要根據(jù)玩家數(shù)量動(dòng)態(tài)擴(kuò)展游戲房間的數(shù)量、服務(wù)數(shù)量。很像網(wǎng)站的架構(gòu)。小結(jié):游戲服務(wù)器框架特點(diǎn)
1.真正的數(shù)據(jù)都在內(nèi)存中,數(shù)據(jù)庫(kù)性能不那么重要(注:很多大型游戲采用了共享內(nèi)存,避免宕機(jī)時(shí)損失過(guò)大)
四、先進(jìn)服務(wù)器框架
? BigWorld
BigWorld的核心理念時(shí)場(chǎng)景分割,利用平面切分的原理,將場(chǎng)景劃分為小塊,不同的塊可以運(yùn)行在不同的服務(wù)器上。而且塊的劃分是動(dòng)態(tài)的,根據(jù)玩家密度程度,數(shù)量動(dòng)態(tài)調(diào)整動(dòng)態(tài)整塊的大小。
具體技術(shù)上,使用了Actor模型,要求每個(gè)對(duì)象都是獨(dú)立的Entity,對(duì)象之間只能通過(guò)消息協(xié)作,嚴(yán)格限制對(duì)象之間的直接交互。
? Skynet
Skynet是新興的一種通用型服務(wù)器框架(完全開(kāi)源),它游走在傳統(tǒng)不易分布服務(wù)器和分布式服務(wù)器之間。
? 以Go語(yǔ)言為主的其他框架
Go語(yǔ)言的goroutine特性,給游戲開(kāi)發(fā)者帶來(lái)巨大的想象空間。
戲服務(wù)器特征
游戲服務(wù)器端,是一個(gè)會(huì)長(zhǎng)期運(yùn)行的程序,并且它還要服務(wù)于多個(gè)不定時(shí)、不定點(diǎn)的網(wǎng)絡(luò)請(qǐng)求。
所以這類(lèi)軟件的特點(diǎn)是要非常關(guān)注 穩(wěn)定性和 性能。這類(lèi)程序如果需要多個(gè)協(xié)作來(lái)提高承載能力,則還要關(guān)注部署和擴(kuò)容的便利性;同時(shí),還需要考慮如何實(shí)現(xiàn)某種程度的容災(zāi)需求。由于多進(jìn)程協(xié)同工作,也帶來(lái)了開(kāi)發(fā)的復(fù)雜度,這也是需要關(guān)注的問(wèn)題。
游戲服務(wù)器架構(gòu)要素
對(duì)于游戲服務(wù)端架構(gòu),最重要的三個(gè)部分就是,如何使用 CPU、內(nèi)存、網(wǎng)卡的設(shè)計(jì):
? 內(nèi)存架構(gòu):主要決定服務(wù)器如何使用內(nèi)存,以最大化利用服務(wù)器端內(nèi)存來(lái)提高承載量,降低服務(wù)延遲。
? 邏輯架構(gòu):設(shè)計(jì)如何使用進(jìn)程、線程、協(xié)程這些對(duì)于 CPU 調(diào)度的方案。選擇同步、異步等不同的編程模型,以提高服務(wù)器的穩(wěn)定性和承載量??梢苑謪^(qū)分服,也可以采用世界服的方式,將相同功能模塊劃分到不同的服務(wù)器來(lái)處理。
? 通信模式:決定使用何種方式通訊。基于游戲類(lèi)型不同采用不同的通信模式,比如 http,tcp,udp 等。
服務(wù)器基于游戲類(lèi)型不同,所采用的架構(gòu)也有所不同,我們先講一下簡(jiǎn)單的模型,采用 HTTP 通信模式架構(gòu)的服務(wù)器:
服務(wù)器的三種類(lèi)型功能:
場(chǎng)景服務(wù)器:它負(fù)責(zé)完成主要的游戲邏輯,這些邏輯包括角色在游戲場(chǎng)景中的進(jìn)入與退出、角色的行走與跑動(dòng)、角色戰(zhàn)斗(包括打怪)、任務(wù)的認(rèn)領(lǐng)等。場(chǎng)景服務(wù)器設(shè)計(jì)的好壞是整個(gè)游戲世界服務(wù)器性能差異的主要體現(xiàn),它的設(shè)計(jì)難度不僅僅在于通信模型方面,更主要的是整個(gè)服務(wù)器的體系架構(gòu)和同步機(jī)制的設(shè)計(jì)。
結(jié)語(yǔ)
游戲服務(wù)開(kāi)發(fā)需要應(yīng)對(duì)高并發(fā),低時(shí)延的業(yè)務(wù)場(chǎng)景,必須要懂得正確地分拆各個(gè)模塊。
總結(jié)
- 上一篇: 读《卓有成效的管理者》笔记
- 下一篇: 5G NR协议学习--TS38.211主