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