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