天天看點

SGS系列 --SUN 開源遊戲伺服器端項目 Darkstar

Sun game server , 簡稱 (sgs) 是 sun 公司的一個開源項目 , 主要目标是針對 mmo 遊戲的伺服器端開發.

SGS 提供的主要功能 :

l 伺服器端的擴充 : 傳統的擴充方法是将整個遊戲區域分成多個區 , 不同的區運作在不同的遊戲伺服器上 . 這帶來兩個問題 , 一個是處于不同區的玩家不能互互相動 , 另外一個是如果某個區發生的動作較少時 , 會出現伺服器資源未被充分利用的情況 . 而在 sgs 的處理方式下 , 所有的處理被分割成為一個個小的執行單元 ( 稱為 task), 這些 task 可以在組成網絡的任何 sgs 伺服器上執行 , 當使用者增加時 , 系統自動增加處理線程 , 不再需要為了擴充而将不同的區配置設定到不同的伺服器上面 . 這樣既提高了資源使用率 , 又可以讓所有的玩家進行互動 .

l 資料完整性 : sgs 提供了一個分布式的資料存儲 , 一個 task 需要通路資料時 , 通過資料存儲 api 進行通路 , 資料通路具有事務支援 , 當兩個 task 發生沖突時 ,sgs 會自動協調 , 較年輕的 task 重新排程等待執行 , 而年老的 task 将會執行并直到結束 . 目前版本中的 sgs 資料存儲未使用關系資料庫 , 而是使用了 berkeley db. 任何 java 對象 , 隻要實作了 ManagedObject 标志接口 和 Serializable 接口後即可自動透明存儲 .(sgs 的存儲機制好像是可擴充的 ,論壇上已經看到有人在讨論 mysql 的存儲插件 )

l 簡單的程式設計模型 : 從應用開發的角度來看 ,sgs 提供了 api 屏蔽了多數的底層複雜性 , 例如線程排程 , 事務處理 , 等等, 應用程式隻需要開發并裝配自己的對象 , 監聽響應用戶端事件 , 自己管理持久化的 ManagedObject 對象生命周期即可 .

l 兩種通信模型 : 一種是 client/server 的通信 , 即每個 client 隻和 server 通信 , 由 server 來負責資料的處理和轉發 .另外一種是 channel 機制 ( 類似一對多的廣播 ),channel 由 server 建立并維護 , 每個 channel 可以添加多個client,server 可以監聽 channel 中的所有通信或者具體某個 client 的通信 . 也可以給 channel 中的全部或者部分client 發送消息 . 加入 channel 的 client 可以收到其它任何 client 發送的消息 .channel 下面 client 之間的通信不需要 server 端的介入 . 由于所有通信的資料格式都是位元組數組 , 是以應用程式需要開發自己的應用層協定 .

l 可擴充的機制 : sgs 應用程式通路資料 , 使用 channel, 建立 task 都是通過 “Manager” 來進行的 . 目前一共有三種預設的 “Manager” ,DataManager,ChannelManager,Taskmanager. 但可以擴充開發自己的 Manager, 例如在 sgs 中要求 task 應該是盡量快的執行 (task 允許執行的時間上限可以配置 ) , 是以如果出現調用可能導緻阻塞的系統方法時 , 就需要開發一個擴充的 Manager.

