2013-09-21 40 views
1

我正在開發java(SE)+一些開源庫中的服務器應用程序。這是一款遊戲,所以我認爲它有時需要更新。只要應用程序正在跟蹤客戶端的狀態,使用它,並且還支持客戶端會話(以專用線程的形式)以及存儲對這些播放器實例的引用的單例,我想重新加載JVM進程(例如,安裝一個新版本的jar文件),以便某些類和實例不會被GC刪除,但會啓動進入新流程。重新加載JVM進程保留Session

可能的情況:

我有一個遊戲版本1.0的服務器上運行。我需要在1.2中添加一些新功能。但是有100名選手正在互相爭鬥。我需要安裝1.2版本,玩家可能會感覺有些滯後,但即使jar版本發生了變化,他們也應該能夠繼續戰鬥。

如何做到這一點?

回答

1

你可以看的東西像OSGi和類加載技巧,看看你能達到你所需要的,但也許有一種更簡單的方法,它也更安全一些。

您可以在簡單負載均衡器後面運行2臺服務器,並且當您需要執行此類維護時,您只需將所有新遊戲路由到服務器A.當服務器B上的所有遊戲完成時(並且沒有新的遊戲已經開始,因爲所有服務器都要發往服務器A),您停止服務器B並且做任何需要與任何測試一起進行的維護操作,以便在將其引入回到之前驗證一切正常'集羣'。

然後,你做同樣的事情,並將新遊戲路由到服務器B,這樣當服務器A上的所有遊戲都完成時,您也可以將其關閉並進行維護。

您將需要開發這種簡單的負載均衡器,它只是充當連接路由器,但知道您的遊戲會話。也許你還需要在每個服務器實例之間有一些信息同步(如果需要在線溝通列表,聊天消息等,取決於你有什麼功能)。

1

首先要注意的是,您當前的遊戲狀態可能與新版本不一致。所以不是所有的修改都可以像這樣安裝。您可以使用具有主/從配置的遠程緩存系統。因此,所有會話都存儲在遠程計算機上,並且一臺服務器停止運行時,第二臺服務器可以繼續使用相同的狀態。首先你放下奴隸,更新它並開始。然後切換角色並放下第二臺服務器進行更新。

相關問題