本文描述了一個我所設計的游戲服務器體系結構,其目的是實現游戲服務器的動態負載平衡,將對象從繁忙的服務器轉移到相對空閑的服務器中.設計并沒有經過具體的測試與驗證,僅僅是將自己目前的一些想法記錄下來.隨著新構思的出現,可能會有所變化.
以下是服務器的邏輯視圖,其中忽略了管理和監控模塊
--------------------------------------------------------
|邏輯服務|碰撞服務|AOI服務|dateserver|AI|尋路|交易服務|
--------------------------------------------------------
??? /\????? /\??????? /\????? /\????? /\? /\???? /\
??? ||????? ||??????? ||????? ||????? ||? ||???? ||
??? \/????? \/??????? \/????? \/????? \/? \/???? \/
---------------------------------------------------------
????????????????? 消息轉發層
---------------------------------------------------------
???????????????????????? /\
???????????????????????? ||
???????????????????????? \/
?????????????????????? ------
?????????????????????? |gate|
?????????????????????? ------
???????????????????????? /\
???????????????????????? ||
???????????????????????? \/
????????????????????? --------
????????????????????? |client|
????????????????????? --------
具體實現中消息轉發層可作為單獨的一組服務運行,也可以作為單獨的服務器
進程中的單獨一層.
目前在我的設計方案中,將其作為進程中的一個服務層實現.
--------------
|? 應用層??? |
-----------
|數據轉發層| |
-----------
|? 網絡層??? |
--------------
各層說明
應用層: 具體應用,例如游戲邏輯,AI,等.
數據轉發層:處理消息的路由,將消息投遞到正確的套接口發送隊列中.
網絡層:收發數據.同時支持TCP,UDP等協議.
當接收消息時,無須通過第二層,從網絡層直接將接收到的完整消息投遞到
應用層中.
發送消息時,從應用層將消息傳進數據轉發層,并且指定消息通知方式(例如通
過TCP將消息傳遞到某一臺服務器,還是通過udp方式將消息廣播出去),由轉發層將消息投遞到正確的套接口中.
基本消息流如下:
1)客戶端發起操作
2)AOI服務,AOI處理的主要是對象的位置信息,以及各對象所關注的其它對象.
以下舉例說明幾種處理:
對于行走,AOI計算出能觀察到此玩家的所有對象然后將這些信息一起打包,轉到3.
對于攻擊行為,AOI計算出此攻擊將影響的對象和可以觀察到此次攻擊的對象,然后將信息打包,轉發到3.
對于僅僅影響自己屬性的消息,例如喝血,如果有對象關注你,例如組隊.則將關注你對象打包,轉發到4.
3)碰撞和校驗,根據地圖信息,校驗操作的合法性,并進一步計算操作所影響對的象.例如對于行走,在沒有詳細地圖信息的AOI中,無法知道玩家之間是否隔了一堵墻,在碰撞和校驗中,將把墻另一面的所有對象從可觀察對象中去除.當通過校驗后,對于行走消息,將玩家的新坐標通知給所有可以觀察到的對象,并更新AOI在的玩家坐標.如果是攻擊動作,則把所有信息打包,并送往4.
4)邏輯處理.將處理結果通知關注的對象.
對于跨服數據的處理
服務器的設計實現了動態負載平衡,和無縫大地圖,以使得在一臺服務器上的對象,可以觀察到并影響另一臺服務器上對象的變化.以下說明跨服攻擊,
假設A,與B分別處理兩臺不同的邏輯服務器SA,SB上.A向B發動進攻,并且已經通過了校驗.當B進入A可觀察范圍內的時候,SB會獲得一份A的基本數據的副本,對于這份副本在SB上是只讀的.SB計算出此次攻擊對A的影響,例如血減少多少,然后將對A的數據更改要求發送到SA.SA實際修改A的數據,并將更新廣播出去,所有關注A的服務器都會處理這個更新信息,并做出合適的處理.
對于玩家間的物品交易,買賣,贈送等操作,都將交由交易服務器處理,以實現跨服的交易.
以上僅僅是概要說明,一些詳細的設計將會在后續的文章中討論.