SGS(Sun Game Server Technology)是Sun公司的遊戲伺服器技術,這個白皮書的内容是一個技術簡介,于2004年6月份釋出。(原文位址:http://www.sun.com/solutions/documents/white-papers/me_sungameserver.pdf)

目錄

1、内容概覽

2、主要面向的開發人員

3、主要面向的應用程式

4、設計要點

5、遊戲伺服器架構

5.1 傳統大型多使用者遊戲架構

5.2 無盡請求和行業現狀

5.3 現存大型多使用者遊戲解決方案的問題

6、SGS技術

6.1 SGS架構

6.2 SGS技術的優點

7、結論

7.1 對于遊戲開發者

7.2 對于遊戲實施人員

8、擷取更多資訊

正文

1、内容概覽

Sun公司正在開發新的技術來滿足低延時、高帶寬、容錯的、高可擴充性的仿真服務。即使是設計用于大型多使用者的網絡遊戲的意圖,這種技術也可以适用于任何對上述方面(低延時、高帶寬、容錯的、高可擴充性)有要求的地方。
           

2、主要面向的開發人員

使用這個仿真服務系統的主要人員應該是遊戲開發者。與傳統的java軟體開發人員相比,遊戲開發者通常有完全不同的一些列需要、技術和認知。
           

I.無線程知識。遊戲開發者的世界是單線程、獨立的、基于時間的仿真。是以,SGS技術不要求任何關于線程和線程相關問題的知識就能開發部署仿真程式。

II.無資料庫知識。遊戲開發者隻是在一個賦予他們的"級"的開始加載所有他們需要的資料。(一級是玩家的持續性互動的一個單元。)他們沒有處理事務、死鎖、查詢優化、或者其它超大數量的複雜資料庫事務,而這些問題通常是企業開發人員要面對的。是以,對于這個系統很重要的一點是讓所有的資料庫互動對他們百分之百的透明。

III.極少的可擴充性系統架構經驗。今天遊戲界的擴充性解決方案仍然很原始、簡單。一般來講,玩家被分成各個小組,隻有組内的成員才能互相互動。這些組的擴充性仍然被限制了,導緻一個結果就是開發主觀生硬地限制了可以一起互動的玩家的數量。這種限制性的程式設計方式限制了遊戲的種類和可以進行的遊戲操作。

SGS的一個優勢就在于它從上述限制中釋放了遊戲開發人員的空間,使得遊戲設計更具有靈活性和創造性。而要這樣做,就必須消除那些限制性的手段,使得一切對于玩家都更透明。

3、主要面向的應用程式

遊戲被屬于近乎實時仿真軟體的範圍,是以有一些非常嚴格的性能要求。Sun公司的目标是支援大型多使用者網遊并滿足極限的可擴充性和延時要求。要想成功,支援大型多使用者網遊必須滿足以下挑戰:

I.非常低的延時。在背景所有活動的總的延時,而非僅僅程式員的遊戲代碼的延時,在每一次互動時必須控制在幾十毫秒的級别。

II.允許從幾百到幾萬使用者同時互動的擴充性。這個系統不但要能處理10000名以上玩家的同時互動,并且還要很經濟地處理幾百名玩家的同時互動。由于不同的遊戲顯然會有不同的速度增長曲線,必須有一種經濟的方式滿足玩家同時互動人數從一個小的數量向一個巨大的數量或快或慢地變化的要求。

4、設計要點

由開發特征決定的這些目标直接關系到SGS技術的設計要點。

I.簡單應用模式。應用程式隻有一個"世界",裡面是一系列的仿真對象。這些對象有各自的方法,方法被調用就可以執行相應的動作。

II.自動執行模式。仿真對象在如下情況下被調用:事件驅動、驗證步驟、驗證死鎖、容錯方式。對象争奪和錯誤處理的所有問題都會被這個模式處理并且都對仿真對象的編碼透明。

III.持續透明存在模式。目前得到的仿真對象的所有細節,包括執行、完成調用、儲存結果都被這個模式所處理。遊戲的每個動作在完成期間都是持續存在的。

IV.透明極大可擴充模式。仿真對象的執行是透明的一個伸展,它們放在一個線性可擴充數組中由互相獨立的程序控制,每個程序有獨立的記憶體空間——程序的數量可以很少也可以是個極大數。

5、遊戲伺服器架構

5.1 傳統大型多使用者遊戲架構

隻有熟悉以前的狀況,才能更好的了解SGS技術。那些對現存的傳統大型多使用者遊戲架構熟悉的人可以跳過這一段。
           

5.2 無盡請求和行業現狀

今天的大型多使用者遊戲一般設計為有成千上萬的同時線上的玩家,需要一個中央伺服器環境,而遊戲的運算則由一個分布式的主機群來多重處理。這些遊戲,最多的部分,是基于一個無盡通路請求的軟體架構。遊戲被顯式地分成不同區域,每個區在它自己的伺服器上跑它自己的服務,管理它自己的記憶體空間狀态。

玩家要想登陸遊戲必須先連接配接到一個登陸伺服器。一旦登陸完成之後,用戶端就被連接配接到其中一個區的伺服器,而從登入伺服器斷開。如果是個新玩家,他可以選擇一個開始遊戲的伺服器,而老玩家則要登入到他之前已經標明了的那個伺服器。當玩家從一個區到另一個區的時候,他們的目前連接配接就斷開了,必須重新連接配接到新的區。
           

5.3 現存大型多使用者遊戲解決方案的問題

I.可擴充性限制

區域中仍然有人數限制,在同一時間線上的玩家數量有一個上限。當線上玩家數達到上限之後,那麼除非有玩家離開,否則不能再有玩家進入遊戲了。這就在這種模式可以支援的玩家數量上面加了一個絕對上限。

 索尼公司解決這個問題的辦法是繼續大量細分整個服務系統。(索尼把每一個細分稱為一個碎片,碎片已經成為行業内細分型MMP【massively multiplayer,大型多使用者】遊戲界所熟知的一個詞語了。)然而,問題在于解決擴充性就成了基于細分使用者數量了,先分成區,然後再細分成碎片。這樣做不但增加了使用者的成本,而且使得每個碎片内的線上使用者數被更加嚴格地限制了。更進一步,在一個滿員的碎片中的玩家不可能帶動他的朋友來玩,因為他們根本無法在一起遊戲。
           

II.低容錯

碎片模式的容錯性并不好。如果這個碎片的伺服器當機了,那麼玩家就掉線了,直到機器重新開機。而如果這個區的伺服器當機了,那麼整個區的玩家都隻能坐等伺服器恢複正常。
           

III.低效的程序處理

分區模式隻有當人們的線上數量曲線自然呈現為高斯分布的時候才可以完美地均衡負載。不幸的是,事實顯然不是如此。我們是社會動物,而社會動物是抱團的。

結果就是經常有機器程序處于閑置狀态的同時,少數伺服器超負荷運轉。更進一步,加載特定的區的程序可以使機器從零負載一下到滿負荷,是以你不可以把多個伺服器的程序放到一個中心CPU上。每一個程序都必須可以在任何時間實作滿負荷運轉。這樣就造成了大量處理器浪費。
           

IV,持續性限制

一般來講,從硬碟提取出來加載到記憶體中的影像應該隻是玩家目前狀态所需的。分區模式是以是高度靜止的;它們不能改變幾何形狀因為要随時重新加載原來的幾何形狀以備不時之需(任何時間的錯誤)。一個分區的物體目錄(目錄是指那些玩家或BOSS掉落的物品,以及地上的屍體)在伺服器重新開機程序時都會消失。怪物作為一個分區程序中遊戲運作的一部分又複活了,一切又重新開始了。

而遊戲玩家的狀态在伺服器癱瘓的時候一般會損失15分鐘左右,因為系統備份的時候隻會停下來儲存備份時刻的狀态。更嚴重的情況下,為了修複角色的錯誤需要24小時以上時間。
           

6、SGS技術

SGS技術從根本上改變了開發大型多使用者遊戲的狀況。它解決了所有擴充性、容錯性遊戲内容持續性等方面的問題,展現給開發人員的是獨立的、事件驅動的、單線程的程式設計環境。使用了SGS環境運作的遊戲,自動地擴充到多個處理器上,自動保持遊戲内容并容錯。
           

6.1SGS架構

SGS技術在邏輯上垂直分為三層:通信層、仿真邏輯層和對象存儲層。
           

I.對象存儲層包括所有目前在遊戲伺服器上運作的全部遊戲的所有狀态。它是一個非常高效(每個操作僅需十分之幾毫秒)、可擴充的、容錯的,容錯包括對于交易資料庫層對仿真對象的死鎖能夠驗證,有可能是一個寫入的鎖,也可能是不可重複的查詢(相同的語句但資訊已改變)。

II.仿真邏輯層的職責是執行實際的遊戲代碼。在這一層許多事件依次輪流地核查對象存儲層的對象是否有需要,進而觸發任務建立。當一個任務完成後,這個對象被更新并被傳回到對象存儲層。

III.通信層組織所有玩家的通信過程,把他們放到成組的通信器的信道中去。它負責管理資料包和仿真邏輯之間、玩家們之間的路由。它也負責網絡上各種通信協定的轉換翻譯(例如通過HTTP協定收發電話語音)。

SGS系列 --SUN 開源遊戲伺服器端項目 Darkstar

6.2 SGS技術的優點

I.極緻的擴充性

通過使用一個高效的,可擴充的普通對象存儲倉庫來存儲遊戲資料,SGS技術消除了劃分遊戲區域的邊界,放棄了細分遊戲的分區和碎片。遊戲可以以一種獨立、統一、完全合乎邏輯的環境建立,可以支援成千上萬名玩家同時線上。開發人員可以持續地修改、擴充遊戲内容,同時部署人員能夠迅速地擴充伺服器數量來滿足增長的需求,而這些都不會影響到線上使用者的遊戲程序。
           

II.高容錯性

當一個仿真邏輯伺服器或通信伺服器當機的時候,遊戲的事件和玩家到遊戲的聯線會被自動地重新配置設定到其它伺服器上,消除了一般情況下一旦登入伺服器和區域伺服器錯誤就會産生的當機時間。這種當機時間是目前遊戲伺服器存在的客戶普遍抱怨的固定問題。
           

III,最大的處理器效率

由于負載的配置設定是基于玩家的活動而不是分區,SGS技術可以自動實作負載均衡,并且不單隻一個遊戲,隻要基于一個資料中心即便是多個遊戲也可以。這一點徹底地減少了多餘的、後備的、空閑的伺服器資源的消耗。
           

IV.完整的持續性

通過SGS技術,所有的對象——不隻是玩家狀态——都有可靠的持續性。這給開發人員提供了極大的靈活性來創造高動态的環境,還能消除玩家遇到瞬間發生的伺服器錯誤和實施錯誤而産生的郁悶。使得玩家滿意度和客戶忠誠度提高。
           

7、總結

7.1 對于遊戲開發者

SGS技術給大型多使用者遊戲的開發者提供了一個徹底簡化的開發模型。同時,它提供了強度類似于JAVA企業級産品的容錯性和擴充性。通過使用這個遊戲伺服器,遊戲開發者被從伺服器端的所有困擾人的問題中解放出來,可以去做他/她最擅長的東西——編寫偉大的遊戲邏輯。

7.2 對于遊戲實施人員

SGS技術可以安全地支援同時跑多個不同的遊戲邏輯。這個架構可以自動實作同時運作一個遊戲或多個遊戲的負載均衡。這給遊戲中心帶來極大的CPU效率,尤其是當多款遊戲由一個服務供應商營運時。

所有遊戲公用一個仿真後端,這個後端包括共享的管理需求,是以可以由一個管理團隊來負責所有的遊戲。JAVA技術開發标準保證了遊戲邏輯很安全地被包含其中而不會影響網絡環境的其他部分。由于支援實施人員在未來于目前後端部署新的遊戲,它也保護了投資利益。
           

8、擷取更多資訊

如果你對了解更多這項技術的内容感興趣,或打算把它應用于你的網絡遊戲開發計劃,請通過這個郵箱位址聯系我們:[email protected]。